|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
无论图形界面发展到什么水平这个原理是不会变的,Linux命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文件的制作。
一样平常来讲,我们在编译kernel时,设备驱动的选择有两种体例:一种是间接编译到kernel里,另外一种是以模块体例挂接。CS8900网卡驱动假如以模块体例挂接,函数init_module就是出口;假如是间接编译到kernel里,那末函数cs89x0_probe才是出口。
在此出口函数中,将完成网卡驱动的各项初始化。如注册假造地点,设备号,中止号,和各个相干存放器的初始化。
cs89x0_probe函数里会往挪用真实的初始化函数cs89x0_probe1。上面说一下该初始化函数里必要完成的几个主要中央:
1、注册假造地点。
经由过程request_region函数注册假造地点。在kenel内里,我们所操纵的存放器的地点实在都是假造地点,可是每个存放器的假造地点都有独一和其对应的物理地点,由于在kernel内里任何假造地点城市经由过程MMU转化成物理地点。以是在kernel里,界说完所要用到的存放器后,都必需利用一个函数ioremap将我们所要用到的存放器的物理地点转换成为在kernel里能够操纵的假造地点,然后才干将他们用以详细的操纵,不然统统都是白费。
ioaddr=(int)ioremap(BASE_ADDR,16);
2、添补net_device布局体。
该布局体的成员都是和收集设备有关的变量。个中对照主要的有两个:dev_addr和open。dev_addr里要存的是主机的MAC地点,一样平常都是从eeproom中读出来再寄存到该变量中,固然也能够依据本人的必要手动赋值。
for(i=0;i<ETH_ALEN/2;i++){
unsignedintAddr;
Addr=readreg(dev,PP_IA+i*2);
dev->dev_addr[i*2]=Addr&0xFF;
dev->dev_addr[i*2+1]=Addr>>8;
}
Open是一个函数指针,必要把net_open函数赋值给他。net_open函数是一个专门用来注册收集设备中止号的函数,输出ifconfig命令时,最初就会挪用到这个函数。在这个函数中要把中止号设置一下。
writereg(dev,PP_BusCTL,ENABLE_IRQ|MEMORY_ON);
request_irq(dev->irq,&net_interrupt,0,dev->name,dev);
3、I/O端口的中止哀求设置。
网卡不成能也不必要每时每刻都处于中止形态,公道的中止触发机会是一个需要前提。依据硬件电路图的引脚可知,绝对应的中止哀求存放器是GPG1和EINT9。在GPG1存放器内里要把EINT9存放器功效激活,而在EINT9存放器内里则要把中止设置为上跳沿触发。
writel(readl(S3C2410_GPGCON)|0x8,S3C2410_GPGCON);
writel(readl(S3C2410_EXTINT1)|0x40,S3C2410_EXTINT1);
另有一点要注重,CS8900网卡的存放器都是16位的,以是在选择读写函数时也必需选择16位存放器的读写函数。
staticu16readword(unsignedlongbase_addr,intportno)
{
returninw(base_addr+portno);
}
staticvoidwriteword(unsignedlongbase_addr,intportno,u16value)
{
outw(value,base_addr+portno);
}
以上即是Linuxkernel2.6.25CS8900网卡驱动移植所需注重的内容。Kernel内里触及和兼容的器材十分多,往除简单发生抵触的部分,增加本人必要完成的功效,可使得移植事情可以顺遂举行
</p>
vim除非你打算真正的学好linux,或者说打算长久时间学习他,而且肯花大量时间vim,否则,最好别碰 |
|