话说生活实在无聊,无聊的我只剩下学习了。好吧。手里有一块儿6410的板子闲置着,不能浪费啊。就活动活动把linux内核移植上去,顺便再把驱动过一遍。
内核里有一个6410的smdk了,本来不想直接使用的,但是已经提供了,我就先省点儿事儿,回过头来再研究自己从头到尾自己构建板级结构。
bootloader使用的是u-boot,以前移植过,现在没有心情再次移植一遍,直接使用友善提供的,重点linux内核的去驱动上面。
1.nand flash的支持
这部分没有对nand flash的硬件特性进行分析,直接copy的友善的,只是分区是自己定义了一下,这块儿等回头看nand flash特性的时候一并再看。
只说遇到的问题:1.开始时候不识别分区,经查没有在内核里配置mtd选项,配置上了之后,发现内核起来之后mount不上,网上一顿搜,把u-boot的传递的参数写正确,并且和内核里的参数一一对应上,还是不能mount上,一想是自己正的yaffs2文件系统,这块儿下载最新的yaffs2源码,捣鼓了好半天,终于正确,果断mout上了。就这几点需要注意,还是很容易把内核跑起来的,yaffs2根文件系统的镜像是以前做的,暂且这么先用着,本次重点不在文件系统上。
2,接下来最想干的就是想把网络搞通,没有什么原因,第一感觉
网卡是dm9000的,内核里已经有它的驱动了,没有自己写也是,策略是先把它搞上去,回头自己写网卡驱动,搞通花了半天时间,有点儿惭愧啊,先是在板级驱动里配置它的资源,仔细看了以前的mini2440和mini6410的资源文件的写法,大致如下:
static struct resource bq6410_dm9000_resourses[] = {
[0] = {
.start = S3C64XX_PA_XM0CSN1,
.end = S3C64XX_PA_XM0CSN1 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C64XX_PA_XM0CSN1 + 4,
.end = S3C64XX_PA_XM0CSN1 + 7,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT(7),
.end = IRQ_EINT(7),
.flags = IORESOURCE_IRQ | IRQ_TYPE_LEVEL_HIGH,
},
};
看了一下原理图,中断引脚好理解,原理图上都有,只是S3C64XX_PA_XM0CSN1是怎么来的,看了很久没找到对应关系,看来看原理图的还需要加强啊。后来还是网上搜了一下,终于明白了,在另一篇文章里有详细的说明,这里就不再论述了。
配置好有,看到驱动已经加载,网卡已经识别,但遇到这么一个问题: “Address family not support by protocol” ,字面意思是不被协议支持的地址。开始想在内核里一顿狂搜,然后倒退法找到原因,后来发现此法不通,原因是这个打印在内核的好多出都有,跟踪困难。尝试正退,想来想去这个驱动应该是稳定版本的,无果,休息了一会儿,卷土重来,一想,何不百度一下,果然有结果:
“后来才发现,“CONFIG_UNIX”是为了配置“Unix domain sockets”的,“CONFIG_UNIX”一般都是应该配置为y(编译进kernel),如果只有在少数(如嵌入式)系统中才配置为m(作为module,名为”unix”的module)。即是没有连接到任何网络,有很多常用的程序都使用“unix domain socket”进行通信的,如X-Window、syslog等程序,估计还有我本例遇到的udevadm(udevd)等程序,都是依赖于“CONFIG_UNIX=y”这个配置的。”
恍然大悟,内核肯定没配置,make menuconfig,选上此选项,并且增加对tcp/ip的支持,重新烧录,ok了。
3.把led灯点亮,内核里已经有led子系统,如果还没有研究的盆友可以借此锻炼一下自己跟踪代码的能力
我们姑且称之为led—core吧,内核里这种core,那种core的,我们见的多了,不错从心底感觉,这个core设计的还是非常不错的,我觉得完全可以在应用层借用这种思想。led-core注册了一个led的class在sys文件系统下,而s3c自己有一个针对2440的现成的驱动,没的说,这部分我在一个不同的平台上已经自己动手写过了,所以这里就没必要重复了,知道了来龙去脉,也实践过了,剩下的就是拿来注意,ok,一编译,好嘛,出错,原来三星这个驱动没有整的和adc驱动一样,连6410的平台都支持,还得我手动改改,没关系,小case,唯一需要注意的就是将操作gpio引脚的东东改成6410相关的就ok
4.嘿嘿。。其实内核里还有一个gpio的按键子系统,好吧。。和led一样,拿来注意,直接用之,三下五除二搞定,唯一要注意的是不知道为什么button 6的gpio申请不成功,不知道被哪个毛孩提前申请出去,暂且不管,马上想测试下,额。。可惜/dev下没有设备节点,因为我们没有手动创建,也没有添加udev,好吧,下一步添加udev。ok?sir?