首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

dm9000移植解决办法

2012-02-20 
dm9000移植我在网络上找到不少移植的方法,但是都要求修改kernel代码,把dm9000加到init_data中去;然后才能i

dm9000移植
我在网络上找到不少移植的方法,但是都要求修改kernel代码,把dm9000加到init_data中去;然后才能insmod。
我想问,有不有办法,不改内核,直接insmod的方法。

[解决办法]
那么原始古老的办法 实在不要看了
linux 2.6内核实现了总线+设备+驱动 的模型
platform这条虚拟总线上,挂载dm9000设备和dm9000驱动
内核自带的符合总线+设备+驱动模型的驱动,都是不需要也最好不要修改的
这些驱动本身就是跨平台的,编写一次到处运行的
需要变化的东西,是在设备里描述,如寄存器基址和中断号、总线宽度等,这些是随板子不同而不同的东西。变化的东西不在驱动里写,而是在设备里描述。
例如mini2440的device描述为

C/C++ code
/* DM9000AEP 10/100 ethernet controller */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 = {    .flags        = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),};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,    },};
[解决办法]
抱歉 一时激动说错了,
变化的东西申请一个platform_device结构来描述,最终要把这个platform_devi的ce结构加入那个
static struct platform_device *mini2440_devices[] __initdata

这个是没办法省的,platform驱动就是这么用的
除非是pci、usb总线,总线控制器能自动检测设备。这个dm9000一般挂在soc的local bus上,物理总线无法提供探测设备的功能,只好虚拟一条platform总线,程序员自己告诉驱动关于设备的信息

热点排行