u-boot-2011.06移植

发布者:Meshulun最新更新时间:2024-07-10 来源: elecfans关键字:u-boot  移植 手机看文章 扫描二维码
随时随地手机看文章

{

       struct  s3c2440_nand *nand = s3c2440_get_base_nand();

       u32  mecc0;

 

       writel(readl(&nand->nfcont)| S3C2440_NFCONT_MECCL,&nand->nfcont);

 

       mecc0= readl(&nand->nfmecc0);

       ecc_code[0]= mecc0 & 0xff;

       ecc_code[1] = (mecc0 >> 8) &0xff;

       ecc_code[2] = (mecc0 >> 16) &0xff;

       ecc_code[3] =(mecc0 >> 24) & 0xff;

      

       debugX(1,'s3c2440_nand_calculate_hwecc(%p,):0xx 0xx 0xx 0xxn',

         mtd , ecc_code[0], ecc_code[1], ecc_code[2], ecc_code[3]);

 

       return 0;

}

该函数首先锁定main区ECC,然后读取寄存器NFMECC0,该寄存器存放着由硬件生成的main区ECC,最后把4个1字节的ECC存放到ecc_code数组内。

 

 

static int s3c2440_nand_correct_data(struct mtd_info *mtd, u_char*dat,

                                 u_char *read_ecc, u_char *calc_ecc)

{

       struct  s3c2440_nand *nand = s3c2440_get_base_nand();

       u32  meccdata0, meccdata1, estat0, err_byte_addr;

       int  ret = -1;

       u8  repaired;

 

       meccdata0= (read_ecc[1] << 16) | read_ecc[0];

       meccdata1= (read_ecc[3] << 16) | read_ecc[2];

       writel(meccdata0,&nand->nfmeccd0);

       writel(meccdata1,&nand->nfmeccd1);

 

      

       estat0= readl(&nand->nfestat0);  

 

       switch(estat0 & 0x3) {

       case  0:

              ret= 0;

              break;

 

       case  1:

             

              err_byte_addr= (estat0 >> 7) & 0x7ff;

              repaired= dat[err_byte_addr] ^ (1 << ((estat0 >> 4) & 0x7));

 

              printf('S3C NAND: 1 bit error detected at byte%ld. '

                     'Correcting from 0xx to0xx...OKn',

                     err_byte_addr, dat[err_byte_addr],repaired);

 

              dat[err_byte_addr]= repaired;

 

              ret= 1;

              break;

 

       case  2:

       case  3:

              printf('S3C NAND: ECC uncorrectable errordetected. '

                     'Not correctable.n');

              ret= -1;

              break;

       }

 

       return   ret;

}

该函数首先把read_ecc数组内的ECC存入寄存器NFMECCD0和寄存器NFMECCD1中,这样系统就会自动校验数据,并把状态放入寄存器NFESTAT0中,然后读取该寄存器的后4位,当为0时表示校验正确;当为1时表示发生了1位错误(该类错误可以校正),我们把它校正过来;当为2和3时表示发生其他类型的错误,这类错误是无法校正的。

 

通过以上内容的修改,我们就实现了NandFlash的硬件ECC。

 

ECC足以保证所读数据的正确性,并在有些情况下还可以修正错误,但它不能保证所写数据的正确性。为了保证所写数据的正确性,u-boot还可以通过在include/configs/gq2440.h文件内定义宏CONFIG_MTD_NAND_VERIFY_WRITE来实现把所写的数据再读取一遍,然后与被写入的数据之间进行比较来判断所写数据的正确性,这一过程是在drivers/mtd/nand/nand_base.c文件的nand_write_page函数内调用实现的。

6 DM9000移植

 实现了UBOOT中关于DM9000的部分,当然都是拿来主意,对于网卡我是相当陌生的。

