Linux2.6 DM9000驱动模编译为模块

对于linux2.6内核的源代码中,DM9000的驱动程序已经封装好了。它被加入到platform驱动中:

1199  static int __init
1200  dm9000_init(void)
1201  {
1202   printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
1203
1204   return platform_driver_register(&dm9000_driver); /* search board and register */
1205  }


platform是一个虚拟的地址总线,它主要用于描述SOC上的片上资源。
platform所描述的资源有一个共同点,就是在CPU的总线上直接取址。

因为内核只是封装了platform_driver,所以单独编译DM9000.c网卡还是不可用的。
我们需要注册platform_device,即注册platform设备就可以使用DM9000网卡工作了。
在linux2.6.17/include/linux/platform_device.h:


  16struct platform_device {  //这个结构直接和硬件交互
  17 const char * name;
  18 u32 id;
  19 struct device dev;
  20 u32 num_resources;
  21 struct resource * resource;  //所描述的设备的硬件资源
  22};


在 linux+v2.6.17/include/linux/ioport.h:


  16 struct resource {
  17         const char *name;  
  18         unsigned long start, end;
  19         unsigned long flags;
  20         struct resource *parent, *sibling, *child;
  21 };

//挂在CPU上的每个独立的设备单元,都需要一段线性的地址空间来描述-查看memory map.

//resource->start描述设备实体在cpu总线上的线性起始物理地址;

//resource->end -描述设备实体在cpu总线上的线性结尾物理地址;

//resource->name 描述这个设备实体的名称,这个名字开发人员可以随意起,但最好贴切;

//resource->flag 描述这个设备实体的一些共性和特性的标志位;




对于DM9000 的resource资源,我们需要知道一下信息:
(1) DM9000的访问基地址:即为NGCS2的基地址。注意要是物理地址。
(2) DM9000只用到一条地址线:MA2。
    对于DM9000的CMD引脚:当CMD为低电平时,SD0~SD15线上传输的是地址信号。
                        当CMD为高电平时,SD0~SD15线上传输的是数据信号。
(3) DM9000的中断引脚: ENT14。
(4) 总线位宽:这里是16位。

linux2.6.17/drivers/net/ DM9000.h里增加DM9000设备的硬件资源:

static struct resource  xx_dm9k_resource[] = {

        [0] = {

                .strat = NGCS2,   //MA2 = 0.传输地址时使用这个地址

                .end  =  NGCS2 + 1,

                .flags = IORESOURCE_MEM,

        },

        [1] = {

                .start = NGCS2 + 4,  //MA2 = 1.传输数据时使用这个地址

                .end = NGCS2 + 4 + 1,

                .flags = IORESOURCE_MEM,

        },

        [2] = {

                .start = ENT14,  //中断号

                .end = ENT14,

                .flags = IORESOURCE_IRQ,

        }

}; 

static struct dm9000_plat_data xx_dm9k_platdata = {

        .flags = DM9000_PLATF_16BITONLY,

}; 

static struct platform_device xx_dm9k_device = {

        .name = "DM9000",

        .id = 0,

        .num_resource = ARRAY_SIZE(xx_dm9k_resource),

        .resource = xx_dm9k_resource,

        .dev = {

                .platform_data = &xx_dm9k_platdata,

        }

};

在 linux2.6.17/drivers/net/dm9000.c添加注册platform设备:

static int __init
dm9000_init(void)
{
    BSP_WR32((GPIO2_BASE|GPIO_IPOL), (1<<8));
    printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);    
    platform_driver_register(&dm9000_driver); /* search board and register */
    platform_device_register(&nl_dm9k_device); //注册设备 
    return 0;
}

static void __exit
dm9000_cleanup(void)
{
    platform_driver_unregister(&dm9000_driver); //注销驱动
    platform_device_unregister(&nl_dm9k_device); //注销设备
}


在加载DM9000.ko之前需要mii接口模块和crc32模块。
在linux-2.6.17/lib目录下有crc32.ko。
在linux-2.6.17/drivers/net/目录下有mii.c。可以将此编译为模块加入到内核。
DM9000的重要驱动是内核提供的源代码。
这里只是简单的增加设备的硬件资源。


<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(737) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值