基于s3c2410 2.6.25内核cs8900网卡驱动的移植

发布者:HeavenlySunset最新更新时间:2016-12-02 来源: eefocus关键字:s3c2410  内核  cs8900  网卡驱动  移植 手机看文章 扫描二维码
随时随地手机看文章

因为在驱动中使用的是虚拟地址,因此要首先将网卡的物理地址映射到虚拟地址

**************************************************************

1 。在include/asm-arm/plat-s3c24xx/common-smdk.h文件中添加

其中必须使用宏__phys_to_pfn 即将物理地址右移12位,跟踪源码可知 与struct map_desc中的pfn相关

#define pSMDK2410_ETH_IO  __phys_to_pfn(0x19000000)
#define vSMDK2410_ETH_IO  S3C2410_ADDR(0x04000000)
#define SMDK2410_ETH_IRQ   IRQ_EINT9
***********************************************************************************

2.我是在arch/arm/mach-s3c2410/mach-smdk2410.c  文件中添加
修改

static struct map_desc smdk2410_iodesc[] __initdata={
        {vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}//添加的
};

*****************************************************************************
4、修改 drivers/net/cs89x0.c

下面是我diff:'+'为我添加出 '-'为原来的代码
+****************************************************************************
 /* Event inputs bank 1 - ID 35/bit 3 */
 static unsigned int netcard_portlist[] __initdata = {CIRRUS_DEFAULT_BASE, 0};
 static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};

+#elif defined(CONFIG_ARCH_S3C2410) //Added weibing
+#include
+#include
+#include
+#include
+#include
+#include

+static unsigned int netcard_portlist[] __initdata = { vSMDK2410_ETH_IO +
DEFAULTIOBASE, 0};
+static unsigned int cs8900_irq_map[] = {SMDK2410_ETH_IRQ , 0, 0, 0};
+
+#ifdef request_region
+#undef request_region
+#endif

+#ifdef release_region
+#undef release_region
+#endif

