Linux3.4.2移植CS8900网卡驱动到优龙FS2410开发板

发布者:Joyful444Life最新更新时间:2024-07-12 来源: elecfans关键字:Linux3  移植  CS8900  网卡驱动  FS2410开发板 手机看文章 扫描二维码
随时随地手机看文章

一、S3C2410和CS8900的硬件连接

    FS2410开发板的原理图我没有找到,但可看参考资料2,里面写的非常详细

二、移植过程

a) 配置内核支持S3C2410

wps_clip_image-18745

wps_clip_image-18807

wps_clip_image-18876

选好Samsung S3C24XX SoCs后,会自动返回到上一级菜单(即前一张图),然后选择:

wps_clip_image-19042

wps_clip_image-19170

b) 配置内核支持CS89x0网卡

Device Drivers-->Network device support-->Ethernet driver support—>

wps_clip_image-19326


c) 修改drivers/net/ethenet/cirrus/cs89x0.c:


(1)在文件开头增加以下几行,它们在宏CONFIG_ARCH_S3C24XX被定义时起作用,表示作用于FS2410开发板


183 static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0};

184 #elif defined(CONFIG_ARCH_S3C24XX)

185 #include

186 #include

187 #define S3C24XX_PA_CS8900   0x19000000  /* 物理基地址 */

188 static unsigned int netcard_portlist[] __initdata = {0, 0};     /* 在下面进行设置 */

189 static unsigned int cs8900_irq_map[] = {IRQ_EINT9, 0, 0, 0};    /* 中断号*/

190 #else

191 #ifndef CONFIG_CS89x0_PLATFORM

192 static unsigned int netcard_portlist[] __used __initdata =


(2)修改入口函数cs89x0_probe


  以下使用宏CONFIG_ARCH_S3C24XX包裹起来的代码是新加的


311 struct net_device * __init cs89x0_probe(int unit)

312 {

313 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));

314 unsigned *port;

315 int err = 0;

316 int irq;

317 int io;

318 #if defined(CONFIG_ARCH_S3C24XX)

319 unsigned int oldval_bwscon; /* 用来保存BWSCON寄存器的值 */

320 unsigned int oldval_bankcon3; /* 用来保存S3C2410_BANKCON3寄存器的值 */

321 #endif

322 if (!dev)

323 return ERR_PTR(-ENODEV);

324

325 sprintf(dev->name, 'eth%d', unit);

326 netdev_boot_setup_check(dev);

327 io = dev->base_addr;

328 irq = dev->irq;

329 #if defined(CONFIG_ARCH_S3C24XX)

330 // cs89x0_probe会被调用多次,我们只需要1次,根据netcard_portlist[0]的值忽略后面的调用

331 if (netcard_portlist[0])

332 return -ENODEV;

333 // 将CS8900A的物理地址转换为虚拟地址,0x300是CS8900A内部的IO空间的偏移地址

334 netcard_portlist[0] = (unsigned int)ioremap(S3C24XX_PA_CS8900, SZ_1M) + 0x300;

335 /* 设置默认MAC地址

336 * MAC地址可以由CS8900A外接的EEPROM设定(有些单板没接EEPROM),

337 * 或者启动系统后使用ifconfig修改

338 */

339 dev->dev_addr[0] = 0x08;

340 dev->dev_addr[1] = 0x89;

341 dev->dev_addr[2] = 0x89;

342 dev->dev_addr[3] = 0x89;

343 dev->dev_addr[4] = 0x89;

344 dev->dev_addr[5] = 0x89;

345 /* 设置Bank3: 总线宽度为16, 使能nWAIT, 使能UB/LB。by www.100ask.net */

346 oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON);

347 *((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<12))

348 | S3C2410_BWSCON_DW3_16 | S3C2410_BWSCON_WS3 | S3C2410_BWSCON_ST3;

349 /* 设置BANK3的时间参数, by www.100ask.net */

350 oldval_bankcon3 = *((volatile unsigned int *)S3C2410_BANKCON3);

351 *((volatile unsigned int *)S3C2410_BANKCON3) = 0x1f7c;

352 #endif

353 if (net_debug)

354 printk('cs89x0:cs89x0_probe(0x%x)n', io);

355

356 if (io > 0x1ff) { /* Check a single specified location. */

357 err = cs89x0_probe1(dev, io, 0);

358 } else if (io != 0) { /* Don't probe at all. */

359 err = -ENXIO;

360 } else {

361 for (port = netcard_portlist; *port; port++) {

362 if (cs89x0_probe1(dev, *port, 0) == 0)

363 break;

364 dev->irq = irq;

365 }

366 if (!*port)

367 err = -ENODEV;

368 }

