linux-2.6.14下cs8900的移植(部分板子是ne2000,可以参考)

1. 拷贝文件cs8900.c cs8900.h到 linux2.6.14.1/drivers/net/

进入目录cs8900

cp cs8900.c ../linux-2.6.14.1/drivers/net/

cp cs8900.h ../linux-2.6.14.1/drivers/net/

2. 修改Kconfig

vi ../linux-2.6.14.1/drivers/net/Kconfig

找到

config NET_ETHERNET

        bool "Ethernet (10 or 100Mbit)"


加入以下内容

config ARM_CS8900
tristate "CS8900 support"
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
help

3. 修改Makefile文件

vi ../linux-2.6.14.1/drivers/net/Makefile

找到 obj-$(CONFIG_CS89x0) += cs89x0.o

加入以下内容

obj-$(CONFIG_ARM_CS8900) +=cs8900.o

   4.加入cs8900在内存中的位置

   在 linux-2.6.14.1/include/asm-arm/mach-s3c2410 中创建regs-cs8900.h ,其内容如下

   #ifndef _INCLUDE_REGS_CS8900_H

   #define _INCLUDE_REGS_CS8900_H

   #i nclude <linux/config.h>

   #define pSMDK2410_ETH_IO      0x19000000

   #define vSMDK2410_ETH_IO    0xE0000000    #define SMDK2410_ETH_IRQ    IRQ_EINT9   #endif // _INCLUDE_REGS_CS8900_H   pSMDK2410_ETH_IO 的具体地址要参考你的实验板,我的试验板是由nGCS3和A24口组合控制芯片的IO读写或内存读写,在我的开发板上是IO读写。虚拟地址参考了系统板自 带内核中设定的地址,没有改动。看网上有人说虚拟地址可以随便设只要不冲突就行,具体是否可行,没有试过,如果有人试过,告述我一声,大家一块学习。呵 呵...中断源也要看你的试验板连了哪跟中断口。5 加入cs8900虚拟地址到物理地址的转换
  vi linux-2.6.14.1/arch/arm/mach-s3c2410/mach-smdk2410.c

加入头文件

#i nclude <asm/arch/regs-cs8900.h>

   加入地址转换信息, 找到smdk2410_iodesc[]结构数组,加入

{vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE},到这里,cs8900的移植就完工了。修改内核选中cs8900,make就可以了。附件:uploadfile-/2007-7/71393784.rar


基本步骤(引用):
============ for 2.6.16=================
(1) #cp cs8900.c ./drivers/net/arm/
        #cp cs8900.h ./drivers/net/arm/
   
   并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下
两条语句:
__raw_writel(0x2211d110,S3C2410_BWSCON);
__raw_writel(0x1f7c,S3C2410_BANKCON3);


(2)修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容:
Config ARM_CS8900
   tristate "CS8900 support"
   depends on NET_ETHERNET && ARM && ARCH_SMDK2410
help
   Support for CS8900A chipset based Ethernet cards. If you have a network
   (Ethernet) card of this type, say Y and read the Ethernet-HOWTO, available
   from as well as .
   To compile this driver as a module, choose M here and read
. The module will be
   called cs8900.o.
  
注:内核系统配置文件由2.4版本的config.in变成了2.6版本Kconfig文件,在这个文件里
面添加如上内容,则在运行make menuconfig或者make xconfig命令的时候就会出现:
        [ ]   CS8900 support
这一选项。

(3)修改drivers/net/arm/目录下的Makefile文件,在最后添加如下内容:

      obj-$(CONFIG_ARM_CS8900)    += cs8900.o
     
注:2.6版本内核的Makefile文件也与2.4版本的有所不同。添加以上语句,就会使内核在编
译的时候根据配置将cs8900A的驱动程序以模块或静态的方式编译到内核当中。

(4)在/arch/arm/mach-s3c2410/mach-smdk2410.c文件中,找到smdk2410_iodesc[]结构
数组,添加如下如下内容:

{vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE}

修改之后变成了:

static struct map_desc smdk2410_iodesc[] __initdata = {
       /* nothing here yet */
        /* Map the ethernet controller CS8900A */       
        {vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE}
};

结论:

关于linux-2.6.16的头文件就应该改成

#ifndef _INCLUDE_SMDK2410_H_
#define _INCLUDE_SMDK2410_H_
#include
#define pSMDK2410_ETH_IO __phys_to_pfn(0x19000000)
#define vSMDK2410_ETH_IO 0xE0000000
#define SMDK2410_ETH_IRQ   IRQ_EINT9


