我的itop4412开发板是半路捡的,所以没办法加他们的售后群,遇到的问题只好一点点记录吧
内核驱动编译
在日常工作过程中,编写内核程序可能机会不多,但是将厂商提供的内核源码编译到固件中,这个技能还是必须掌握的。
itop4412的资料中有两个内核源码文件夹,咱们一个一个来认识下。
iTop4412_Kernel_3.0
这个应该是官网的源码
itop4412_kernel_4_14_2_bsp
这个是迅为缩减后的源码,里面有他们编写好的脚本
咱们先已编译iTop4412_Kernel_3.0 为例
1.拿到源码后先把编译环境搭建下,配置编译环境,然后make编译源码
export PATH=$PATH:/usr/local/arm/arm-2009q3/bin
source .bashrc
2.进入iTop4412_Kernel_3.0 打开Makefile,这里的参数要配置下
194 export KBUILD_BUILDHOST := $(SUBARCH)
195 ARCH ?= arm
196 CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
197 #CROSS_COMPILE ?= /usr/local/arm/4.5.1/bin/arm-none-linux-gnueabi-
198 CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
```![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/805d492d295e4996ab0042131eb280e4.png)
配置好后 make -j4 编译下,编译过程会遇到写问题,网上会解决方案
这里自己写一个简单字符型驱动,并编译进内核
在drivers/char 下创建文件夹 hello
创建三个文件 helloworld.c Kconfig Makefile
helloworld.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("GYY");
static int hello_init(void)
{
printk(KERN_EMERG "HELLO WORLD enter!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG "HELLO WORLD exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
Kconfig
config HELLO
tristate "hello world"
help
hello hello
Makefile
obj-$(CONFIG_HELLO)+=helloworld.o
4.编辑char 文件夹下的Makefile 加上
obj-y += hello/
5.编辑char 文件夹下的Kconfig 加上
source "drivers/char/hello/Kconfig"
6.然后回到源码主目录执行 make menuconfig ,在Character devices就可以看到自己写的驱动了,勾选下 然后编译就可以了
在编译itop4412_kernel_4_14_2_bsp 源码时
报garbage following instruction – `dmb ish’
解决:
编译器问题。更换编译器即可。
sudo apt-get install gcc-arm-linux-gnueabi