iMX8MP驱动移植全过程讲解

原创 2022-11-07 13:22:00 imx8mp移植驱动

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

imx8mp开发板


进入源码的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

进入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
#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

在该文件夹下创建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

编辑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。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。

开始编译:

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

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

将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驱动可正常运行。 

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

关于iMX8MP开发板的详细信息,您可以点击下图了解。

相关产品 >

  • OKMX8MP-C开发板

    内置NPU、ISP,AI计算能力高达2.3TOPS|飞凌嵌入式i.MX8MP 系列-NXP iMX8M Plus 开发板 基于高性能低功耗工业级iMX8MP核心板设计,支持多种多种高速通信接口。iMX8MP开发板内置NPU,AI计算能力2.3TOPS,支持4K,支持双图像信号处理器(ISP),是一款支持LinuxQT/android操作系统的iMX8MP开发板。

    了解详情
    OKMX8MP-C开发板
  • FETMX8MP-C核心板

    iMX8MP核心板基于 NXP  i.MX 8M Plus 处理器设计,  采用4核Cortex-A53 和 Cortex-M7架构。支持双千兆网口,iMX8MP性能强劲最高运行速率可达2.3TOPS,并且i.MX8MP功耗更低≤2W 。iMX 8M Plus系列专注于机器学习和视觉、高级多媒体以及具有高可靠性的工业自动化。它旨在满足智慧家庭、楼宇、城市和工业4.0应用的需求。飞凌iMX8MP核心板提供用户手册,iMX8MP原理图,引脚定义等。
    了解详情
    FETMX8MP-C核心板

推荐阅读 换一批 换一批