=============================for 2.6.11 ==================
#define pSMDK2410_ETH_IO 0x19000000
在S3C2410X 中BWSCON是Bus width & wait controlregister(总线宽度及等待控制寄存器),这个寄存器控制着系统地址空间内(包括bank0-bank7)的总线数据宽度以及是否等 待。BANKCONn(n=0~7)寄存器是Bank controlregister。这个寄存器控制着处于某个bank区间内的总线的地址setup的时钟周期,片选信号的保持时间,访问周期等。这个两个 寄存器中每个位的含义可以参见S3C2410X数据手册的5-13~5-15,在此不加以详叙。
查看了cpu的数据手册、开发板原理图以及2.4的驱动程序之后,发现在2.4的驱动程序中的以下两条语句:
BWSCON = (BWSCON & ~(BWSCON_ST3 | BWSCON_WS3 | BWSCON_DW3)) | (BWSCON_ST3 | BWSCON_WS3 | WSCON_DW(3, BWSCON_DW_16));
BANKCON3= BANKCON_Tacs0 | BANKCON_Tcos4 | BANKCON_Tacc14 | BANKCON_Toch1 | BANKCON_Tcah4 | BANKCON_Tacp6 | BANKCON_PMC1;
实际上是对地址区间BANK3(因为开发板用的的是nGCS3,处于BANKCON3区间内)进行了设置。
先 看对BWSCON的设置,这条语句实际上是要使BWSCON中除了ST3、WS3和DW3这四个位的其它各位得到保护,使ST3、WS3和DW3这四个位 清零,然后再对ST3、WS3和DW3这四个位进行设置,经过这条语句之后,ST3、WS3和DW3这四个位被设置成了1101(二进制),意思就是对 BANK3采用cpu引脚(A17、B16、C15、A16,这几个引脚都分别有三种信号表示意义)的nBE信号(具体什么意思,本人也不知道),对 BANK3使用WAIT enable,使用16位的数据总线宽度。
其次就是对BANKCON3寄存器的设置。这条语句将BANKCON3设置成了0001 1111 0111 1100。(各个位的意思,我也没弄明白什么意思,估计就是设置各种操作的时钟周期数目。)
清楚了驱动程序对寄存器的设置之后,就想到应该在vivi里面对cpu的这几个内存控制寄存器进行设置,于是找到vivi源代码中include/platform/目录下的smdk.h文件中对寄存器的初始化值的设置,修改之后如下:
/*#define vBWSCON               0x22111120*/
#define vBWSCON                 0x2211d110
#define vBANKCON0               0x00000700
#define vBANKCON1               0x00000700
#define vBANKCON2             0x00000700
#define vBANKCON3               0x00001f7c
#define vBANKCON4             0x00000700
#define vBANKCON5               0x00001f7c
#define vBANKCON6               0x00018005
#define vBANKCON7               0x00018005
#define vREFRESH                0x008e0459
#define vBANKSIZE               0xb2
#define vMRSRB6                 0x30
#define vMRSRB7                 0x30
重 新通过JTAG口下载vivi,重新启动内核后,发现问题依然存在,于是就想到在驱动程序里面添加对内存控制器的设置。最开始是想模仿2.4的驱动程序那 样,找到各个相应的宏去代替2.4驱动程序里的宏,在memset()函数之前添加,但是编译的时候出错,出错信息是:
LValue incorrect in assignment
跟踪内核的代码发现对S3C2410_BWSCON、S3C2410_BANKCON3宏的定义分别返回的其实是一个常量,分别是0xf0100000和0xf0100010,这个常量是右值,不能当左值。因此就想到采用如下直接对地址进行赋值的方式对寄存器进行设置:
*(volatile unsigned short __force *)(0xf0100000)=(0x2211d110);
*(volatile unsigned short __force *)(0xf0100010)=(0x00001f7c);
后来运行内核时发现,驱动程序初始化到了memset()函数之后,上述两条语句之前就停止不动了(疑问:不知道这是什么原因)。最后查找linux内核代码找到了__raw_writell(v,a)这样一个函数,于是就将上述两条语句替换成:
__raw_writel(0x2211d110,S3C2410_BWSCON);
__raw_writel(0x1f7c,S3C2410_BANKCON3);

=================note:=======================
在smtd2410中发现网卡用的是cpu的nGCS3片选信号,该片选信号对应的地址空间起始地址是0x18000000,而在驱动中对用的是0x19000000,


链结:
http://bibu.blogchina.com/4914641.html
http://xw009.cnblogs.com/archive/2005/08/04/207687.html
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=546995&page=0&view=collapsed&sb=5&o=all&fpar
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值