369 if (err)

370 goto out;

371 return dev;

372 out:

373 #if defined(CONFIG_ARCH_S3C24XX)

374 iounmap(netcard_portlist[0]);

375 netcard_portlist[0] = 0;

376

377 /* 恢复寄存器原来的值 */

378 *((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;

379 *((volatile unsigned int *)S3C2410_BANKCON3) = oldval_bankcon3;

380 #endif

381 free_netdev(dev);

382 printk(KERN_WARNING 'cs89x0: no cs8900 or cs8920 detected.  Be sure to disable PnP with SETUPn');

383 return ERR_PTR(err);

384 }

385 //#endif   多了一个

386 #endif


(3)修改模块入口函数init_module


以下使用宏CONFIG_ARCH_S3C24XX包裹起来的代码是新加的


1879 int __init init_module(void)

1880 {

1881 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));

1882 struct net_local *lp;

1883 int ret = 0;

1884 #if defined(CONFIG_ARCH_S3C24XX)

1885 unsigned int oldval_bwscon; /* 用来保存BWSCON寄存器的值 */

1886 unsigned int oldval_bankcon3; /* 用来保存S3C2410_BANKCON3寄存器的值 */

1887 #endif

1888 #if DEBUGGING

1889 net_debug = debug;

1890 #else

1891 debug = 0;

1892 #endif

1893 if (!dev)

1894 return -ENOMEM;

1895

1896 #if defined(CONFIG_ARCH_S3C24XX)

1897 // 将CS8900A的物理地址转换为虚拟地址,0x300是CS8900A内部的IO空间的偏移地址

1898 dev->base_addr = io = (unsigned int)ioremap(S3C24XX_PA_CS8900, SZ_1M) + 0x300;

1899 dev->irq = irq = cs8900_irq_map[0]; /* 中断号 */

1900

1901 /* 设置默认MAC地址,

1902 * MAC地址可以由CS8900A外接的EEPROM设定(有些单板没接EEPROM),

1903 * 或者启动系统后使用ifconfig修改

1904 */

1905 dev->dev_addr[0] = 0x08;

1906 dev->dev_addr[1] = 0x89;

1907 dev->dev_addr[2] = 0x89;

1908 dev->dev_addr[3] = 0x89;

1909 dev->dev_addr[4] = 0x89;

1910 dev->dev_addr[5] = 0x89;

1911

1912 /* 设置Bank3: 总线宽度为16, 使能nWAIT, 使能UB/LB。by www.100ask.net */

1913 oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON);

1914 *((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<12))

1915 | S3C2410_BWSCON_DW3_16 | S3C2410_BWSCON_WS3 | S3C2410_BWSCON_ST3;

1916

1917 /* 设置BANK3的时间参数, by www.100ask.net */

1918 oldval_bankcon3 = *((volatile unsigned int *)S3C2410_BANKCON3);

1919 *((volatile unsigned int *)S3C2410_BANKCON3) = 0x1f7c;

1920 #else

1921 dev->irq = irq;

1922 dev->base_addr = io;

1923 #endif

 …       …

1971 out:

1972 #if defined(CONFIG_ARCH_S3C24XX)

1973 iounmap(dev->base_addr);

1974

1975 /* 恢复寄存器原来的值 */

1976 *((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;

1977 *((volatile unsigned int *)S3C2410_BANKCON3) = oldval_bankcon3;

1978 #endif

1979 free_netdev(dev);

1980 return ret;

1981 }


(4)修改模块退出函数cleanup_module


以下使用宏CONFIG_ARCH_S3C24XX包裹起来的代码是新加的


1983 void __exit

1984 cleanup_module(void)

1985 {

1986 unregister_netdev(dev_cs89x0);

1987 writeword(dev_cs89x0->base_addr, ADD_PORT, PP_ChipID);

1988 release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);

1989 #if defined(CONFIG_ARCH_S3C24XX)

1990 iounmap(dev_cs89x0->base_addr);

1991 #endif

1992 free_netdev(dev_cs89x0);

1993 }

1994 #endif /* MODULE && !CONFIG_CS89x0_PLATFORM */

1995


(5)修改net_open  


1240 net_open(struct net_device *dev)

1241 {

1242 struct net_local *lp = netdev_priv(dev);

1243 int result = 0;

1244 int i;

1245 int ret;

1246 #if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_ARCH_S3C24XX) /* uses irq#1, so this won't work */

1247 if (dev->irq < 2) {

1248 /* Allow interrupts to be generated by the chip */

1249 /* Cirrus' release had this: */

1250 #if 0

1251 writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );

1252 #endif

1253 /* And 2.3.47 had this: */

1254 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);

 ...    ...

