linux 2.6.24.4在S3C2410上的移植(CS8900网卡驱动)(基于GEC2410)

发布者:HeavenlyWonder最新更新时间:2022-03-17 来源: eefocus关键字:linux  S3C2410  移植  CS8900  网卡驱动 手机看文章 扫描二维码
随时随地手机看文章

SMDK2410配置默认使用的是DM9000A的网卡,因此我们需要修改成CS8900A的网卡驱动.


网上找到移植方法有两种方法,一种是将以前版本的cs8900.c驱动拿过来用,只要在配置中增加ARM_CS8900选项,这个代码网上有很多,拿过来试了以下,的确没问题.


另一种方法是修改2.6.24.4自带的cs89x0.c驱动,这个驱动没有2410的直接支持,我们需要修改.


这里采用第二种方法.参考了网上很多方法,将我的步骤整理如下,如有错误,欢迎指正.


1.内核配置菜单

由于cs89x0驱动依赖于NET_PCI,见drivers/net/Kconfig

depends on NET_PCI && (ISA || MACH_IXDP2351 || ARCH_IXDP2X01 || ARCH_PNX010X)

这里我们在SMDK配置中选择上NET_PCI和ISA即可.

修改arch/arm/mach-s3c2410/Kconfig,增加NET_PCI和ISA的选择

config ARCH_SMDK2410

 bool "SMDK2410/A9M2410"

 select CPU_S3C2410

 select MACH_SMDK

 select NET_PCI

 select ISA

 help

    Say Y here if you are using the SMDK2410 or the derived module A9M2410

 

然后运行内核配置:

[matt@localhost linux-2.6.24.4]$ make menuconfig

在Device Drivers-Network Device Support中选中CS89x0 support

[*]Ethernet (10 or 100Mbit) --->

   .......

    -*-   EISA, VLB, PCI and on board controllers                    │ │  

      < >     Ansel Communications EISA 3200 support (EXPERIMENTAL)    │ │  

      < >     Apricot Xen-II on board Ethernet                         │ │  

      < >   Broadcom 440x/47xx ethernet support                        │ │  

      <*>   CS89x0 support               

                          

2.修改cs89x0.c

(1)修改include/asm/arch-s3c2410/map.h

添加如下CS8900地址(物理地址,虚拟地址)定义

/* CS8900 */

#define S3C24XX_VA_CS8900 S3C2410_ADDR(0x01300000)

#define S3C2410_PA_CS8900 (0x19000000)

#define S3C24XX_SZ_CS8900 SZ_1M

#define S3C24XX_PA_CS8900 S3C2410_PA_CS8900

这里定义了网卡使用的物理地址(S3C2410_PA_CS8900 )还有虚拟地址(S3C24XX_VA_CS8900),其中S3C2410_ADDR定义在include/asm/plat-s3c/map.h,实际上就是基址加偏移,CS8900的虚拟地址起始地址就等于0xf5300000

#define S3C_ADDR_BASE (0xF4000000)

#ifndef __ASSEMBLY__

#define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x))

#else

#define S3C_ADDR(x) (S3C_ADDR_BASE + (x))

#endif

(2)修改arch/arm/mach-s3c2410/mach-s3c2410.c

在static struct map_desc smdk2410_iodesc[] __initdata作如下修改,进行地址映射.

static struct map_desc smdk2410_iodesc[] __initdata = {

         IODESC_ENT(CS8900)

};

IODESC_ENT是一个宏,定义在include/asm/plat-s3c24xx/cpu.h

#define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }

展开实际上相当于

static struct map_desc smdk2410_iodesc[] __initdata = {

    {(unsigned long)S3C24XX_VA_CS8900,

      __phys_to_pfn(S3C24XX_PA_CS8900)

      S3C24XX_SZ_CS8900,

      MT_DEVICE};

}; 


(3)修改drivers/net/cs89x0.c文件

在声明头文件处添加头文件:

#ifdef CONFIG_ARCH_S3C2410

#include

#include

#include

#include

#endif 

在定义netcard_portlist和cs8900_irq_map代码中添加针对CONFIG_ARCH_S3C2410的定义,设置地址映射和IRQ,其中DEFAULTIOBASE(定义在cs89x0.h)是cs8900IO基址(0x300),这样cs8900的IO虚拟地址就是0xf5300300(0xf5300000+0x300)

