乙個簡單點亮LED燈的字元裝置驅動

2021-08-28 04:12:28 字數 2031 閱讀 3066

後面可能會寫一系列的驅動學習的文章,現在就以乙個最簡單的字元裝置驅動開始。我的這個字元裝置主要是為了點亮開發板的led燈。

對於字元裝置的文章,網上很多而且也比較簡單,所以這篇文章只適合剛學的小白,大神請繞道。

先把**貼出來再把重點講一下吧

字元裝置驅動程式:

#include #include #include #include #include #include #include #include #include #include static int major;

static struct class *first_class;

static struct class_device *first_class_dev;

volatile unsigned long *gpfcon = null;

volatile unsigned long *gpfdat = null;

static int first_drv_open(struct inode *inode, struct file *file)

static ssize_t first_drv_write(struct file *file, const __user *buf, size_t count, loff_t *ppos)

else

return 0;

}/*下面的結構體就是為了和核心聯絡起來*/

static struct file_operations first_drv_fops = ;

int first_drv_init(void)

void first_drv_exit(void)

module_init(first_drv_init);

module_exit(first_drv_exit);

module_license("gpl");

(1)每個驅動程式載入到核心時,都會先執行module_init函式,這個函式其實是個巨集定義(module_init的含義),最終執行的是module_init括號裡面定義的first_drv_init函式。自然,解除安裝函式就會執行module_exit函式。

(2)register_chrdev()函式用於註冊字元裝置。當第乙個引數為0時,系統會自動分配主裝置號。我們也看到第三個引數是first_drv_fops結構體,這能將使用者空間的open()、write()和first_drv_open()、first_drv_write()函式聯絡起來。在解除安裝驅動的時候,我們也要呼叫相應的解除安裝字元裝置的函式unregister_chrdev()。

(3)呼叫class_create()函式後,系統會建立乙個類:/sys/class/firstdrv。再呼叫class_device_create()函式就會自動在/dev/目錄下建立對應的裝置節點:/dev/xyz。當然,在解除安裝驅動也有相應的解除安裝函式:class_device_unregister()和class_destroy()。

(4)我們以前寫裸板程式的時候,操作gpio暫存器的時候,都是直接寫實體地址,但是這裡我們不能這麼做。需要通過ioremap()函式將物理位址對映為虛擬位址。在解除安裝驅動後,我們也要呼叫iounmap()函式釋放本次對映。

到這裡,乙個粗糙的字元裝置程式就完成了,為了**的閱讀,我就沒有考慮很多函式呼叫失敗後的情況了,實際生產中肯定不能這麼做。下面就看一下使用者空間的程式怎麼使用字元裝置節點了。

測試函式:

#include #include #include #include int main(int argc, char **argv)

if (argc != 2)

if (!strcmp(argv[1], "on"))

else

write(fd, &val, 4);

return 1;

}

當呼叫open()函式成功開啟建立的節點後(核心空間中,會呼叫我們的驅動程式中的first_drv_open()函式),如果我們往節點寫1,核心空間中的first_drv_write()函式就會通過copy_from_user()獲取到這個值,然後再判斷是點亮還是滅燈。

點亮乙個LED燈

設計定義 二選一多路器 兩個輸入io,a b。可以是高電平,輸入按鍵按下時,led燈與a埠狀態保持一致,按鍵釋放時,led燈與b埠狀態保持一致 設計輸入 建立乙個project 編寫功能 input a 輸入埠a,b input b input key in 按鍵輸入,實現輸入通道的選擇 outpu...

第乙個程式點亮乙個LED燈

include 引用52包檔案 可以理解為命名空間 sbit p1 0 p1 0 定義p1管腳0 void main 主程式 c語言所必需要有的 以下非程式 上面的程式,首先引用reg52.h,這裡有對操作微控制器相關資料的封裝,方便使用者使用 接著,用p1 0這個sbit型別的變數,引用p1口的第...

點亮led燈的個數 LED燈的點亮電流一般是多少

幸福的小貓zz 正常說,9 15w就行了。小於6w亮度不夠。此外,還要看看用於哪,照射面積多大?papapaopao led照明電路通常都沒有保險設計,何況裝飾燈珠工作電流不大,這種規格的保險也很難找。沙沙小小囡 推薦一般情況下,民用電壓實際要比220v略低一些。好比你買個標識為4g的優盤,實際只有...