加载中…
个人资料
从入门到放弃
从入门到放弃
  • 博客等级:
  • 博客积分:0
  • 博客访问:493,900
  • 关注人气:57
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux上第一个驱动+应用程序:LED灯闪烁

(2015-09-02 17:56:00)
标签:

linux

led

开机启动

分类: Linux

实现功能:运行Linux系统,点亮ARM开发板上的LED1,间隔200ms闪烁。

1.      根据硬件电路编写驱动

2.      编写MakefileKconfig

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下加载驱动程序可以采用动态和静态两种方式。静态加载就是把驱动程序直接编译到内核里,系统启动后可以直接调用。静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译下载内核,效率较低。动态加载利用了LINUXmodule特性,可以在系统启动后用insmod命令把驱动程序(.o文件)添加上去,在不需要的时候用rmmod命令来卸载。在台式机上一般采用动态加载的方式。在嵌入式产品里可以先用动态加载的方式来调试,调试完毕后再编译到内核里。

另可参考本博客:Linux上第一个驱动程序:hello

http://blog.sina.com.cn/s/blog_7880d3350102w2vl.html


其他参考:

linux3.x上(带有device tree设备树)LED dtb、驱动和应用程序编写:

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有