#elif defined(CONFIG_ARCH_S3C2410)

static unsigned int netcard_portlist [] __initdata = { S3C24XX_VA_CS8900 + DEFAULTIOBASE, 0 };

static unsigned int cs8900_irq_map[] = { IRQ_EINT9, 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};

static unsigned int cs8900_irq_map[] = {10,11,12,5};

在cs89x0_probe函数irq = dev->irq一句后添加:

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);

#endif


这段代码用来设置s3c2410 GPIO寄存器,设置EINT9为外部中断(CS8900的中断输入),上升沿触发,寄存器具体含义可参考s3c2410的datasheet.


在cs89x0_probe1函数reset_chip(dev)后设置网卡的MAC地址,设置成与u-boot一样的MAC地址.

reset_chip(dev);

#ifdef CONFIG_ARCH_S3C2410

     lp->force = FORCE_RJ45;

     lp->auto_neg_cnf = IMM_BIT;


     dev->dev_addr[0] = 0x12; 

     dev->dev_addr[1] = 0x24;

     dev->dev_addr[2] = 0x56;

     dev->dev_addr[3] = 0x78;

     dev->dev_addr[4] = 0x9a;

     dev->dev_addr[5] = 0xbc;

#endif


在net_open函数的if (((1 << dev->irq) & lp->irq_map) == 0) 前的if判断添加针对CONFIG_ARCH_S3C2410的判断,如下:

#if !defined(CONFIG_ARCH_S3C2410) && !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X)

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

   ......


至此修改完毕,编译后生成uImage,tftp到开发板可以ping和被ping

NAND read: device 0 offset 1048576, size 2097152 ...

 2097152 bytes read: OK

## Booting image at 30008000 ...

   Image Name:   linux-2.6.24

   Created:      2010-05-25   7:22:51 UTC

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    1572120 Bytes =  1.5 MB

   Load Address: 30008000

   Entry Point:  30008040

   Verifying Checksum ... OK

   XIP Kernel Image ... OK


Starting kernel ...


Uncompressing Linux....................................................................................................... done, booting the kernel.

Linux version 2.6.24.4 (matt@localhost) (gcc version 3.4.5) #58 Tue May 25 15:20:22 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177

Machine: SMDK2410

Memory policy: ECC disabled, Data cache writeback

CPU S3C2410A (id 0x32410002)

S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz

S3C24XX Clocks, (c) 2004 Simtec Electronics

CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

CPU0: D VIVT write-back cache

CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256

Kernel command line: root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200

irq: clearing subpending status 00000002

PID hash table entries: 256 (order: 8, 1024 bytes)

timer tcon=00500000, tcnt a2c1, tcfg 00000200,00000000, usec 00001eb8

Console: colour dummy device 80x30

console [ttySAC0] enabled

Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)

Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)

Memory: 64MB = 64MB total

Memory: 61568KB available (2892K code, 317K data, 136K init)

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

net_namespace: 64 bytes

NET: Registered protocol family 16

S3C2410 Power Management, (c) 2004 Simtec Electronics

S3C2410: Initialising architecture

S3C24XX DMA Driver, (c) 2003-2004,2006 Simtec Electronics

DMA channel 0 at c4800000, irq 33

DMA channel 1 at c4800040, irq 34

DMA channel 2 at c4800080, irq 35

DMA channel 3 at c48000c0, irq 36

usbcore: registered new interface driver usbfs

usbcore: registered new interface driver hub

usbcore: registered new device driver usb

NET: Registered protocol family 2

IP route cache hash table entries: 1024 (order: 0, 4096 bytes)

TCP established hash table entries: 2048 (order: 2, 16384 bytes)

TCP bind hash table entries: 2048 (order: 1, 8192 bytes)

TCP: Hash tables configured (established 2048 bind 2048)

TCP reno registered

NetWinder Floating Point Emulator V0.97 (double precision)

JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.

io scheduler noop registered

io scheduler anticipatory registered (default)

io scheduler deadline registered

io scheduler cfq registered