首先,在include/configs/fl2440.h中去掉原先CS8900网卡的定义,再定义各种关于DM9000网卡的宏:  

  1. /*#define CONFIG_CS8900*/               /* we have a CS8900 on-board */  

  2. /*#define CONFIG_CS8900_BASE    0x19000300 */  

  3. /*#define CONFIG_CS8900_BUS16*/ /* the Linux driver does accesses as shorts */  

  4. #define CONFIG_DRIVER_DM9000 1   

  5. #define CONFIG_DM9000_BASE 0x20000300   

  6. #define DM9000_IO CONFIG_DM9000_BASE   

  7. #define DM9000_DATA (CONFIG_DM9000_BASE+4) /* the cmd pin is addr2*/   

  8. #define CONFIG_ETHADDR a8:00:3E:26:0A:5B   

  9. #define CONFIG_NETMASK 255.255.255.0   

  10. #define CONFIG_IPADDR 192.168.1.11   

  11. #define CONFIG_SERVERIP 192.168.1.234   

  12. #define CONFIG_NET_MULTI   

  13.   

  14. /* 

  15. #define CONFIG_NETMASK          255.255.255.0 

  16. #define CONFIG_IPADDR           10.0.0.110 

  17. #define CONFIG_SERVERIP         10.0.0.1 

  18. */  

   DM9000在FL2440的硬件连接原理图:

 

    图中可以看出DM9000连接到NGCS4,看下地址空间可以知道NGCS4的基址是0x20000000,所以网卡基址是0x20000300,后面这个300据他们说是DM9000内部寄存器是这样定义的,就现实来说我的网卡在这个基址上工作良好,所以应该是对的。

    CMD连接的是ADDR2,查DM9000手册上CMD为1时发送的是数据信息,所以,DM9000的数据地址是0x20000304,这个很容易理解。

    修改fl2440.c中的board_eth_init函数:

  1. #ifdef CONFIG_CMD_NET   

  2. int board_eth_init(bd_t *bis)  

  3. {  

  4.         return dm9000_initialize(bis);  

  5. }  

  6. #endif  

    修改drivers/net/dm9000x.c,将下面这段注释掉,至于原因,我也不清楚,不管。

  1. i = 0;  

  2. while (!(dm9000_phy_read(1) & 0x20)) {  /* autonegation complete bit */  

  3.         udelay(1000);  

  4.         i++;  

  5.         if (i == 10000) {  

  6.                 printf('could not establish linkn');  

  7.                 return 0;  

  8.         }  

  9. }  

  10.   

  11. /* see what we've got */  

  12. lnk = dm9000_phy_read(17) >> 12;  

  13. printf('operating at ');  

  14. switch (lnk) {  

  15. case 1:  

  16.         printf('10M half duplex ');  

  17.         break;  

  18. case 2:  

  19.         printf('10M full duplex ');  

  20.         break;  

  21. case 4:  

  22.         printf('100M half duplex ');  

  23.         break;  

  24. case 8:  

  25.         printf('100M full duplex ');  

  26.         break;  

  27. default:  

  28.         printf('unknown: %d ', lnk);  

  29.         break;  

  30. }  

  31. printf('moden');  

    注释这个函数中的内容,不然网卡会自动断开:

 

 

  1. static void dm9000_halt(struct eth_device *netdev)  

  2. {  

  3. #if 0   

  4.         DM9000_DBG('%sn', __func__);  

  5.   

  6.         /* RESET devie */  

  7.         dm9000_phy_write(0, 0x8000);    /* PHY RESET */  

  8.         DM9000_iow(DM9000_GPR, 0x01);   /* Power-Down PHY */  

  9.         DM9000_iow(DM9000_IMR, 0x80);   /* Disable all interrupt */  

  10.         DM9000_iow(DM9000_RCR, 0x00);   /* Disable RX */  

  11. #endif   

  12. }  

[1] [2] [3] [4] [5]
关键字:u-boot  移植 引用地址:u-boot-2011.06移植

上一篇:ALSA声卡10_从零编写之数据传输_学习笔记
下一篇:摄像头驱动学习

推荐阅读最新更新时间:2024-11-13 16:44