+#define request_region(a,s,n) request_mem_region(a,s,n)
+#define release_region(a,s) release_mem_region(a,s)

 #else
 static unsigned int netcard_portlist[] __initdata =
    { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
*************************************************************************************

 

**************************************************************************
//其中BWSCON BANKCON3必须设置,其用法s3c2410中文手册
@@ -324,6 +348,10 @@
  io = dev->base_addr;
  irq = dev->irq;

+#ifdef CONFIG_ARCH_S3C2410 
+ __raw_writel((__raw_readl(S3C2410_GPGCON)&~(0x3<<2))|(0x2<<2),S3C2410_GPGCON);
+ __raw_writel((__raw_readl(S3C2410_EXTINT1)&~(0x7<<4))|(0x4<<4),S3C2410_EXTINT1);
+ __raw_writel(0x2211d110,S3C2410_BWSCON);
+ __raw_writel(0x1f7c,S3C2410_BANKCON3);
+#endif

  if (net_debug)
   printk("cs89x0:cs89x0_probe(0x%x)\n", io);
****************************************************************************


*************************************************************************** 
@@ -386,6 +414,18 @@
 {
  outw(value, base_addr + (portno << 1));
 }
+#elif defined(CONFIG_ARCH_S3C2410) 
+static u16
+readword(unsigned long base_addr, int portno)
+{
+ return __raw_readw(base_addr+portno);
+}
+
+static void 
+writeword(unsigned long base_addr, int portno,u16 value) 
+{ 
+ __raw_writew(value,base_addr+portno); 
+} 
 #else
 static u16
 readword(unsigned long base_addr, int portno)
***************************************************************************


**************************************************************************

此处设置MAC地址 ,其值不能随便设置。  其高32为指定的厂商号,即00 E0 4C 4D (为某牌网卡)
后16为可以随便设置,否则在使用ifconfig时出错。

因为在嵌入式版中没有EPROM所以MAC地址不能指定,需自己设置。
@@ -638,7 +678,18 @@
     the driver will always do *something* instead of complain that
     adapter_cnf is 0. */
 
-#ifdef CONFIG_SH_HICOSH4
+#if defined CONFIG_ARCH_S3C2410 
+ lp->force=FORCE_RJ45; 
+ lp->auto_neg_cnf=IMM_BIT; 
+
+ dev->dev_addr[0]=0x00; /*setMACaddress*/
+ dev->dev_addr[1]=0xE0;
+ dev->dev_addr[2]=0x4C;
+ dev->dev_addr[3]=0x4D;
+ dev->dev_addr[4]=0x10;
+ dev->dev_addr[5]=0x30;
+
+#elif defined CONFIG_SH_HICOSH4
  if (1) {
   /* For the HiCO.SH4 board, things are different: we don't
      have EEPROM, but there is some data in flash, so we go
*************************************************************************

 

***************************************************************************
@@ -1278,7 +1329,7 @@
  int i;
  int ret;
 
-#if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) /* uses irq#1, so this won't work */

+#if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) && !defined
(CONFIG_ARCH_S3C2410) /* uses irq#1, so this won't work */
  if (dev->irq < 2) {
   /* Allow interrupts to be generated by the chip */
 /* Cirrus' release had this: */
*************************************************************************************

*************************************************************************************
@@ -1309,7 +1360,7 @@
  else
 #endif
  {
-#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X)
+#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_ARCH_S3C2410)
   if (((1 << dev->irq) & lp->irq_map) == 0) {
    printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
                                dev->name, dev->irq, lp->irq_map);
*************************************************************************************

*************************************************************************************
@@ -1324,6 +1375,9 @@
   writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
 #endif
   write_irq(dev, lp->chip_type, dev->irq);
+#if defined(CONFIG_ARCH_S3C2410)
+  set_irq_type(dev->irq, IRQT_RISING);
+#endif
   ret = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);
   if (ret) {
    if (net_debug)
****************************************************************************************


************************************************************************************
@@ -1394,7 +1448,7 @@
  case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break;
         default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2);
         }
-#ifdef CONFIG_ARCH_PNX010X
+#if defined(CONFIG_ARCH_PNX0105) || defined(CONFIG_ARCH_S3C2410)
  result = A_CNF_10B_T;
 #endif
         if (!result) {
*******************************************************************************


4  燃后在make menuconfig 
  [*]   Ethernet (10 or 100Mbit)  --->
       -*-   EISA, VLB, PCI and on board controllers

                <*>   CS89x0 support

make zImage  成功

*********************************************************************************
注:

我在网上看到有人在  drivers/net/Kconfig文件中的config CS89*0配置信息中加入


depend  on ARCH_S3C2410  
我觉得没有必要的 

我验证了一下  确实没有必要的。


关键字:s3c2410  内核  cs8900  网卡驱动  移植 引用地址:基于s3c2410 2.6.25内核cs8900网卡驱动的移植

上一篇:s3c2410触摸屏在linux下的驱动分析 一
下一篇:s3c2410时钟信号:FCLK、HCLK和PCLK

推荐阅读最新更新时间:2024-03-16 15:22

MIPS32™内核助力DX1视频编码器
为 MIPS 今天宣布, 其可合成的 MIPS32 ™ 24Kc ™ Pro 处理器内核已应用于 Magnum Semiconductor 公司目前和未来的 DX1 专业视频编码器系列。 Magnum 还获得了 MIPS 的 System Navigator ™ JTAG 探针技术授权,为其客户创建定制调试工具,加速其基于 DX1 产品的上市时间。 Magnum 公司机顶盒和广播产品市场副总裁 Bob Saffari 表示:“ MIPS 科技提供针对数字家庭及更多应用的理想处理器内核,实现了高性能、低成本和低功耗的最佳平衡。 MIP
[新品]
cotex_m3内核提供的ITM串口打印调试
cotex_m3内核的ARM提供了ITM串口打印观测的功能,可以不用ARM单片机自己的串口就可在开发时候串口打印调试.节约了宝贵的内部资源,同时也为调试提供了方便.使用方法如下: 1 将下面的SWO_Printf.c加入到工程中 /*SWO_Printf*/ #include stdio.h /*1 ÔÚkeil mdkÖÐÑ¡ÔñʹÓÃswo; 2http://blog.csdn.net/xiaolei05/article/details/8526021 */ //Add ITM Port register definitions to your source code. #define ITM_Port8(n) (*((vo
[单片机]
cotex_m3<font color='red'>内核</font>提供的ITM串口打印调试
建立一个AVR的RTOS(6)时间片轮番调度法的内核
第六篇:时间片轮番调度法的内核 Round-Robin Sheduling 时间片轮调法是非常有趣的。本篇中的例子,建立了3个任务,任务没有优先级,在时间中断的调度下,每个任务都轮流运行相同的时间。如果在内核中没有加入其它服务,感觉上就好像是有三个大循环在同时运行。 本例只是提供了一个用时间中断进行调度的内核,大家可以根据自己的需要,添加相应的服务。 要注意到: 1,由于在时间中断内调用了任务切换函数,因为在进入中断时,已经将一系列的寄存器入栈。 2,在中断内进行调度,是直接通过 RJMP Int_OSSched 进入任务切换和调度的,这是GCC AVR的一个特点,为用C编写内核提供了极大的方便。 3,在阅读代码的同时,
[单片机]
S3C2410简易JTAG详解
常见的JTAG cable结构都比较简单,一端是DB25,接到电脑的并口上,中间经过74HC244和一些电阻实现电平转换(5V3.3V?)(也有比较猥琐的只用了 几个100 Ohm电阻的方案),另一端的JTAG header接到目标板的JTAG interface。 并口DB25原先主要是用来连接打印机,其引脚定义如下: 25 Pin D-Sub SPP SIGNAL DIRECTION IN/OUT 1 /Strobe In/Out 2 Data 0 Out 3 Data 1 Out 4 Data 2 Out 5 Data
[单片机]
怎样将一个开源游戏移植给一款32位微控制器
在上世纪90年代,游戏开始在计算机世界中蔓延。我还记得第一次玩Wolfenstein 3D,那是第一款3D的PC射击游戏。它由IdSoftware于1992年开发,是Doom的前身。Wolfenstein 3D证明PC的图形能力已足以满足这种类型3D动画的开发。90年代很多十几岁的年青人都会记得Wolfenstein 3D,因为这是第一款把3D世界带到他们PC上的游戏。90年代中期它的源码在互联网上公开,现在还能找到。现在我想再玩这款游戏,但不是在我的PC上。我将利用一只微控制器的功率和集成度。  随着微控制器性能增强,已经有可能用它们执行一些在90年代还需要PC处理能力的程序,而游戏领域的应用受这一进展影响很大。现在可以在某种
[工业控制]
怎样将一个开源游戏<font color='red'>移植</font>给一款32位微控制器
Linux-2.6.32.2内核在mini2440上的移植(九)---触摸屏驱动移植
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在内核中添加触摸屏驱动程序 Linux-2.6.32.2 内核也没有包含支持S3
[单片机]
Linux-2.6.32.2<font color='red'>内核</font>在mini2440上的<font color='red'>移植</font>(九)---触摸屏<font color='red'>驱动</font><font color='red'>移植</font>
MCU_S3C2410之UART分析
功能分析 寄存器分析 代碼分析 ///////////////////////////////////////////////////////////////////////UART 初始化///////////////////////////////////////////////////////////////////////////////////// void Uart_Init(int pclk,int baud) { int i; if(pclk == 0) pclk = PCLK; //APB IS USED FOR APB rUFCON0 = 0x0; //关闭UART0的FIFO rUFCON
[单片机]
MCU_<font color='red'>S3C2410</font>之UART分析
PPCBoot在MPC8250上的移植方法
摘要:The Bootloader(引导加载程序)是嵌入式系统CPU加电后即开始运行的第一段代码,它把Linux内核与硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要。PPCBoot是功能十分强大的Bootloader。深入研究了PPCBOOt的工作机理,详细分析了PPCBoot在基于MPC8250型处理器的嵌入式系统板上的移植方法、过程与移植要点。 关键词:Bootloader;PPCBoot;MPC8250;嵌入式系统 1 引言 Boodoader(引导加载程序)是CPU复位后和进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved