嵌入式爱好者

8mp移植驱动

2022-10-31 13:43| 发布者: wjy| 查看: 521| 评论: 0

类目: 知识库  >  i.MX8MP系列产品     文档编号: 805

说明:本文以写一个hello驱动为例,演示移植驱动的过程,有需求的客户可参考此方法自行操作。

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

2. 进入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。

3. 在该文件夹下创建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在内核裁剪配置文件中,将显示hello drivers菜单,默认编译进内核:

y:编译进内核

m:编译为模块.ko文件

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

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

在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

4.  编辑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/         //在Kconfig最后加入这一句

这句话的作用是当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-aa\

rch64-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

  AR      kernel/built-in.a

  CC [M]  drivers/hello/hello.o

  GEN     .version

  CHK     include/generated/compile.h

  UPD     include/generated/compile.h

  CC      init/version.o

  AR      init/built-in.a

  LD      vmlinux.o

  MODPOST vmlinux.o

  MODINFO modules.builtin.modinfo

  LD      .tmp_vmlinux.kallsyms1

  KSYM    .tmp_vmlinux.kallsyms1.o

  LD      .tmp_vmlinux.kallsyms2

  KSYM    .tmp_vmlinux.kallsyms2.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驱动可正常运行。


已解决

未解决

只是看看

最新评论

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-11-23 10:58

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

返回顶部