實現功能:運行Linux系統,點亮ARM開發板上的LED1,間隔200ms閃爍。
1. 根據硬件電路編寫驅動
2. 編寫Makefile和Kconfig
3. 編譯加載:靜態加載和動態加載
靜態加載:make menuconfig選擇模塊是[*]編譯進內核,然後make zImage編譯內核,最好將image文件放到SD卡或NFS啟動內核即可。
動態加載:make menuconfig選擇模塊是[M]編譯進內核,然後meke modules編譯模塊,生成.ko文件,將其發送到ARM開發板裡面,使用命令insmod進行加載,用lsmod進行查看,用modinfo查看詳細信息,用rmmod刪除。
4. 編寫應用程序:
應用程序需要打開驅動模塊fd = open("/dev/ leds",0),然後調用ioctl控制LED。
5. 交叉編譯 :arm-linux-gcc led1.c -o led1,得到led1執行文件(注意權限需為可執行)。
6. 用串口/FTP/NFS下載到開發板的/usr/bin文件下。
7. 在開發板可以手動運行,開發本上的LED燈閃爍。如果要開機自啟動,則繼續下面操作。
8. 在/etc/rc.d/init.d下添加led1腳本,實現兩個功能,一個是start啟動,即運行/usr/bin/led1;另一個功能是關閉led1,即查找LED1進程ID,然後殺死此進程。在運行過程中可以用/etc/rc.d/init.d/led1 start | stop實現開閉。腳本內容如下:
#!/bin/sh
base=led1
case "$1" in
start)
/usr/bin/$base &
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
9. 在/etc/init.d/rcS中添加如下內容,這樣可以實現開機自動啟動。注:Linux運行Bootloader,加載內核,啟動後運行的第一個程序是init.d裡的程序,此處運行等級rcS也就是rc1,單用戶模式。
/etc/rc.d/init.d/led1 start
echo " " > /dev/tty1
echo "Starting led1 service..." > /dev/tty1
echo "
10. reboot,實現開機自啟動。
注意:在Linux下加載驅動程序可以采用動態和靜態兩種方式。靜態加載就是把驅動程序直接編譯到內核裡,系統啟動後可以直接調用。靜態加載的缺點是調試起來比較麻煩,每次修改一個地方都要重新編譯下載內核,效率較低。動態加載利用了Linux的module特性,可以在系統啟動後用insmod命令把驅動程序(.o文件)添加上去,在不需要的時候用rmmod命令來卸載。在台式機上一般采用動態加載的方式。在嵌入式產品裡可以先用動態加載的方式來調試,調試完畢後再編譯到內核裡。
另可參考:Linux上第一個驅動程序:hello http://www.linuxidc.com/Linux/2016-03/129597.htm