第一次尝试开发移植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.测试成功,小灯闪烁
历史性时刻,使用的是自己编译的内核,自己移植过来的驱动,
虽然驱动照抄飞凌的,只是在内核中换了个位置