S(含AX88796驱动及mdev支持)(2)

四、 禁止nand flash的ECC校验
修改文件drivers/mtd/nand/s3c2410.c文件,查找函数s3c2410_nand_init_chip(),在函数的最后一行,添加chip->ecc.mode=NAND_ECC_NONE;

五、增加yaffs2文件系统的支持 
1、下载Yaffs2到~/arm2410s目录下
下载地址:
2、解压Yaffs2并将其加入Linux内核(打补丁的方式)
lingd@Ubuntu:~/arm2410s$ tar xzvf yaffs2.tar.gz     
lingd@ubuntu:~/arm2410s$ cd yaffs2
lingd@ubuntu:~/arm2410s/yaffs2$ ./patch-ker.sh c ~/arm2410s/linux-2.6.24.7/

六、博创2410-S所配网卡AX88796(NE2000兼容网卡)驱动的移植。
1、修改arch/arm/Kconfig文件,增加ISA总线支持,使其在make menuconfig 时出现NE2000的网卡配置选项。

config ARCH_S3C2410
bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443"
select GENERIC_GPIO
select ISA       #lingd
help
Samsung S3C2410X CPU based systems, such as the Simtec Electronics
BAST (<>), the IPAQ 1940 or
the Samsung SMDK2410 development board (and derivatives).

2、修改include/asm-arm/arch-s3c2410/map.h文件。加入AX88796的地址映射。

/**********************lingd********************/
#define S3C2410_VA_ISA_NET   S3C2410_ADDR(0x02100000)
#define S3C2410_PA_ISA_NET   __phys_to_pfn(0x10000000)
#define S3C2410_SZ_ISA_NET   SZ_1M
/**********************lingd********************/

    说明:
    a、根据网上的资料,“#define S3C2410_VA_ISA_NET   S3C2410_ADDR(0x02100000)”的地址可以自己修改,只要不和别的虚拟地址冲突就行。我有试过将起改成“#define S3C2410_VA_ISA_NET   (0xd1000000)”,也就是博创的2.4.18的定义,也可以正常启动。
    b、“#define S3C2410_PA_ISA_NET   __phys_to_pfn(0x10000000)”这句困扰了我很久。一开始我的定义是“#define S3C2410_PA_ISA_NET   (0x10000000)”,所以启动后系统就死在了网卡的初始化上,出现“Unable to handle kernel paging request at virtual address ”的错误。后来我上网查找资料,才知道:原来实地址与虚地址的映射结构 smdk2410_iodesc 里有所变化。第二个参数从原来的 unsigned long physical 变为 unsigned long pfn (Page Frame Number 页帧号)。而从 smdk2410_iodesc 传入的S3C2410_PA_ISA_NET 仍然是一个 physical 值,因此出现以上的错误。只要在物理地址前加上“__phys_to_pfn”就可以解决这个问题。较详细的讲解请看我的参考资料

3、修改arch/arm/mach-s3c2410/mach-smdk2410.c文件。在smdk2410_iodesc 中加入AX88796的地址信息。
static struct map_desc smdk2410_iodesc[] __initdata = {
/* nothing here yet */

/**********************lingd********************/
        {
                .virtual        = S3C2410_VA_ISA_NET,
                .pfn          = S3C2410_PA_ISA_NET,
                .length        = S3C2410_SZ_ISA_NET,
                .type          = MT_DEVICE,
        }
/**********************lingd********************/

};


4、修改网卡驱动的主要文件drivers/net/ne.c
(1)、添加头文件和定义

#include <asm/system.h>
#include <asm/io.h>

/**********************lingd********************/
#include <linux/irq.h>
#include <asm/arch-s3c2410/map.h>
#include <asm/arch-s3c2410/regs-mem.h>
#include <asm/arch-s3c2410/irqs.h>
#include <asm/arch-s3c2410/hardware.h>
#include <asm/arch-s3c2410/regs-gpio.h>

#define AX88796_BASE   (vAX88796_BASE+0x200)
#define AX88796_IRQ    IRQ_EINT2
#define pAX88796_BASE    S3C2410_PA_ISA_NET
#define vAX88796_BASE    S3C2410_VA_ISA_NET
#define EXTINT_OFF  (IRQ_EINT4 - 4)
/**********************lingd********************/

......

在static struct { const char *name8, *name16; unsigned char SAprefix[4];}
bad_clone_list[] __initdata 中增加AX88796 的MAC地址前三位(不一定需要):
{"AX88796", "NE2000-compatible", {0x08, 0x08, 0x08}},       //lingd



(2)、确保定义总线宽度为16位。


#if defined(CONFIG_PLAT_MAPPI)
#  define DCR_VAL 0x4b
#elif defined(CONFIG_PLAT_OAKS32R)  || \
   defined(CONFIG_TOSHIBA_RBTX4927) || defined(CONFIG_TOSHIBA_RBTX4938)
#  define DCR_VAL 0x48      /* 8-bit mode */
#else
#  define DCR_VAL 0x49
#endif

修改为

#if 0
#if defined(CONFIG_PLAT_MAPPI)
#  define DCR_VAL 0x4b
#elif defined(CONFIG_PLAT_OAKS32R)  || \
   defined(CONFIG_TOSHIBA_RBTX4927) || defined(CONFIG_TOSHIBA_RBTX4938)
#  define DCR_VAL 0x48      /* 8-bit mode */
#else
#endif
#endif
#  define DCR_VAL 0x49

   

(3)、在do_ne_probe函数中增加配置总线参数、基地址和中断的语句(其参数参考 刘淼 的书)

static int __init do_ne_probe(struct net_device *dev)
{
unsigned long base_addr = dev->base_addr;
#ifdef NEEDS_PORTLIST
int orig_irq = dev->irq;
#endif
/**********************lingd********************/
static int once=0;
if (once) {
return -ENXIO;
}

unsigned int value;

value = __raw_readl(S3C2410_BWSCON);
value &= ~(S3C2410_BWSCON_WS2|S3C2410_BWSCON_ST2|S3C2410_BWSCON_DW2_32);
value |= (S3C2410_BWSCON_ST2|S3C2410_BWSCON_DW2_16);
__raw_writel(value, S3C2410_BWSCON);
value=0;
value = (S3C2410_BANKCON_Tacs4|S3C2410_BANKCON_Tcos4|S3C2410_BANKCON_Tacc14|S3C2410_BANKCON_Tcoh4|S3C2410_BANKCON_Tcah4|S3C2410_BANKCON_Tacp6|S3C2410_BANKCON_PMCnorm);
__raw_writel(value,S3C2410_BANKCON2);
set_irq_type(AX88796_IRQ,IRQ_TYPE_LEVEL_LOW );
s3c2410_gpio_cfgpin(S3C2410_GPF2, S3C2410_GPF2_EINT2);
s3c2410_gpio_pullup(S3C2410_GPF2, 0);

if(base_addr==0){
dev->base_addr = base_addr = AX88796_BASE ;
dev->irq = AX88796_IRQ;
once++;
}
/**********************lingd********************/

     SET_MODULE_OWNER(dev);


     /* First check any supplied i/o locations. User knows best. <cough> */
     if (base_addr > 0x1ff) /* Check a single specified location. */
         return ne_probe1(dev, base_addr);
     else if (base_addr != 0)    /* Don't probe at all. */
         return -ENXIO;

......

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwsgdy.html