各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。
1e3b6ee4e53f4d9394fde6e7fea7b873.png
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。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。
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-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
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即可。