驱动接口定义的变化
如:2.4内核中字符设备驱动的注册接口是
int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)
而2.6内核中已经不建议使用这种方法了,改为:
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
又如:2.6.27内核中网卡接口的net_device结构成员和低版本的net_device结构成员也发生了一些变化。
这种接口定义及注册方法带来的变化,发生的并不频繁。解决方案是:参考内核中的代码。这种接口定义及注册方法在内核中非常容易找到,如:字符设备驱动的注册方法及接口定义可以参照内核driver/char/目录下的很多实例。
http://blog.csdn.net/hongtao_liu/archive/2009/07/28/4386375.aspx
--------------------------------------------------------------------------------------
2、移植DM9000遇到的问题1(我已参照相关资料介绍添加了DM9000的驱动):
前期移植是参照<嵌入式linux应用开发完全手册>441页来改的,
错误1:
编译内核,下载内核启动后出现“IP-Config: Device `eth0' not found. ”信息。
分析与解决:此错误说明dm9000未工作。可我确认已经添加驱动了呀,在这晕了半天,后来查资料得知可能是DM9000基地址设置有问题,原来我在移植时书上介绍的说是片选CS4的基地址就是DM9000的基地址。经查资料我的阳初2440开发板DM9000基地址为0x19000300与CS4基地址 0x20000000不同哦.问题根源找到了,修改结构体s3c_dm9k_resource中的DM9000的基址址即可.... 这个结构体可能在arch/arm/plat-s3c24xx/common-smdk.c中(我的是这个位置,可用grep命令进行搜索)。
错误2:
上面问题解决后又出现了“NETDEV WATCHDOG: eth0: transmit timed out” 错误(网卡已工作了),
分析与解决:刚开始怀疑是NETDEV WATCHDOG的问题,于是把它关了,关后网卡就不工作了,更惨.....
于是就上网查找书查也没解决,后来想到我以前用别人配置的内核能运行 成功的,于是就拿来参照着看,原来是中断号设置有误,晕呀...
把中断改成IRQ_EINT9,OK啦哈! 通过 nfs挂我制作好的根文件系统 ,成功啦,好高兴,毕竟这次是我自己配置的哦。
下面是以上两个问题修改的数据结构s3c_dm9k_resource:
/* DM9000 */
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS4, /* ADDR2=0,发送地址时使用这个地址 */
.end = S3C2410_CS4 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS4 + 4, /* ADDR2=1,传输数据时使用这个地址 */
.end = S3C2410_CS4 + 4 + 3,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT9, /* 中断号 */
.end = IRQ_EINT9,
.flags = IORESOURCE_IRQ,
}
};
我已把S3C2410_CS4改为0x19000300了。
附加:
S3C2410_CS4在内核中的位置可通过 grep命令来查找.
方法:在终端通过cd命令进到内核目录,然后执行如下命令即可找到包含该字样的所有文件。
$grep "S3C2410_CS4" * -R //*表示查找当前目录下的所有文件、目录,-R表示递归查找子目录。
别笑哦,我今天才学会用这个命令查找 ,用着特爽...
------------------------------------------------------------------------------------
沒有留言:
張貼留言