嵌入式Linux移植5. LED驱动移植 添加LED驱动到内核,测试程序成功运行

第一次尝试开发移植Linux上的驱动,还是和当年单片机一样,从最简单的LED小灯开始,走走流程

试验结果:LED驱动已经编译进系统(产生.o文件),LED测试程序已经编译成功(产生可执行文件),但是由于疫情手头没板子,没法上板测试,开学之后测试吧。写的有点乱想到哪写哪吧,自己能看懂就行吧,有不懂的朋友可以留言。

 

内核源码:飞凌提供的的kernel源码

目标板:飞凌的ok335xd,am3354

试验前提:已经有了LED驱动程序ledcdev.c

                                LED测试程序myledapp.c

移植涉及的主要7个文件:1.以上两个.c文件

                                          2.在内核文件中的drivers/misc/下新建myled文件夹,其中新建文件Kconfig,Makefile

                                          3.myled上层目录(misc)中的Kconfig,Makefile文件

                                          4..config文件,kernel总目录下的,靠menuconfig界面改,可vi查看添加结果/搜索指令

语法了解:Makefile语法和基本规则

                  Kconfig语法和基本规则

基本思想:驱动程序与测试程序分离,先编写驱动程序,添加到内核文件,将驱动编译进内核;然后编写测试程序,编译,启动                    系统,将编译完的可执行文件通过NFS移进板子,运行文件,测试程序运行

                  Kconfig,Makefile,menuconfig,.config关系理解:

                  Makefile和Kconfig是Linux中重要的两条线,上级的Kconfig,Makefile调用下级的Kconfig,Makefile,Kconfig中写的东  西                    要在menuconfig中的菜单里显示,Makefile决定哪些文件要进行编译。

                  有了驱动改好这四个文件(上级下级共四个)后在menuconfig中启用设备驱动,Kconfig中写的东西要在menuconfig                      中的菜单里显示,menuconfig中设置完之后改变kernel下的.config文件,Makefile根据.config文件决定将led的驱动程                       序编译进系统。

基本流程: 驱动程序移植

                 1.在misc中新建myled文件夹,在其中通过vim新建Kconfig,Makefile

                  2.在myled下的Kconfig,Makefile写入对应代码(具体写法此文不进行赘述)

                  3.在myled上层目录即/drivers/misc文件中的Kconfig,Makefile中写入对应代码(路径和编译成.o的指令)

                  4.kernel文件下 make menuconfig进入界面找到myled选项,选上*,退出保存,vi .config,查看是否有MYLEDTEST

                  5.驱动移植完毕,编译内核

                  6.使用tftp,将刚编译生成的uImage复制到/tftpboot

                  7.使用NFS,使用NFS挂载网络根文件系统,Ubuntu的/nfs_rootfs作为根文件目录

                  8.复位板子,自动加载新编译的内核

                  添加测试程序                  

                 1.编写测试程序,编译生成可执行文件

                 2.将可执行文件文件移到ubuntu下的/nfs_rootfs/mnt

                 3.使用超级终端操作板子:root       cd /mnt    ./ledtest

                 4.闪灯实现

关键指令注意事项:

                       编辑mytestapp:  gedit myledapp.c
              查看交叉编译器版本:arm-arago-linux-gnueabi-gcc -v
编译LED测试程序myledapp.c:  arm-arago-linux-gnueabi-gcc -o ledtest myledapp.c
                                 编译内核:make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage

关于Makefile和Kconfig:

make menuconfig  进入配置界面(在内核文件夹下)

vi Makefile   :打开Makefile进行编辑,没有的话,自动新建一个进行编辑
vi ../Makefile:打开上一级的。。。。。。
vi Kconfig    :打开Kconfig进行编辑,没有的话,自动创建一个进行编辑
vi ../Kconfig : 打开上级的。。。。

vim操作注意事项:

更全的查看:https://blog.csdn.net/qq_36071362/article/details/104372454
1.如果操作滚轮和方向键有ABCD,卸掉vim装vim,以下方法

        方法2:ubuntu预装的是 vim tiny,安装vim full版本,可以解决

        卸载vim-tiny:

        $ sudo apt-get remove vim-common

        安装vim full:

        $ sudo apt-get install vim

2.不同模式切换:刚进入是命令模式,按“i”键进入输入模式进行编辑
                编辑完成后按esc,输入:进入命令模式
                输入wq保存退出(还有q! wq!强制退出,q,w)
3./搜索指令

 

没图不舒服:附上阶段性成果图片

图1-2:menuconfig界面中出现我们的设备,选用设备

            注意取消选中飞凌的驱动,在misc-led device

            注意device driver里的LED Support不要改,LED Support for GPIO connected LEDs选项与飞凌板的LED有关,没有自己的驱动myled和飞凌的led device可以通过执行echo 1 > /sys/class/leds/usr0/brightness亮灯,但是没有LED Support无法操作LED,简单分析:飞凌的驱动是封装的LED Support,里面有设备号的自动注册,之后测试程序根据设备号操作LED。文件系统/dev/led是设备文件,内核启动后驱动会操作led文件

遗留问题1:LED Support到底做了什么?怎么做的?

遗留问题2:文件系统中的led文件,能否自建文件?什么类型和内容?

图3. .config中出现。。。=y

图4. 驱动程序中编译出来.o文件(随系统内核一块编译出来的)

图5. 测试程序使用同样的交叉编译器编译成ledtest可执行文件(单独编译,在移进文件系统,超级终端操作运行)

图6.测试成功,小灯闪烁

       历史性时刻,使用的是自己编译的内核,自己移植过来的驱动,

       虽然驱动照抄飞凌的,只是在内核中换了个位置

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值