1273 }

1274 else

1275 #endif

1276 {

1277 #if !defined(CS89x0_NONISA_IRQ) && !defined(CONFIG_CS89x0_PLATFORM)&& !defined(CONFIG_ARCH_S3C24XX)

1278 if (((1 << dev->irq) & lp->irq_map) == 0) {

1279 printk(KERN_ERR '%s: IRQ %d is not in our map of allowable IRQs, which is %xn',

1280    dev->name, dev->irq, lp->irq_map);

1281 ret = -EAGAIN;

1282 goto bad_out;

1283 }

1284 #endif

1285 /* FIXME: Cirrus' release had this: */

1286 writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );

1287 /* And 2.3.47 had this: */

1288 #if 0

1289 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);

1290 #endif

1291 write_irq(dev, lp->chip_type, dev->irq);

1292 #if defined(CONFIG_ARCH_S3C24XX)

1293 ret = request_irq(dev->irq, &net_interrupt, IRQF_TRIGGER_RISING, dev->name, dev);

1294 #else

1295 ret = request_irq(dev->irq, net_interrupt, 0, dev->name, dev);

1296 #endif

1297 if (ret) {

1298 printk(KERN_ERR 'cs89x0: request_irq(%d) failedn', dev->irq);

1299 goto bad_out;

1300 }

1301 }

 ...    ...

1358 /* check to make sure that they have the 'right' hardware available */

1359 switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {

1360 case A_CNF_MEDIA_10B_T: result = lp->adapter_cnf & A_CNF_10B_T; break;

1361 case A_CNF_MEDIA_AUI:   result = lp->adapter_cnf & A_CNF_AUI; break;

1362 case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break;

1363 default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2);

1364 }

1365 #if defined(CONFIG_ARCH_PNX010X) || defined(CONFIG_ARCH_S3C24XX)

1366 result = A_CNF_10B_T;

1367 #endif

1368 if (!result) {

1369 printk(KERN_ERR '%s: EEPROM is configured for unavailable median', dev->name);

1370 release_dma:

 ... ...

1478 }


(6)全局变量static int io 修改为static unsigned int io;


      原因请看参考资料1


最后,编译内核,执行make uImage。


三、参考资料


1、《嵌入式linux应用开发完全手册》韦东山


2、《FS2410中CS8900A IO模式驱动分析》杨志平


3、S3C2410 内存连接方法的深入研究


4、(转)CS8900A 驱动程序分析(国嵌)


5、AUI与BNC - BaiShi 在路上 - CSDN博客


关键字:Linux3  移植  CS8900  网卡驱动  FS2410开发板 引用地址:Linux3.4.2移植CS8900网卡驱动到优龙FS2410开发板

上一篇:关于linux可安装模块的装载地址的研究
下一篇:关于网卡驱动的发送函数调用dev_kfree_skb的简析

推荐阅读最新更新时间:2024-11-04 22:54

