打印

i.MX8MP开发板如何移植驱动

[复制链接]
749|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。



01进入源码的drivers目录下,并创建一个名为hello的目录:



  • forlinx@ubuntu:~$ cd  /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir  hello



02进入hello目录,创建hello.c:



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c



在hello.c中写入如下内容:



  • #include  <linux/init.h>



  • #include  <linux/module.h>



  • static  int hello_init(void)



  • {



  • printk(KERN_ALERT  "Hello world\n");



  • return  0;



  • }



  • static  void hello_exit(void)



  • {



  • printk(KERN_ALERT  "Goodbye world\n");



  • }



  • module_init(hello_init);



  • module_exit(hello_exit);



  • MODULE_LICENSE("Dual  BSD/GPL");



程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world


03​​​​​​​在该文件夹下创建Kconfig,Makefile两个文件。

forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi  Kconfig

在Kconfig文件中写入如下内容:



  • config  HAVE_HELLO



  • tristate       "hello driver"



  • help



  • This  hello  driver  is  just  to  show  how  to  develop  driver  process.











  • This  driver  can  also  be  built  as  a  module.  If  so,  the  module will  be  called  .



  • default  y



  • #endmenu



表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核:

y:编译进内核

m:编译为模块.ko文件

n:表示不编译,未使能。

forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi  Kconfig

在Makefile文件中写入如下内容:

obj-$(CONFIG_HAVE_HELLO)        +=      hello.o

注意:

宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。


给添加的这三个文件权限:​​​​​​​



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod  777 hello.c



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod  777 Kconfig



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod  777 Makefile



04编辑drivers顶层的Kconfig,Makefile文件。​​​​​​​



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd  ..



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig



在Kconfig文件中写入如下内容:​​​​​​​



  • source  "drivers/counter/Kconfig"



  • source  "drivers/mxc/Kconfig"



  • source  "drivers/hello/Kconfig"    //在endmenu前添加hello文件夹的配置文件解析



  • endmenu



如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。


编辑Makefile:


forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile

在Makefile文件中写入如下内容:



  • obj-$(CONFIG_COUNTER)           += counter/



  • obj-y                           += mxc/



  • obj-$(CONFIG_HAVE_HELLO)        +=      hello/     //在Makefile最后加入这一句



这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。


5开始编译:



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk$ .  /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk$ .  environment-setup-aarch64-poky-linux



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd  OK8MP-linux-kernel



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules



  • scripts/kconfig/conf --syncconfig Kconfig



  • drivers/hello/Kconfig:7:warning:  ignoring unsupported character '�'



  • drivers/hello/Kconfig:7:warning:  ignoring unsupported character '�'



  • drivers/hello/Kconfig:7:warning:  ignoring unsupported character '�'



  • drivers/hello/Kconfig:7:warning:  ignoring unsupported character '�'



  • *



  • * Restart config...



  • *



  • *



  • * Device Drivers



  • *



  • Trust the bootloader  to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n



  • Platform support for  Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y



  • Trusted Execution  Environment support (TEE) [Y/n/m/?] y



  • hello driver  (HAVE_HELLO) [Y/n/m/?] (NEW) m    //将hello驱动编译进内核就配置为m



  • CALL   scripts/checksyscalls.sh



  • CALL   scripts/atomic/check-atomics.sh



  • CHK      include/generated/compile.h



  • GZIP   kernel/config_data.gz



  • CC     kernel/configs.o



  • […]



  • LD      vmlinux



  • SORTEX  vmlinux



  • SYSMAP  System.map



  • Building modules,  stage 2.



  • MODPOST 536 modules



  • CC [M] drivers/hello/hello.mod.o



  • LD [M] drivers/hello/hello.ko




编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了:​​​​​​​



  • forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello



  • hello.c  hello.ko  hello.mod  hello.mod.c  hello.mod.o  hello.o  Kconfig  Makefile modules.order



6



将hello.ko使用U盘或TF卡拷贝到开发板里进行验证:​​​​​​​



  • root@OK8MP:~# cd  /run/media/sda1/              //进入U盘的路径下



  • root@OK8MP:/run/media/sda1#  insmod  hello.ko   //挂载hello.ko



  • [  138.679964] Hello  world                     //挂载驱动打印信息



  • root@OK8MP:/run/media/sda1#  rmmod  hello.ko    //卸载hello.ko



  • [  142.022115]  Goodbye  world                  //卸载驱动打印信息



  • root@OK8MP:/run/media/sda1#



由上述测试可看,hello.ko驱动可正常运行。


以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。


使用特权

评论回复

相关帖子

沙发
yangjiaxu| | 2022-11-30 22:59 | 只看该作者
我之前玩linux的时候,移植一般都是ctrlV+C,感觉linux开发还是要多看看教程才行,不然报错了根本不知道哪里出现的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

171

主题

173

帖子

0

粉丝