• i.MX8MP开发板移植驱动,其实可以很简单


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

    01

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

    forlinx@ubuntu:~$  cd  /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/driversforlinx@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 helloforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$  vi hello.c

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

    #include  #include  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文件中写入如下内容:

    1. config HAVE_HELLO
    2. tristate "hello driver"
    3. help
    4. This hello driver is just to show how to develop driver process.
    5. This driver can also be built as a module. If so, the module will be called .
    6. default y
    7. #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。

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

    1. forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c
    2. forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig
    3. 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。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。

    05

    开始编译:​​​​​​​

    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-linuxforlinx@ubuntu:~/work/OK8MP-linux-sdk$  .  environment-setup-aarch64-poky-linuxforlinx@ubuntu:~/work/OK8MP-linux-sdk$  cd  OK8MP-linux-kernelforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$  make modulesscripts/kconfig/conf --syncconfig Kconfigdrivers/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/?] nPlatform support for  Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] yTrusted Execution  Environment support (TEE) [Y/n/m/?] yhello driver  (HAVE_HELLO) [Y/n/m/?] (NEW) m    //将hello驱动编译进内核就配置为mCALL   scripts/checksyscalls.shCALL   scripts/atomic/check-atomics.shCHK      include/generated/compile.hGZIP   kernel/config_data.gzCC     kernel/configs.o[…]LD      vmlinuxSORTEX  vmlinuxSYSMAP  System.mapBuilding modules,  stage 2.MODPOST 536 modulesCC [M] drivers/hello/hello.mod.oLD [M] drivers/hello/hello.ko

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

    forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$  ls drivers/hellohello.c  hello.ko  hello.mod  hello.mod.c  hello.mod.o  hello.o  Kconfig  Makefile modules.order

    06

    将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即可。

  • 相关阅读:
    mybatis-plus
    SSM篇目录总结
    【spring boot 使用模板引擎】
    java计算机毕业设计古玩玉器交易系统源码+mysql数据库+系统+lw文档+部署
    Linux常用命令:find、grep、vim、cat、less、more
    Codasip携手西门子共同为定制处理器提供追踪解决方案
    Flink学习2:应用场景
    【图论算法】最小生成树 (Prim 算法、Kruskal 算法)
    判断线程池任务执行完成的方式
    【Vue-Element-Admin】select模糊查询
  • 原文地址:https://blog.csdn.net/m0_46665078/article/details/127850672