04-S3C2440u-boot学习之u-boot分析(3)之源码第1、2阶段
参考《韦东山1期视频》第09课第3节 u-boot分析之源码第1阶段.WMV 一:第一阶段 (1)打开u-boot-1.1.6_JZ2440cpuarm920tstart.S _start: b reset(跳转到reset): 1.设置SVC32 模式; reset: /* * set the cpu to SVC32 mode */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0 2.关看门狗; /* turn off the watchdog */ #if defined(CON
[单片机]
04-S3C2440u-boot学习之u-boot分析(3)之源码第1、<font color='red'>2</font>阶段
毫米波雷达研究:5R方案将成主流,4D雷达2025年起大规模上车
佐思汽研发布《2022-2023年乘用车 毫米波雷达 产业研究报告》。 2023年乘用车毫米波雷达产业研究: 2023年毫米波雷达安装量超2000万颗,同比增长35%。 受行泊一体、NOA、L3等多因素驱动,5R方案将在2026年成为市场主流配置方案。 受国内本土厂商销量上涨, 智能化 内卷等因素影响,国产化替代大势所趋。 4D毫米波雷达实现小规模上车,预计2025-2026年大规模量产上车。 4D毫米波雷达目前以级联方案为主,单 芯片 方案将成为未来布局重点,预计5-8年内落地。 经纬恒润前向雷达MRR510 BOM分析。 01、2023年毫米波雷达安装量超2000万个,同比增长35%;4D毫米波雷达
[汽车电子]
毫米波雷达研究:5R方案将成主流,<font color='red'>4</font>D雷达2025年起大规模上车
PIC的I2C读写程序
**************************************** * PIC的I2C读写程序 * **************************************** TITLE " TWO WIRE/I2C BUS INTERFACE WITH PIC16C5x " ; LIST P=16C54 ; ;***************************************************************************** ;** Two wire/I2C Bus READ/WRITE Sample Routines of
[单片机]
梳理STM32F429之通信传输部分---NO.2 硬件IIC
一、STM32 的 I2C 特性及架构: 只要遵守协议,就是标准的通讯,不管如何实现它,不管是 ST 生产的控制器还是 ATMEL 生产的存储器, 都能按通讯标准交互。 由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。 相对地,还有“硬件协议”方式, STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来, CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C协议的方式减轻了 CPU 的工作,且使软件设计更加简单。 1、STM32
[单片机]
梳理STM32F429之通信传输部分---NO.<font color='red'>2</font> 硬件IIC
中国移动明年最多新增2万个TD-LTE基站
据悉,中国移动(微博)将在2012年在中国境内建立10000—20000个左右的TD-LTE基站。 在中国政府主持下,中国移动已经在中国6个城市建立TD-LTE实验网络,并已建立共850多个基站。此外,中国移动遍布中国境内的25万个TD-SCDMA基站,其中有50%基站可以逐步升级到TD-LTE。 据了解,中国移动已经与在北美、欧洲和亚洲的移动 通信 运营商合作,推动TD-LTE在国际上采用。2011年10月底已经完成建立超过30个TD-LTE实验网络。 台湾公司预计将在中国移动TD-LTE推广当中扮演重要角色。例如,台湾IC设计公司联发科(微博)已完成TD-LTE/ 3G 和FDD-LTE/3G智能手机芯片设计,广
[网络通信]
OV入围菲律宾2Q17智能手机前五强
2017年第2季菲律宾智能手机销售数量较2016年同期下滑,主因在于除了当地大厂Cherry Mobile与Cloudfone,其他当地厂商皆面临大陆手机品牌的挤压而缩减。根据IDC报告指出,第2季菲国手机市场的亚均和季军分别由韩国与大陆夺下。   根据IDC最新亚太区每季手机追踪报告,2017年第2季有超过400万支智能手机销往菲律宾,较2016年同期衰退了10%。   IDC亚太区客户端设备市场分析师Jerome Dominguez表示,Oppo与Vivo等大陆品牌借由砸钱不手软的行销策略,对销售推广员祭出强烈诱因并获得前所未有的零售商力挺,打乱了菲国原有的智能手机零售空间。这挑战了传统智能手机厂商习以为常的供应商与经销商关系
[手机便携]
中移动4G终端政策生变 技术缺位国内厂商压力大
    中移动4G终端政策生变 国内厂商压力大   每经记者 孙卫涛 发自北京   中国移动在4G终端的政策出现了反复。   日前,中国移动重新修订了《中国移动定制终端产品白皮书》,明确自2014年5月31日起,其送测4G定制手机将全部支持五模十频。   此前,中国移动就曾一直强调五模十频手机终端,但是去年,其表示要引入三模八频手机终端,结果不到半年时间,政策又变了回来。   这一政策的反复对手机终端厂商影响不小。不少业内人士对《每日经济新闻》记者表示,目前只有高通一家公司支持五模十频手机终端方案,如果手机厂商放弃三模八频上马五模十频,必然会导致手机成本上涨,而这或将影响到中国移动制定的2014年销售1亿部4G终端的目标。   4G
[手机便携]
英飞凌推出HybridPACK™ Drive G2 Fusion, 将硅和碳化硅结合到用于电动汽车的先进电源模块中
经济实惠与高性能、高效率相结合,是电动汽车走向更广阔市场的关键所在。英飞凌科技股份公司宣布推出HybridPACK™ Drive G2 Fusion,为电动汽车领域的牵引逆变器确立了新的电源模块标准。HybridPACK™ Drive G2 Fusion是首款结合英飞凌硅(Si)和碳化硅(SiC)技术的即插即用电源模块。这一先进解决方案在性能和成本效益之间实现了理想的平衡,为逆变器的优化提供了更多选择。 HybridPACK™ Drive G2 Fusion 功率模块中硅和碳化硅的主要区别之一是碳化硅具有更高的热导率、击穿电压和开关速度,因此效率更高,但成本也高于硅基功率模块。采用新模块后,每辆车的碳化硅含量可以降低,同
[汽车电子]
英飞凌推出HybridPACK™ Drive G<font color='red'>2</font> Fusion, 将硅和碳化硅结合到用于电动汽车的先进电源模块中
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved