转自:http://blog.chinaunix.net/uid-26798528-id-3427948.html
Author:
Blog:
Copyright:Original
Date:
1、Hosting environment:VMare ubuntu10.04
2、Cross-compiling environment:arm-2009q3.tar.bz2
3、Development board:QT6410
4、nanflash:K9F2G08(256M)
5、linux -version:Linux-2.6.39
6、uboot-version:u-boot-2010.06
三天了,当每一次编译到drivers/net/dm900.o的时候我心跳就开始加速了,漫长的编译,每一次算15分钟,昨天我移植LCD驱动的时候,至少编译了5次以上,痛苦。
前些天虽然就把dm900驱动移植成功了,但是有个小问题,就是文件系统启动后不能ping,更不能挂载nfs文件系统,表示鸭梨大,所以这篇文章一直拖了好几天,
今天经过两次的编译中下能从nfs启动文件系统,能实现各种网卡命令了,赶紧写个记录。
网卡驱动在/drivers/net/目录下,QT6410用的是dm9000ae芯片,/drivers/net/dm900.c驱动文件和CPU无关,并且dm900.c是基于平台驱动架构的,在QT6410开发板上,dm9000ae直接接在了S3C6410的存储器总线上,原理图如下:
DM9000AE CMD控制引脚接在S3C6410片选信号1上,即bank1上所以DM9000的基地址就是0x18000000(物理地址)
移植步骤:
1)dm9000ae驱动程序既然与CPU无关,那么移植的时候肯定要初始化dm9000ae所接的GPIO,由上图可以看出,对于SROM的初始化已经的在uboot中实现
这里只需要初始化IRQ_LAN引脚,即EINT7(GPN7),所以需要将GPN7配置成外部中断引脚,并配置外部中断寄存器使能中断,EINT7由S3C6410芯片手册可知
是属于第0组外部中断
修改dm9000.c,增加GPIO初始化代码
/*
static void init_dm9k_gpio(){
//设置EINT7高电平触发中断
}
在static int __devinit dm9000_probe(struct platform_device *pdev)探测函数中调用上述初始化代码
static int __devinit dm9000_probe(struct platform_device *pdev)
{
}
在dm9000.c中添加如下头文件
#include
#include
#include
#include
#include
#include
dm9000在bsp中作为平台驱动出现,这里参考arch/arm/mach-s3c64xx/mach-real6410.c给dm9000平台驱动添加所需要的平台资源
在arch/arm/mach-s3c64xx/mach-qt6410.c中添加如下代码
#ifdef CONFIG_DM9000
static struct resource dm9000_resources[] = {
};
static struct dm9000_plat_data dm9000_setup = {
};
static struct platform_device s3c_device_dm9000 = {
};
#endif //#ifdef CONFIG_DM9000
//同理还需要添加头文件
#include
#include
上面的S3C64XX_PA_XM0CSN1物理地址,增加dm9000平台资源所使用的资源的IO映射,linux内核操作的是虚拟地址,实际上就上建立一个映射表
在bsp(/arch/arm/mach-s3c64xx)目录下的mach-qt6410.c文件中建立dm9000平台资源所使用的IO映射表
static struct map_desc qt6410_iodesc[] = {
#ifdef CONFIG_DM9000
#endif
};
不妨看看struct map_desc结构的定义在arch/arm/include/asm/mach/map.h中定义了
struct map_desc {
};
#define MT_UNCACHED
#define MT_CACHECLEAN
#define MT_MINICLEAN
#define MT_LOW_VECTORS
#define MT_HIGH_VECTORS
#define MT_MEMORY
#define MT_ROM
#define MT_MEMORY_NONCACHED
#define MT_MEMORY_DTCM
#define MT_MEMORY_ITCM
其中上面所用到的type=MT_DEVICE=0定义在arch/arm/include/asm/mach/io.h代表该类型为IO类型
同样的我们建立了虚拟地址到物理地址的映射表之后那么它又怎样和系统联系起来呢?看看/arch/arm/mach-s3c64xx/mach-qt6410.c中下面这两个函数(蓝色部分)
static void __init qt6410_map_io(void)
{
}
MACHINE_START(QT6410, "QT6410 development board")
MACHINE_END
//当系统启动的时候最先执行的就是MACHINE_START(QT6410, "QT6410 development board"),同时会调用qt6410_map_io()而qt6410_map_io中又调用了s3c64xx_init_io(qt6410_iodesc,...)这样内核就会帮我们创建我们需要的页表了。更详细的过程请看我的另一篇转载文章及其经典,同时需要了解MMU想关的知识,因为在实际硬件操作的时候,MMU就充当着为我们创建页表的角色
添 加虚拟地址的宏定义对s3c6410个寄存器的物理地址和虚拟地址的宏定义都在arch/arm/plat-samsung/include/plat /map-base.h(虚拟地址)和arch/arm/mach-s5p64x0/include/mach/map.h(虚拟地址&&物理地址)
在arch/arm/plat-samsung/include/plat/map-base.h中添加
#define S3C_VA_IRQ#define S3C_VA_SYS
#define S3C_VA_MEM
#define S3C_VA_TIMER
#define S3C_VA_WATCHDOG
#define S3C_VA_UART
#define S3C64XX_VA_XM0CSN1
Notes:该文红色部分为需要修改或者添加的地方,蓝色部分仅是为了说明.至此dm9000移植已经结束了,
----------编译测试
/home/eilian/development/Linux/linux-2.6.39# make menuconfig
│ │
另外为了测试网卡移植,可以通过NFS文件系统来测试
挂载NFS文件系统后
CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: QT6410 development board
Memory policy: ECC disabled, Data cache writeback
CPU S3C6410 (id 0x36410101)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
camera: no parent clock specified
S3C64XX: PLL settings, A=533000000, M=533000000, E=24000000
S3C64XX: HCLK2=266500000, HCLK=133250000, PCLK=66625000
Built 1 zonelists in Zone order, mobility grouping on.
Kernel command line: noinitrd root=/dev/nfs rw nfsroot=192.168.0.3:/home/eilian/development/workspace/rootfs-nfsip=192.168.0.4:192.168.0.1::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=128M
PID hash table entries: 512 (order: -1, 2048 bytes)
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 128MB = 128MB total
Memory: 125652k/125652k available, 5420k reserved, 0K highmem
Virtual kernel memory layout:
SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
NR_IRQS:246
VIC @f6000000: id 0x00041192, vendor 0x41
VIC @f6010000: id 0x00041192, vendor 0x41
Console: colour dummy device 80x30
console [ttySAC0] enabled
Calibrating delay loop... 531.66 BogoMIPS (lpj=2658304)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
s3c64xx_dma_init: Registering DMA channels
PL080: IRQ 73, at c8808000, channels 0..8
PL080: IRQ 74, at c880c000, channels 8..16
S3C6410: Initialising architecture
bio: create slab at 0
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
s3c-i2c s3c2440-i2c.0: slave address 0x10
s3c-i2c s3c2440-i2c.0: bus frequency set to 65 KHz
s3c-i2c s3c2440-i2c.0: i2c-0: S3C I2C adapter
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 4, 81920 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
UDP hash table entries: 128 (order: 0, 6144 bytes)
UDP-Lite hash table entries: 128 (order: 0, 6144 bytes)
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
ROMFS MTD (C) 2007 Red Hat, Inc.
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
start plist test
end plist test
S3C_LCD clock got enabled :: 133.250 Mhz
LCD TYPE :: LTE480WV will be initialized
Window[0] - FB1: map_video_memory: clear ffd00000:000ff000
Window[0] - FB2: map_video_memory: clear ffd7f800:0007f800
Console: switching to colour frame buffer device 60x34
fb0: s3cfb frame buffer device
Window[1] - FB1: map_video_memory: clear ffc00000:000ff000
Window[1] - FB2: map_video_memory: clear ffc7f800:0007f800
fb1: s3cfb frame buffer device
Window[2] - FB1: map_video_memory: clear ffb80000:0007f800
fb2: s3cfb frame buffer device
Window[3] - FB1: map_video_memory: clear ffb00000:0007f800
fb3: s3cfb frame buffer device
jkq debug VIDCON0 is 353
Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
s3c6400-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10
s3c6400-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10
s3c6400-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10
s3c6400-uart.3: ttySAC3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10
brd: module loaded
loop: module loaded
S3C NAND Driver, (c) 2008 Samsung Electronics
S3C NAND Driver is using hardware ECC.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000100000 : "Bootloader"
0x000000100000-0x000000600000 : "Kernel"
0x000000600000-0x000007e00000 : "User"
0x000007e00000-0x000010000000 : "File System"
dm9000 Ethernet Driver, V1.31
dm9000 dm9000.0: eth0: Features changed: 0x00004802 -> 0x00004002
eth0: dm9000a at c8826000,c8c00004 IRQ 108 MAC: 08:90:00:a0:90:90 (platform data)//其中这些打印信息来自dm9000.c
。。。。。。。。。。。。。。。。。。。。。。。。
dm9000 dm9000.0: eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
IP-Config: Complete:
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 136K
**************munt all***************
*************************************
********booting for QT6410 **********
Version:android-2.6.39
Author:eilian
Copyright:Original
Blog:http://blog.csdn.net/eilianlau
Date:2011.12.14
************************************
Please press Enter to activate this console.
Processing /etc/profile...
Set search library path in /etc/profile
Set user path in /etc/profile
-/bin/sh: PAT: not found
root@bootloader#ifconfig
eth0
lo
root@bootloader#ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3): 56 data bytes
64 bytes from 192.168.0.3: seq=0 ttl=64 time=0.542 ms
64 bytes from 192.168.0.3: seq=1 ttl=64 time=0.547 ms
64 bytes from 192.168.0.3: seq=2 ttl=64 time=0.543 ms
64 bytes from 192.168.0.3: seq=3 ttl=64 time=0.550 ms
64 bytes from 192.168.0.3: seq=4 ttl=64 time=0.578 ms
64 bytes from 192.168.0.3: seq=5 ttl=64 time=0.522 ms
64 bytes from 192.168.0.3: seq=6 ttl=64 time=0.474 ms
64 bytes from 192.168.0.3: seq=7 ttl=64 time=0.560 ms
64 bytes from 192.168.0.3: seq=8 ttl=64 time=0.535 ms
64 bytes from 192.168.0.3: seq=9 ttl=64 time=0.540 ms
64 bytes from 192.168.0.3: seq=10 ttl=64 time=0.527 ms
64 bytes from 192.168.0.3: seq=11 ttl=64 time=0.574 ms
64 bytes from 192.168.0.3: seq=12 ttl=64 time=0.520 ms
64 bytes from 192.168.0.3: seq=13 ttl=64 time=0.540 ms
64 bytes from 192.168.0.3: seq=14 ttl=64 time=0.579 ms
^C
--- 192.168.0.3 ping statistics ---
15 packets transmitted, 15 packets received, 0% packet loss
round-trip min/avg/max = 0.474/0.542/0.579 ms
root@bootloader#
dm9000ae在QT6410开发板上已经完美支持