### CS8900驱动移植详解 #### 一、引言 随着嵌入式系统的发展,网络通信成为了不可或缺的一部分。为了使嵌入式设备能够接入网络,必须要有相应的硬件支持和软件驱动。CS8900是一款适用于嵌入式系统的以太网控制器,其驱动程序的移植对于实现特定平台上的网络功能至关重要。本文将详细介绍如何针对S3C2410处理器移植CS8900的网卡驱动。 #### 二、CS8900概述 CS8900是一款高性能、低成本的单芯片快速以太网控制器,它支持10BASE-T和100BASE-TX标准,适用于各种嵌入式应用场合。CS8900具有集成的物理层(PHY)、媒体访问控制(MAC)以及强大的硬件地址解析协议(ARP)引擎等特性,使得它成为嵌入式系统中理想的以太网解决方案之一。 #### 三、S3C2410简介 S3C2410是Samsung公司生产的一款基于ARM920T内核的应用处理器,广泛应用于嵌入式领域。它集成了多种外围设备接口,包括USB、I2C、SPI、ADC等,并且支持多种内存类型,如SDRAM、NAND Flash等。S3C2410还支持外部总线扩展,这为扩展以太网控制器提供了可能。 #### 四、移植步骤 本节将详细介绍如何在S3C2410上移植CS8900的网卡驱动。 ##### 1. 指定CS8900使用的资源 在移植过程中,首先需要明确CS8900所使用的资源,例如中断号、内存地址等。具体操作如下: ```c #elif defined(CONFIG_ARCH_S3C2410) #include <asm/irq.h> #include <asm/arch-s3c2410/regs-mem.h> #define S3C24XX_PA_CS8900 0x19000000 static unsigned int netcard_portlist[] = {0, 0}; static unsigned int cs8900_irq_map[] = {IRQ_EINT9, 0, 0, 0}; ``` 这里的`S3C24XX_PA_CS8900`定义了CS8900的物理地址,而`netcard_portlist`和`cs8900_irq_map`则分别用于存储CS8900的端口地址列表和中断号映射。 ##### 2. 修改入口函数cs89x0_probe 该函数是驱动初始化时调用的函数,需要进行适当的修改以便正确配置CS8900。具体的修改包括: ```c #ifdef CONFIG_ARCH_S3C2410 unsigned int oldval_bwscon; unsigned int oldval_bankcon3; #endif ``` 接下来,在分配中断后检查端口地址是否有效: ```c #ifdef CONFIG_ARCH_S3C2410 if (netcard_portlist[0] == 0) { return -ENODEV; } netcard_portlist[0] = (unsigned int)ioremap(S3C24XX_PA_CS8900, SZ_1M) + 0x300; ``` 然后设置MAC地址: ```c dev->dev_addr[0] = 0x08; dev->dev_addr[1] = 0x89; dev->dev_addr[2] = 0x89; dev->dev_addr[3] = 0x89; dev->dev_addr[4] = 0x89; dev->dev_addr[5] = 0x89; ``` 接下来,更新`BWS`和`BANK`寄存器的值以适配CS8900: ```c oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON); *((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3 << 12)) | S3C2410_BWSCON_DW3_16 | S3C2410_BWSCON_WS3 | S3C2410_BWSCON_ST3; oldval_bankcon3 = *((volatile unsigned int *)S3C2410_BANKCON3); *((volatile unsigned int *)S3C2410_BANKCON3) = 0x1f7c; ``` 在函数退出前恢复寄存器的原始值: ```c #ifdef CONFIG_ARCH_S3C2410 iounmap(netcard_portlist[0]); netcard_portlist[0] = 0; *((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon; *((volatile unsigned int *)S3C2410_BANKCON3) = oldval_bankcon3; #endif ``` ##### 3. 修改模块入口函数init_module 这个函数负责驱动模块的初始化,需要做一些额外的配置来确保CS8900正常工作: ```c #ifdef CONFIG_ARCH_S3C2410 unsigned int oldval_bwscon; unsigned int oldval_bankcon3; #endif ``` 初始化过程中,映射CS8900的物理地址到虚拟地址,并设置MAC地址: ```c #ifdef CONFIG_ARCH_S3C2410 dev->base_addr = io = (unsigned int)ioremap(S3C24XX_PA_CS8900, SZ_1M) + 0x300; dev->irq = irq = cs8900_irq_map[0]; dev->dev_addr[0] = 0x08; dev->dev_addr[1] = 0x89; dev->dev_addr[2] = 0x89; dev->dev_addr[3] = 0x89; dev->dev_addr[4] = 0x89; dev->dev_addr[5] = 0x89; oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON); *((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3 << 12)) | S3C2410_BWSCON_DW3_16 | S3C2410_BWSCON_WS3 | S3C2410_BWSCON_ST3; ``` #### 五、总结 通过对S3C2410处理器上的CS8900驱动进行必要的修改,我们可以成功地在该平台上实现网络功能。上述步骤涉及到了关键的资源指定、函数修改等内容,这些都是驱动移植过程中的重要环节。在实际开发过程中,还需要根据具体的硬件环境和需求进一步调整代码,以确保驱动程序的稳定性和可靠性。
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助