实现功能:运行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命令来卸载。在台式机上一般采用动态加载的方式。在嵌入式产品里可以先用动态加载的方式来调试,调试完毕后再编译到内核里。
linux3.x上(带有device tree设备树)LED
dtb、驱动和应用程序编写:
加载中,请稍候......