已在内核代码中添加EmbedSky_hello驱动为例,进行内核编译时候出现了一下几个问题:
1、在 /opt/EmbedSky/linux 2.6.30.4/drivers/char目录下修改“Kconfig”文件,添加如下内容:
config EmbedSky_HELLO
tristate "TQ2440/SKY2440 Hello Driver"
depends on ARCH_S3C2440
help
EmbedSky TQ2440/SKY2440 Hello.
后,别忘了在同目录下的“Makefile”文件中添加如下内容:
obj-$(CONFIG_EmbedSky_HELLO) +=EmbedSky_hello.o
将原来的 obj-$(CONFIG_TQ2440_HELLO) +=EmbedSky_hello.o 一句删除。
然后,按照常理,在/opt/EmbedSky/linux 2.6.30.4/目录下运行#make menuconfig命令后在内核配置界面里选择Device Drivers -->....Character devices -->后会出现如下选项:
<>TQ2440/SKY2440 Hello Driver
但在刚解压的内核中进行上述工作,最后不会出现上面说的配置选项,这是为什么呢?原因在于没有进行系统类型的设置,也就是没有和上面的“depends on ARCH_S3C2440”搭配好。现在需要进行如下工作:
#make menuconfig命令进入内核配置界面,选择“Load an Alternate Configuration File”,输入路径“arch/arm/configs/s3c2440_defconfig”,回车进入到“System Type”选项配置菜单,将S3C2440 Machines选项下做如下选择:只选择SMDK2440和SMDK2440 withS3C2440 CPU module两个选项。然后退回最初的配置菜单,选择最下面的“Save an Alternate Configuration File”,将其保存为“.config”文件。在编译系统时会自动调用该文件。
再进行驱动配置就会出现“ <>TQ2440/SKY2440 Hello Driver”选项了。
2、在内核目录下运行命令“make SUBDIR=drivers/char/ modules”生成EmbedSky_hello.ko文件(在drivers/char/目录下),将其复制到开发板 /lib 目录下,按常理当运行“#insmod EmbedSky_hello.ko”加载模块命令后,会显示EmbedSky_hello.c文件中printk指令所定义的出输出内容。但是事与愿违,出现了如下错误提示:
EmbedSky_hello: version magic '2.6.30.4 mod_unload ARMv4 ' should be '2.6.30.4-EmbedSky mod_unload ARMv4 '
insmod: cannot insert 'EmbedSky_hello.ko': invalid module format
出错原因:模块版本与内核版本不匹配!
解决办法:导入预设配置信息,进入menuconfig 继续配置General config ->......Local version -> 加入如下内容:“-EmbedSky ”退出保存为 .config ,重新编译内核,将EmbedSky_hello.ko复制到板子,然后再“#insmod EmbedSky_hello.ko,然后就congratulations,you succeed啦!^_^