s3c2410-lcd s3c2410-lcd: no platform data for lcd, cannot attach

s3c2410-lcd: probe of s3c2410-lcd failed with error -22

lp: driver loaded but no devices found

ppdev: user-space parallel port driver

Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled

s3c2410-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410

s3c2410-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410

s3c2410-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410

RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize

loop: module loaded

cs89x0:cs89x0_probe(0x0)

cs89x0.c: v2.4.3-pre1 Russell Nelson , Andrew Morton

eth0: cs8900 rev K found at 0xf5300300

cs89x0: Extended EEPROM checksum bad and no Cirrus EEPROM, relying on command line

cs89x0 media RJ-45, IRQ 53, programmed I/O, MAC 12:24:56:78:9a:bc

cs89x0_probe1() successful

cs89x0:cs89x0_probe(0x0)

cs89x0: request_region(0xf5300300, 0x10) failed

cs89x0: no cs8900 or cs8920 detected.  Be sure to disable PnP with SETUP

Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2

ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx

BAST NOR-Flash Driver, (c) 2004 Simtec Electronics

S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c2410-nand s3c2410-nand: Tacls=3, 30ns Twrph0=7 70ns, Twrph1=3 30ns

NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)

NAND_ECC_NONE selected by board driver. This is not recommended !!

Scanning device for bad blocks

Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":

0x00000000-0x00100000 : "U-Boot"

0x00100000-0x00400000 : "Linux Kernel"

0x00400000-0x02c00000 : "Root"

0x02c00000-0x04000000 : "User"

usbmon: debugfs is not available

s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

[1] [2]
关键字:linux  S3C2410  移植  CS8900  网卡驱动 引用地址:linux 2.6.24.4在S3C2410上的移植(CS8900网卡驱动)(基于GEC2410)

上一篇:linux-2.6.24.4中s3c2410和dma有关的函数的分析
下一篇:AT91RM9200Linux移植笔记(一)-交叉编译环境的建立

推荐阅读最新更新时间:2024-11-07 08:17

