工作需要,開始學習驅動開發。從課本上學習到的第一個簡單的驅動開發及調試,記錄如下。
建立源文件chardev.c,文件內容如下:
Makefile如下:
直接make,得到chardev.ko。
然後可以用insmod和rmmod轉載和卸載該驅動。
運行insmod chardev.ko,然後我們cat /proc/devices查看設備信息,可以看到以下信息:
這裡數字250對應代碼中的MAJOR_NUM值,在insmod後如果看不到對應的信息(如250 chardev),原因是已經有這樣的設備存在了,可以修改一個沒有的值。
然後我們可以建立設備節點,mknod /dev/chardev c 250 0,那麼在/dev下就可以找到對應的設備文件,此時我們就可以對這個設備文件進行操作。
以下是對設備文件/dev/chardev操作的測試代碼chardevtest.c,這個測試工具打開設備文件,往設備文件中寫入一個整數,然後再讀取這個整數並顯示:
直接gcc -o chardevtest chatdevtest.c編譯成chardevtest,然後運行,運行時輸入1,然後再讀取設備值並顯示在屏幕上。
注:
1.上面chardev_init()函數返回必須為0,否則會報-1 Device or resource busy的錯誤。
2.代碼裡有prink驅動打印的函數,內核打印函數只有在原屏幕上能打印出來,一般的終端登錄工具上insmod和rmmod時將無法打印,此時會將
打印寫到/var/log/message文件中。
3.在用測試程序打開文件時,驅動會調用read函數,從chardev_var中讀取數值並顯示。我們輸入一個整數,然後驅動會調用write將數值寫入chardev_var中。
這個過程可以(只能)在原屏幕上打印出來。
至此,測試結束。