设备驱动功能层
对于具体的设备,工程师应该实现net_device中的open,stop,tx,hard_header,get_stats,tx_timeout,interruppt等函数。
网络设备媒介层
网络设备媒介层直接对应实际的硬件设备,我们需要定义一组读写设备内部寄存器的函数,如ior,iow。
二、网络设备驱动移植
下面我们主要讲解基于mini2440的DM9000网卡驱动的移植
首先看内涵DM9000代码在/driver/net/dm9000.c
查看/driver/net/Makefile
obj-$(CONFIG_DM9000) += dm9000.o
查看/driver/net/Konfig
menuconfig NET_ETHERNET
bool "Ethernet (10 or 100Mbit)"
config DM9000
tristate "DM9000 support"
depends on ARM || BLACKFIN || MIPS
select CRC32
select MII
所以配置内核make menuconfig 时,需要选中这一项。
根据开发板电路图知道DM9000的AEN端口接到了nGCS4上,同时DM9000的INT端口接到了IRQ_EINT7上,另外DM9000的CMD端口接到了LADDR2上,最后发现DM9000上数据线是SD0-SD15,即数据线的位数是16位。
根据mini2440地址空间的分配与片选信号的定义知道,引脚nGCS4对应的空间的起始地址为0x20000000,这个由系统地址线控制。同时我们知道DM9000使用的中断号就是IRQ_EINT7。另外,DM9000上的CMD信号是控制地址端口还是数据端口的,如果CMD为0,即LADDR2为0表示访问地址寄存器,当CMD为1,即LADDR2为1表示访问数据寄存器。
下面我们进行DM9000驱动的移植,在mach-mini2440.c中添加如下代码
#include <linux/dm9000.h> #define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300) static struct resource mini2440_dm9k_resource[] = { [0] = { //地址端口 .start = MACH_MINI2440_DM9K_BASE, .end = MACH_MINI2440_DM9K_BASE + 3, .flags = IORESOURCE_MEM }, [1] = { //数据端口 .start = MACH_MINI2440_DM9K_BASE + 4, .end = MACH_MINI2440_DM9K_BASE + 7, .flags = IORESOURCE_MEM }, [2] = { //中断号 .start = IRQ_EINT7, .end = IRQ_EINT7, .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,//高电平触发 } }; static struct dm9000_plat_data mini2440_dm9k_pdata = { //数据线的位数是16位,没有使用E2PROM .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM), .dev_addr = { 0x08,0x90,0x90,0x90,0x90,0x90}, //MAC地址 }; static struct platform_device mini2440_device_eth = { .name = "dm9000", //设备名 .id = -1, .num_resources = ARRAY_SIZE(mini2440_dm9k_resource), .resource = mini2440_dm9k_resource, //资源 .dev = { .platform_data = &mini2440_dm9k_pdata, //私有数据 }, }; |
最后在mini2440的BSP文件mach-mini2440.c中添加如下代码
static struct platform_device *mini2440_devices[] __initdata = { …… & mini2440_device_eth, //添加 }; |
这样移植完毕后编译内核生成内核镜像。
本文转载自:http://blog.csdn.net/weiqing1981127/article/details/8521600