Linux上第一个驱动+应用程序:LED灯闪烁
实现功能:运行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命令来卸载。在台式机上一般采用动态加载的方式。在嵌入式产品里可以先用动态加载的方式来调试,调试完毕后再编译到内核里。