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命令来卸载。在台式机上一般采用动态加载的方式。在嵌入式产品里可以先用动态加载的方式来调试,调试完毕后再编译到内核里。


另可参考:Linux上第一个驱动程序:hello  http://www.linuxidc.com/Linux/2016-03/129597.htm