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-16 21:19

联想移动张辉:三季度半数手机新机将是4G
   6月26日消息,担纲联想手机中国业务3个多月后,联想移动业务集团(MBG)中国业务部总经理张辉开始大谈联想4G计划,他透露,七八月份联想智能手机将有一半新品是4G,但他同时又表示,4G来了,不代表3G手机没市场,联想不会把3G当作清理库存,还会上3G新机型。   联想手机的4G时代来临   之前,相比酷派、华为等厂商来说,联想手机的4G举措并不多,虽然与中国移动合作推出了4G手机,但与联想的3G市场地位不吻合。对此,张辉表示,今年有很多品牌厂商陆续大批量上市4G手机,作为联想这样的企业,不可能看着4G市场不做,但要进4G市场就要找最好的时候”。   关于何时是最好的时机,张辉认为,第一个硬件平台,供应链的硬件要能够充分地
[手机便携]
半导体生产商英飞凌2年半以来首次季度盈利
欧洲第二大半导体生产商英飞凌科技公司19日公布的财报显示,在经历连续10个财季亏损后,公司2009财年第四财季首次扭亏为盈。    公司财报说,今年第四财季(截至2009年9月30日)公司净利润为1400万欧元,而上财年同期则亏损8.84亿欧元。该季度公司销售收入从上季度的7.61亿欧元上升至8.55亿欧元。    英飞凌表示,2009财年公司采取的削减成本举措获得了良好的效果,明显改善了财务状况。此外受益于汽车和工业客户的需求回升,英飞凌芯片销售也有所上升。公司预计,2010财年的销售收入有望上升10%以上,全年将实现盈利。    不过公司首席执行官彼得·鲍尔也表示,尽管整体情况正在逐渐好转,但由于公司出售了旗下有线
[半导体设计/制造]
智能音箱虚火: 月销不到2万台 代工厂垫付百万
  新浪科技 侯迪憬   当深圳南山区的方案商猛增到数百家时,嗅觉敏锐的掘金者意识到,创业公司已经沦为故事的配角。   是的,BATJ、小米、联想已悉数到场,大张旗鼓,发布会一场接一场,颇为热闹。做流量入口,搭建生态平台,成为家居终端,智能音箱被寄予众望。   在消费级市场,这注定是场群雄并起、跑马割地的游戏。于是,三年前创业做智能音箱的老王,带着团队摇身一变,改头换面为技术方案公司。   在供应链端,为了九牛一毛的订单利润,代工厂们你争我抢,甚至不惜垫付百万元赔本做买卖。“到最后都是为大公司白打工。反正这一波,我决定放弃”,在深圳供应链市场摸爬滚打五年了的老周表示,不愿淌这趟浑水。   “国内外用户习惯存在差
[家用电子]
智能音箱虚火: 月销不到<font color='red'>2</font>万台 代工厂垫付百万
MINI2440i2c驱动学习一
int main(int argc, char** argv) { struct eeprom e; fprintf(stderr, Open /dev/i2c/0 with 8bit moden ); die_if(eeprom_open( /dev/i2c/0 , 0x50, EEPROM_TYPE_8BIT_ADDR, &e) 0, unable to open eeprom device file (check that the file exists and that it's readable) ); fprintf(stderr, Reading 256 bytes from
[单片机]
购买4K电视时我们买的是什么?
    如同早年间3D电视(参数 图片 文章)在市场上的火爆,如今4K电视在市场上的销售前景更是有过之而无不及。然而在铺天盖地的广告和厂商宣传背后,在购买4K电视时我们买的是什么?     首先来说,电视作为作为家庭中最重要的一块屏幕之一,不仅承载着播放电视台节目源,现在的电视产品被赋予了越来越多的功能和技术创新,4K电视就是将屏幕物理分辨率提升至3840×2160,且能接收、解码、显示相应分辨率视频信号的电视。     就像提到的3D电视,经过多年的市场培育,销售情况并不如想象中的好,归结其原因在于相应节目源的短缺,整体产业链跟进缓慢。     家电行业分析师指出, 首先,电视台要播放4K节目,必须有足够的4K节目源
[家用电子]
Essential Phone获安卓8.0 beta 2更新
Essential今天为其PH-1智能手机推送了安卓8.0 Oreo beta 2更新,版本号为OPM1.170911.213。 Essential在Twitter上宣布了这一消息,并给出了beta 2更新的一些新功能,包括智能文本选择和画中画,当然,还有一些错误修复等。 其他一些更新包括十二月安全补丁、解决与Android Auto相关的问题,提高电池寿命等。
[手机便携]
linux 2.6.32.2 mini2440平台移植--内核移植、yaffs2文件系统移植
1.1 获取Linux内核源代码 有很多方式可以获取Linux内核源代码,如果你的linux平台可以上互联网,可以直接在命令行输入以下命令获取到Linux-2.6.32.2: #wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz 当然你也可以先在Windows系统下使用迅雷等工具下载完,再复制到linux中。 1.2 解压内核源代码 假定我们刚才把内核源代码下载到了/root/mini2440目录,执行以下解压命 令: #cd /opt/FriendlyARM/mini2440 #tar xvzf linux-
[单片机]
Synopsys发布DesignWare DDR4存储器接口IP
新思科技公司(Synopsys, Inc)日前宣布:其DesignWare DDR接口IP产品组合已经实现扩充,以使其包括了对基于新兴的DDR4标准的下一代SDRAM。通过在一个单内核中就实现对DDR4、DDR3以及LPDDR2/3的支持,DesignWare DDR解决方案使设计师能够在相同的系统级芯片(SoC)中,实现与高性能或者低功耗SDRAM的连接,它已经成为诸如用于智能手机和平板电脑的应用处理器等等许多SoC的一项关键需求。 “Synopsys对DDR4内存的支持,对构建一个强大的DDR4生态系统是一项重大贡献,”美光科技公司DRAM市场营销副总裁Robert Feurle说道。“DDR4为业界带来了实实在在的功耗与性
[家用电子]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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