一直在研究TI官方的关于Beaglebone Black的文章,进行到 驱动开发的步骤
http://processors.wiki.ti.com/index.php
/Processor_SDK_Linux_Training:_Introduction_to_Device_Driver_Development
,简单记录一下自己的新的。
跟随官方的说明, 总的说来还是很顺畅,资料中有何自己实际操作不用的地方,也都一步步解决了。官方资料是针对最新的SDK,自己使用的是SDK8.0。所以提前就知道学习过程中会有异常,所以并不奇怪。
在进行到从TI官方的git上面clone源码的时候出现了问题,连接git,一直都是time out,在网上查了好久,怎么使用gitorious,什么添加ssh密钥,公钥,都不行,最后实在无能为力,直接下载了一个压缩包,本地解压后,继续下面的操作。
在编译内核的时候运行 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage 出错,观察提示,应该是没有使用sudo运行。增加sudo发现还是不行,提示找不到 交叉编译工具链工具。可是刚才明明添加了,于是推测,刚才添加地址的时候 没有使用root登陆,不会使用sudo后就找不到地址把,于是切换到root登陆,在export 查看,果然没有 编译器目录。添加地址添加到 export ,然后执行make,ok了!
进行到Write a Hello World Module 的步骤,心情非常激动,因为原来一直对驱动这部分敬而远之,不太了解。看资料里一直在说什么Module,module,一开始不了解这个模块具体是什么。就想着按步骤操作就好了,可是到这步,直接来了一句“You will need create init_module() and cleanup_module functions...”弄蒙了。那会写这些。不了解啊。
于是想,这东西肯定是驱动里面很基础的东西,不然不会直接一带而过。先打开上面直接从网上下载下来的Module_tranining源码一看,果然后hello 文件夹,进去,还有hello_version.c和 Makefile。窃喜,这里已经写好了代码了。可是gedit hello_version.c后里面只有三行注释。就去网上搜索,hello worl的源码,后来用了这个复制进去:
//Add include statements here
/* Add your code here */
//Add macro statements here
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world/n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world/n");
}
init_module(hello_init);
cleanup_module(hello_exit);
然后按照要求修改了Makefile。运行make,发现有很多错误。
发现错误都出在最后两行,在网上反复搜索,有的人说,这两个函数,有不同的形式,init_module() 和module_init()类似。exit_module()和cleanup_module().类似。后来看到这个 http://blog.csdn.net/reille/article/details/6310750
尝试着把最后两行的函数修改为 module_init()和exit_module()。可还是不行,不过此时报错少了,最后发现exit_module() 改为module_exit()可解决问题。
果然生产了.ko文件,接下来又是按照说明操作就可以看到挂载module的情况了。