μC/GUI在MSGl9264液晶上的移植
摘要:介绍在MSP430F149单片机上移植,μC/CUI到MSCl9264液晶的过程, 详细阐述了,μC/GUI移植的原理以及在移植中应注意的事项。 关键词:μC/GUI MSGl9264 移植 MSP430F149 μC/GUI是美国Micrium公司出品的一款针对嵌入式系统的优秀图形软件。与μC/OS一样,μC/GUI具有源码公开、可移植、可裁减、稳定性和可靠性高的特点 。采用μC/GUI,开发人员可以很方便地在液晶上显示文本、曲线、图形以及各种窗口对象如按钮、编辑框、滑动条等,可完全产生类似于Windows的显示效果。另外,μC/GUI提供了在VC下的仿真库,这使得用户完全可以在Windows下仿真μC/GUI的各种效
[嵌入式]
基于Linux的嵌入式工业测控系统
1 、前言 随着网络控制技术的快速发展,工业以太网得到逐步完善,在工业控制领域获得越来越广泛的应用。工业以太网使用了TCP/IP协议,便于联网,并具有高速控制网络的优点。随着32位嵌入式CPU价格的下降,性能指标的提高,为嵌入式系统的广泛应用和Linux在嵌入式系统中的发展提供了广阔的空间。由于Linux的高度灵活性,可以容易地根据应用领域的特点对它进行定制开发,以满足实际应用需要。 2 、基于Linux的嵌入式系统在测控系统中的设计 计算机测控系统本质上就是计算机控制系统,为了对被控对象实施控制,对其参数和状态进行检测是必不可少的。 2.1 测控系统整体设计 测控系统以基于Linux的嵌入式系统为核心,应用程序可通过
[嵌入式]
s3c2410 __attribute__ ((interrupt ("IRQ")))
在中断里面,有这个函数,不太明白是怎么回事,于是网上找答案~原文是关于s3c44B0的,不过感觉都差不多吧~下面整理下~ ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采用中断比以往的查询方式占用更少的CPU时间,让系统提供更好性能。 查询S3C2410的手册,发现它有?(我不清楚有几种)种工作模式,每种工作模式是不一样的。其中最常用的,就是FIQ和IRQ模式。在使用中断之前,一定要初始化每种模式的栈指针SP,如果不初始化,肯定会出错。在CPU进行初始化时,就需要依次进入IRQ模式,初始化SP,接着再进入FIQ模式初始化
[单片机]
ARM-Linux驱动移植--Linux下烧写工具DNW和USB驱动安装
主机平台:Gentoo Linux 11.2 with linux kernel 3.0.6 硬件平台:FL2440(S3C2440)with linux kernel 2.6.35 原创作品,转载请标明出处 http://blog.csdn.net/yming0221/article/details/7211396 1、首先下载DNW for linux http://download.csdn.net/source/1011140 2、解压文件 、 3、编译主机的USB驱动 make -C /lib/modules/`uname -r`/build M=`pwd` modules 然后insmod
[单片机]
ARM-<font color='red'>Linux</font><font color='red'>驱动</font><font color='red'>移植</font>--<font color='red'>Linux</font>下烧写工具DNW和USB<font color='red'>驱动</font>安装
记:关于W806的Linux下基本教程(一)——环境建立与第一次烧写
0x00 前言 本文主要在Linux下实现了对于联盛德的W806芯片的SDK相关的操作,包括但不限于指定烧写、擦除、编译。 0x10 准备工作 首先需要一个Linux系统,这里笔者选择了Debian 11,按照默认的安装方式下,下面就可以在完成换源、准备账号,之后就可以安装一些依赖。这里笔者选择饱和安装,里面应该有一些东西不需要,但是也不怎么重要。 sudo apt install gcc-10-cross-base gcc-10-arm-linux-gnueabihf gcc-10-arm-linux-gnueabi cpp-10-arm-linux-gnueabi cpp-10-arm-linux-gnueabihf
[单片机]
记:关于W806的<font color='red'>Linux</font>下基本教程(一)——环境建立与第一次烧写
OpenCV2.0.0移植到ARM9(二)(JZ2440----S3c2440)
1、交叉编译libjpeg 为了使OpenCV能处理jpeg图像,我们必须事先交叉编译好libjpeg这里使用的版本是jpegsrc.v6b。 下载地址:https://sourceforge.net/projects/libjpeg/files/libjpeg/6b/ 这里使用的安装包:jpegsrc.v6b.tar.gz。 (1)解压、配置 jpegsrc.v6b.tar.gz放在/work/system/目录下. 解压:$tar –zvxf jpegsrc.v6b.tar.gz 进入目录:$cd jpeg-6b 在/work/system/目录下新建一个libjpeg-arm目录,命令为:$sudo mkdir
[单片机]
OpenCV2.0.0<font color='red'>移植</font>到ARM9(二)(JZ2440----S3c2440)
【嵌入式】从零开始移植U-boot到mini2440(二)——烧录篇
烧录 相关工具:j-link 软件:j-flash ARM V4.70 在编译成功之后,会生成u-boot.bin在output目录下,这个二进制文件就可以直接用于烧录。 烧录位置的确定方法 烧录的时候,我这里选择直接烧写在NOR中,看S3C2440的SPEC和开发板的原理图(找NOR的CE接口和S3C2440哪个引脚相连),当我们选择从NOR启动的时候,NOR Flash被映射到内存0x0000_0000 ~ 0x0800_0000,也就是说我们直接把bin文件烧录到0地址即可。 这里有一篇写的蛮好的blog,解释了ARM是如何通过NOR和NAND启动的。 https://www.cnblogs.com/aaron
[单片机]
【嵌入式】从零开始<font color='red'>移植</font>U-boot到mini2440(二)——烧录篇
移植u-boot-2010.03问题 --- 网卡DM9000
1,找到u-boot-2010.03/include/configs/smdk6410.h //#define CONFIG_NET_MULTI //#define CONFIG_CS8900 /*we have aCS8900on-board*/ //#define CONFIG_CS8900_BASE 0x18800300 //#define CONFIG_CS8900_BUS16 /*follow the Linux driver*/ /**然后添加DM9000网卡的宏定义---ip以及子网掩码等根据自己的需要修改***/ #defineCONFIG_NET_MULTI 1 #defineCONFIG_DM900
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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