米尔瑞米派Remi Pi实时系统Ethercat移植 应用笔记
概 述 Remi Pi采用瑞萨RZ/G2L作为核心处理器,该处理器搭载双核Cortex-A55@1.2GHz+Cortex-M33@200MHz处理器,其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元(支持H.264硬件编解码),16位的DDR4-1600 / DDR3L-1333内存控制器、千兆以太网控制器、USB、CAN、SD卡、MIPI-CSI等外设接口,在工业、医疗、电力等行业都得到广泛的应用。 在开发阶段,建议配合核心板配套的评估套件 MYD-YG2L23-8E1D-120-C-REMI来加速开发。 实时内核设计 实时补丁我们选择RT-Preem
[嵌入式]
米尔瑞米派Remi Pi实时系统<font color='red'>与</font>Ethercat<font color='red'>移植</font> 应用笔记
linux2.6.32.2 mini2440平台移植-- UDA1341 音频驱动移植
1.6.1 在初始化文件中加入 UDA1341 设备结构 Linux-2.6.32.2已经完美的支持UDA1341音频芯片的驱动,我们只要在arch/arm/mach-s3c2440/mach-mini2440.c 文件中注册 UDA1341 平台设备的控制端口就可以了,打开 mach-mini2440.c,添加如下内容: //在文件首部添加头文件 #include sound/s3c24xx_uda134x.h //在 LCD 平台设备后面添加 UDA1341 设备结构 static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {
[单片机]
linux 2.6.22.6 移植
板子是国嵌的 GQ2440 主要移植步骤参考 韦东山老师的《嵌入式linux应用开发完全手册》 1、下载内核,打补丁 2、是用config_ok 配置内核 3、在 include/asm-arm/mach-types.h 中修改 MACH_TYPE_S3C2440 的值为 1999 因为MACH_TYPE_S3C2440 对应的机器结构在 arch/arm/mach-s3c2440/mach-smdk2440.c 中定义 所以 要把这个文件编译进内核,所以配置中有:System Type - s3c2440 Machines - SMDK2440 4、在arch/arm/mach-s3c2440/mach-smdk2440.c
[单片机]
从零开始移植U-boot到mini2440(三)——CPU初始化篇
经过前两节的准备,我们现在可以开始肝u-boot的代码了 U-boot版本:2020/5/2 编译环境:Ubuntu 16.04 arm-none-eabi-gcc version 4.9.3 20150529 (prerelease) (15:4.9.3+svn231177-1) 运行环境:mini2440(s3c2440,arm920t) 代码仓库:git@github.com:JingyeLi/u-boot_2440.git https://github.com/JingyeLi/u-boot_2440/tree/v0.1 u-boot.lds 这是一个很容易被人忽略的一个文件,包括我自己,以前一般用keil的时候都是自
[单片机]
WINCE在ARM平台的移植及驱动技术详解
  WINCE操作系统简介   WinCE操作系统是通用型的嵌入式操作系统,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,WindowsCE的图形用户界面相当出色。它1996年开始发布Windows CE 1.0版本,2004年7月发布了Windows CE .NET 5.0版本,目前用得最多的是WindowsCE .NET 4.2版本,其发展速度也是很快的,功能_上自不必描述,它的主要应用领域有PDA市场、PPC、Smartphone、 工业控制、医疗等。   操作系统移植的原因   为了更快的适应市场需求,在实际开发过程中,我们更倾向于移植操作系统而不是
[单片机]
WINCE在ARM平台的<font color='red'>移植</font>及驱动技术详解
移植程序的探讨
对于一些状态的集合,尽可能使用enum而不是#define 来定义。 如: enum {OFF = 0, ON = 1}; 远比 #define OFF 0 #define ON 1 好。 两种写法编译的效果是一样的,但是写程序及看程序的人员来说感觉就不一样了。用enum定义时,可以觉得OFF与ON是一个集合,有相关性(且可减少程序中#define的定义)。但用#define定义时,完全可认为OFF与ON不相干。特别是在程序中#define定义过多时,查找并理解它的意思都是一个痛苦。(如:uc/os,看见它的一大堆#define都头大,要完全明白那一堆定义都得花不少时间) 第二,程序中少用 #if #ifdef
[单片机]
基于S3C2440的DM9000网卡驱动的移植
0 引言   以太网(Ethernet)是一种计算机局域网组网技术。在局域网中,多个节点是共享传输介质的,这就必须由某种机制来决定某个时刻哪个设备占用传输介质来传输数据,因此,局域网的链路层要有介质访问控制的功能,即数据链路层分为逻辑链路控制LLC子层和介质访问控制MAC子层 。   本文主要研究基于S3C2440的DM9000网卡驱动的移植。网络对于嵌入式系统来说是必不可少的,但是S3C2440没有集成以太网接口,所以要想使S3C2440具备以太网的功能,就必须扩展网卡接口。本文选择外接DM9000,使其可以与以太网相连接,并完成DM9000网卡驱动的移植。 1 Linux网络驱动层次   Linux网络驱动可以划分为4层,
[单片机]
基于μC/OS-II操作系统在SPCE061A上的移植优化研究
SPCE061A是凌阳科技新推出的u课SP内核的十六位单片机,内嵌32K字 Flash的SPCE061A时是适用于数字语音识别应用领域的一种经济的选择。它支持精简指令系统,片内具有丰富的硬件资源。只需设计少量的片外扩展电路即可实现应用系统的硬件功能要求。μC/OS-II是一个源代码公开的精简的实时性很强的操作系统内核,移植性强,基于μC/OS-II来设计系统可以提高系统软件开发的效率。将μC/OS-II移植到SPCE061A上,在μC/OS-II的平台上设计软件对于提高相关嵌入式应用系统产品的质量,减少开发周期和降低成本方面有着重要的意义。 基于SPCE061A的硬件最小系统的设计 SPCE061A的系统结构 SPCE
[单片机]
基于μC/OS-II操作系统在SPCE061A上的<font color='red'>移植</font>优化研究
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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