当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。
分类: LINUX
2013-07-08 23:40:52
#ifdef{, 0},#endif进而调用probe函数, 完成网卡的probe。struct net_device * (int )
static int net_olddevs_init(void)
static void (int )
点击(此处)折叠或打开
static struct [] = {
在这个数组中添加内容:
,{ // support cs8900
.virtual = vSMDK2410_ETH_IO, // virtural addr that will be remapped
.pfn = __phys_to_pfn(S3C2410_CS3 + (1<<24)),
.length = SZ_1M,
.type = MT_DEVICE,
}
或者是这么个格式
{vSMDK2410_ETH_IO,
0x19000000,
SZ_1M,
MT_DEVICE}
这个数组是下面函数调用的:******************************************************************************************************************************************************(, ());这个功能是把 物理地址 0x19000000映射到虚拟地址 vSMDK2410_ETH_IO 这个虚拟地址上去。
******************************************************************************************************************************************************
物理地址是这个的原因: 网卡已经焊接到板子上了,线路已经了连好了,就好比是RAM是分配了0x30000000 ~ 0x34000000这段物理地址空间。
网卡被分配给了19000000,这个地址是从电路图得出来的:
我们要判断某一个功能芯片是连接到了CPU哪个区域(物理地址空间),应该从CPU芯片的一看起。
首先我们的cpu物理地址空间是 128MB×8=1024MB
分为8个区域nGCS0-7。我们通过cpu出来的引脚 哪个连到 功能芯片上,来判断我们的功能芯片连到了CPU的哪个区域。
看电路图上 CPU的引脚
nGCS0--------------nGCS0
nGCS1--------------nGCS1
nGCS2--------------nGCS2
nGCS3--------------nLAN_CS
nGCS4--------------nGCS4
nGCS5--------------nGCS5
然后看CS8900A的引脚,有一个
nCLIPSLE------------nLAN_CS
那么证明网卡是连到第四个区域了,nGCS3的起始地址是18000000。
我们再看下地址线,由于只有128MB的地址空间,所有有效的地址线就是 27条。网卡的起始地址如何确定出是 19000000???
看下虚拟地址vSMDK2410_ETH_IO。
static int net_olddevs_init(void)
---->static void (int )
---> (, , == 0)
--->struct net_device * (int )
struct net_device * (int )
这个函数真的仅仅的是一个参数准备函数,重头戏在
static int (struct net_device *dev, int , int )
这里有个好奇,既然我们的ARM中是只能使用“把网卡I/O资源映射到内存地址空间”,probe1中针对某一个端口地址,进行检测。
检测哪几个端口,是由数组netcard_portlist决定的。数组有几个成员,就调用几次 probe1。 原因是:
这个代码是针对X86来写的,X86使用的是I/O地址空间的方式,外设的I/O资源需要映射到I/O地址空间中去,但是他不是说地址空间的任意
值都可以,只能映射到有限的几个地址(开始)处。
这有限个,就是数组的成员。
这里,我既然是ARM的,明显的就不用检测了,我们不使用这些端口,这个机制只适用于X86。我们通过上面两种方式,把网卡的I/O资源映射到
内存地址空间。
但是probe1函数还是要执行,因为他不仅仅是探测,确定 I/O地址空间。也进行了其他一些操作。
韦东山那边,他是在probe函数中,控制了对netcard_portlist数组的使用,因为我们开发板什么布局我们已经知道了,不需要探测,直接映射就好。
那第二种方式,静态映射网卡I/O资源到内存地址空间的方式。移植的教程中都没有修改cs89x0.c,那么也就是说,内核还是会探测那么多个端口地址。
估计探测不出来也就作罢。我们下一步,还是去看看怎么使用的这些个地址。往下走吧。