买了tiny6410的开发板很久了,一直没有开始弄,现在想学了又没有了时间,只有利用周末的时间来学习,也打算开始用博客记录自己的学习过程,要不然就都忘了。这个是最简单的hello的驱动程序,自己按照友善之臂的例子一点点来的,写一点遇到的问题。
1.首先在驱动目录下建立模块的源文件,这里命名为 my_mini6410_hello_module.c
假设linux目录为linux-2.6.38 则文件存放在linux-2.6.38/drivers/char/
按照例子中的程序照着写了个代码 分别是 模块的加载和卸载。
/* file begin my_mini6410_hello_module.c */
static int __init my_hello_module_init(void) /* init 前面有两个下划线 装载时调用的函数*/
{
printk("hello ! \n");
return 0;
}
static void __exit my_hello_module_cleanup(void) /* 卸载时调用的函数 */
{
printk("bye !\n");
}
module_init(my_hello_module_init); /* 这里应该是挂接函数 */
module_exit(my_hello_module_cleanup);
MODULE_LICENSE("GPL");
/* file end */
2 将新的module加入编译的内核代码树,
在char目录下打开Kconfig配置文件 vi Kconfig
看到有类似 config XXXX
XXXX 的地方按照同样的方式为自己的module添加一个配置。
代码如下 :
config MY_MINI6410_HELLO_MODULE /* 这个名字会在下面的makefile中使用到,和具体的代码文件关联 */
tristate “my mini6410 hello module” /* 这个名字是在使用 make menuconfig配置时显示的模块的名字 */
depends on CPU_S3C6410
help
this is my hello module
保存退出,在linux-2.6.38 目录下 使用make menuconfig命令打开图形菜单,在Device Drivers -> Character Drivers菜单中看到刚刚添加的项了,
使用空格键切换到M模式,选择编译为模块方式, “*”是编译为内核中。确定保存。
3.修改makefile文件
在上面修改后添加了编译选项,但是还需要修改makefile文件,使得真正的将my_mini6410_hello_module.c这个文件编译进去。使得内核的编译选项和真正的源文件真正联系起来。
在char目录下打开Makefile文件 : vi Makefile
按照同样的格式 添加:
obj -$(CONFIG_MY_MINI6410_HELLO_MODULE) += my_mini6410_hello_module.o /* 这里可以看出括号里的大写部分是kconfig中的配置项名,=后面则为文件名 相同的.o文件名*/
4 。执行make ,在执行make modules。
这时my_mini6410_hello_module.ko就应该出现在 char目录下了。通过ftp下载到开发板上,放在开发板 /lib/modules/ 'uname -r' / 下。
uname -r 根据单板使用的内核不同而不同,必须使用这个目录,没有的话新建这样的目录。我的是2.6.38-FriendlyARM
5 按照说明书上的指示,我直接使用下面命令
modprobe my_mini6410_hello_module 并没有出现意料中的打新hello,呵呵 而是出现了错误信息: modprobe: module './my_mini6410_hello_module' not found,
通过在网上搜索知道在编译并准备好一个内核模块后,使用modprobe装载之前需要更新依赖关系:
depmod
这个命令会重新生成 modules.dep 这个依赖文件
这时再运行 modprobe my_mini6410_hello_module 即出现了期待的打印信息。
使用 rmmod my_mini6410_hello_module 出现了卸载模块的打印信息。
至此我的第一个hello的驱动就这样结束了。