3.移植uboot-使板卡支持nor、nand

发布者:剑戟辉煌最新更新时间:2021-07-30 来源: eefocus关键字:移植  uboot  nor  nand 手机看文章 扫描二维码
随时随地手机看文章

在上一章,我们添加了nor,nand启动后,uboot启动出如下图所示:

上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码, 代码如下所示(位于arch/arm/lib/board.c):


/*第二阶段*/

void board_init_r(gd_t *id, ulong dest_addr)        //gd    uboot重定位地址

{

     ... ...

  puts("Flash: ");                        //打印flash:

  flash_size = flash_init();                    //初始化nor_flash

  if (flash_size > 0)

  {

       ... ...

       print_size(flash_size, "n");            //打印nor_flash的大小

  }

  else

  {

    puts(failed);                //打印数组failed[]="*** failed ***n";

    hang();                        //进入while中,并打印: ### ERROR ### Please RESET the board ###     

  }

#if defined(CONFIG_CMD_NAND)

       puts("NAND:  ");                                      //打印NAND:

       nand_init();                                               //初始化nand_flah

... ...

}


从上面代码看出, board_init_r()会来初始化nor,由于新的uboot不支持nor,所以flash_init()初始失败,然后打印一串错误代码后,等待复位.


由于2440在nand启动时,会自动装载nand的前4k内容,所以不支持norflash,因为nor的前4k内容被nand占用.


所以修改上面代码,避免nand启动一直卡住,将:


else

{

  puts(failed);                //打印数组failed[]="*** failed ***n";

  hang();                        //进入while中,并打印: ### ERROR ### Please RESET the board ###     

}


改为:


else

{

  puts("0  KBrn");                //打印0 KB

}


1.接下来,下章便来修改代码,使uboot支持读写norflash


1.1首先在include/common.h中添加:


#define DEBUG     //调试模式


然后使用nor启动新的uboot,打印出调试信息:

打印出norflash的厂家ID=0xC2,设备ID=0x2249,显然uboot匹配读出的ID没有成功.


搜索JEDEC PROBE字段,找到位于board_init_r()->flash_init()->flash_detect_legacy():

如上图所示,该函数会进入board_init_r()->flash_init()->flash_detect_legacy()->jedec_flash_match(),里面会通过两个ID来匹配jedec_table[].


1.2接下来向jedec_table[]里添加norflash:MT29LV160DB(位于drivers/mtd/jedec_flash.c)


代码如下:


     /*MX29LV160DB*/

       {

       .mfr_id         = (u16)MX_MANUFACT,        //厂家ID0x00C200C2 (读nor,便是0xc2)

       .dev_id         = 0x2249,                          //设备ID

       .name           = "MXIC MX29LV160DB",

       .uaddr          = {

           [1] = MTD_UADDR_0x0555_0x02AA /* 数组[1]表示是16位nor,解锁地址为:0x555,0x2AA */

        },

       .DevSize        = SIZE_2MiB,

       .CmdSet         = P_ID_AMD_STD,

       .NumEraseRegions= 4,                      //4种不同的扇区规格

       .regions        = {

       ERASEINFO(16*1024, 1),

       ERASEINFO(8*1024, 2),

       ERASEINFO(32*1024, 1),

       ERASEINFO(64*1024, 31),

                          }

           },


重新烧写看打印信息,出现这么一段ERROR:


ERROR:too many flash sectors


说flash的扇区太多了,搜索找到位于drivers/mtd/jedec_flash.c中:

显然是CONFIG_SYS_MAX_FLASH_SECT宏小于我们flash的扇区,所以打印ERROR。


所以修改CONFIG_SYS_MAX_FLASH_SECT宏定义(位于include/configs/smdk2440.h),并去掉之前定义的DEBUG调试宏(位于include/common.h)


1.3然后重新烧写


输入flinfo命令(flash info),就能查看flash的信息了:

然后通过uboot命令,检测nor的读写是否正确:


protect off all 

erase 80000 +7ffff              

cp.b 30000000 80000 1000             //烧写在另一个位置

cmp.b 30000000 80000 1000              //比较,是否读写正确


2.接下来继续修改代码,使uboot支持NandFlash


2410的NandFlash位于drivers/mtd/nand/s3c2410_nand.c


2.1 首先复制s3c2410_nand.c,改为s3c2440_nand.c


改Makefile,如下图所示:

2.2 在上一章分析过CONFIG_NAND_S3C2410宏,位于include/configs/smdk2440.h:

如上图所示,其中CONFIG_CMD_NAND宏:表示uboot是否支持nand,在上章里,我们把它屏蔽了,接下来便取消屏蔽CONFIG_CMD_NAND宏。


2.3继续添加对CONFIG_NAND_S3C2440宏的支持,将:


#ifdef CONFIG_CMD_NAND

#define CONFIG_NAND_S3C2410

#define CONFIG_SYS_S3C2410_NAND_HWECC

#define CONFIG_SYS_MAX_NAND_DEVICE  1

#define CONFIG_SYS_NAND_BASE              0x4E000000

#endif


#ifdef CONFIG_CMD_NAND


 

#ifdef CONFIG_S3C2410          

#define CONFIG_NAND_S3C2410

#define CONFIG_SYS_S3C2410_NAND_HWECC

#else                                                                   // CONFIG_S3C2440      

#define CONFIG_NAND_S3C2440    

#define CONFIG_SYS_S3C2440_NAND_HWECC

#endif


#define CONFIG_SYS_MAX_NAND_DEVICE      1

#define CONFIG_SYS_NAND_BASE            0x4E000000

#endif


由于smdk2410.h中定义的是CONFIG_S3C2410,而smdk2440.h中定义的是CONFIG_S3C2440,所以便会根据上面的#ifdef来动态定义宏


 


2.4 然后来看看nand的流程(和linux的nand驱动有很多相似的地方):


1)uboot重定位后进入第二阶段board_init_r():


void board_init_r(gd_t *id, ulong dest_addr)        //gd    uboot重定位地址

{

  ... ...

#if defined(CONFIG_CMD_NAND)                      //需要定义CONFIG_CMD_NAND宏

       puts("NAND:  ");

       nand_init();            /* go init the NAND */

#endif

 ... ...

}


2)进入nand_init():


void nand_init(void)

{

... ...

for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)      //在2.3小节里,该宏为1

nand_init_chip(i);                     

printf("%lu MiBn", total_nand_size / 1024);

... ...

}


3)进入nand_init()->nand_init_chip(0):


static void nand_init_chip(int i)

{

    struct mtd_info *mtd = &nand_info[i];      //mtd_info属于软件的一部分,实现用户层读写等操作

    struct nand_chip *nand = &nand_chip[i];     //属于底层,保存对nand的硬件相关操作,它是mtd_info结构体的priv私有成员

    ulong base_addr = base_address[i];           //获取nand寄存器基地址,等于0x4E000000

    int maxchips = CONFIG_SYS_NAND_MAX_CHIPS;


    if (maxchips < 1)

           maxchips = 1;


    mtd->priv = nand;     //设置私有成员nand_chip

    ... ...

    if (board_nand_init(nand))                   //位于s3c2440_nand.c,该函数会设置nand_chip结构体的成员

           return;


    if (nand_scan(mtd, maxchips)) //通过mtd->priv来开启nand片选,来获取nand的型号,类型等.并填充mtd结构体下其它的成员.

           return;


    nand_register(i);     //注册nand,使uboot支持对nand的读写操作

}


这个nand_chip结构体和我们之前学的linux下的nand驱动章节里的nand_chip一摸一样,流程也非常相似.


由于在2.1小节里,该函数所在的文件s3c2440_nand.c是从s3c2410_nand.c复制过来的,所以接下来便修改s3c2440_nand.c (位于drivers/mtd/nand目录下)


2.5 修改s3c2440_nand.c(参考2410数据手册和2440数据手册)


1)首先将所有带2410字的变量都替换为2440


2)修改board_nand_init()


参考以前写的nand驱动,将


  tacls = 4;

    twrph0 = 8;

    twrph1 = 8;

    cfg = S3C2440_NFCONF_EN;                       //启动nand控制器

    cfg |= S3C2440_NFCONF_TACLS(tacls - 1);

    cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);

    cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);

    writel(cfg, &nand_reg->nfconf);


改为:


    tacls = 0;                      //10ns    

    twrph0 = 1;                  //20ns

    twrph1 = 0;                  //10ns


    nand_reg->nfconf = (tacls<<12) | (twrph0<<8) | (twrph1<<4); //设置时序

    nand_reg->nfcont=(1<<1)|(1<<0); // bit1:关闭片选(),       bit0:开启nand flash 控制器


2)添加nand_chip结构体成员


nand->select_chip=s3c2440_select_chip;             //设置CE


然后并写一个s3c2440_select_chip()函数


/*nand flash  :CE */


static void s3c2440_select_chip(struct mtd_info *mtd, int chipnr)

{

        if(chipnr==-1)          //CE Disable

       {

        my_regs->nfcont|=(0x01<<1);               //bit1置1

       }

        else                         //CE Enable

       {

        my_regs->nfcont&=~(0x01<<1);        //bit1置0 

       }           


}


3)屏蔽带硬件ECC的相关操作


将:


#ifdef CONFIG_S3C2410_NAND_HWECC

nand->ecc.hwctl = s3c2440_nand_enable_hwecc;

nand->ecc.calculate = s3c2440_nand_calculate_ecc;

nand->ecc.correct = s3c2440_nand_correct_data;

nand->ecc.mode = NAND_ECC_HW;

nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;

nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;

#else

nand->ecc.mode = NAND_ECC_SOFT;

#endif


改为:


nand->ecc.mode = NAND_ECC_SOFT;               //使用软件ECC

[1] [2]
关键字:移植  uboot  nor  nand 引用地址:3.移植uboot-使板卡支持nor、nand

上一篇:4.移植uboot-使uboot支持DM9000网卡
下一篇:2.移植uboot-添加2440单板,并实现NOR、NAND启动

推荐阅读最新更新时间:2024-11-17 21:33

东芝存储器厂房被曝预计7月中旬才能复工,晶圆报价受影响
美国西部数据与日本东芝合资、全球第2大NAND Flash厂东芝存储器三重县四日市厂区6月15日出现长达约13分钟停电状况,包含新Fab2、Fab3、Fab4、Fab5以及Fab6在内的全体厂区皆受冲击,目前整体厂房的运营仍未完全复工,预计7月中才得以恢复运作。 西部数据在6月28日针对此事件发布公开说明,表示约当6 ExaByte(EB)的产能将受冲击,缺货主要会反映在今年第3季,东芝则未作表示。由于该厂区的恢复能力,远不如业界对先进半导体厂恢复运作的合理预期,集邦科技存储器储存研究(DRAMeXchange)判断,东芝下游客户对于厂房稳定性的信任程度恐打折。 针对此次停电事件,集邦调整对第3季价格走势评估,其中,
[嵌入式]
东芝存储器厂房被曝预计7月中旬才能复工,晶圆报价受影响
s3c6410学习笔记-烧写uboot+构建文件系统
一、进入目录 #cd u-boot-1.1.6_sndk6410 二、SD卡 make clean make distclean vim Makefile (/CROSS 修改cross-compile= ....) vim /include/configs/smdk6410.h (改205行名字,改448行启动方式为SD卡) make smdk6410_config make ./mkmovi (生成u-boot-movi.bin) ./write_sd /dev/sdb u-boot-movi.bin (写到SD卡) 三、nandfl
[单片机]
西数与铠侠闪存业务合并 打造全球最大NAND制造商
西部数据目前就NAND闪存生产业务合并进行谈判,目前即将敲定最终计划。他们将打造全球最大的NAND闪存制造商。据悉,西数与铠侠将加强双方在NAND闪存领域的竞争力,挑战三星的市场领导者地位,同时也会对SK海力士和美国构成更大的挑战。 不过,两家厂商在合并的道路上仍会面临许多挑战,比如全球各地监管机构的审查,以及竞争对手及相关利益者的反对。 此外,根据TrendForce的数据,2023年第二季度里,铠侠占据19.6%的市场份额,而西部数据为14.7%,三星和SK海力士分别是31.1%和17.8%。 因此,铠侠和西部数据合并后,市场份额达到了34.3%,超越三星成为最大的NAND闪存供应商。
[半导体设计/制造]
移植Linux 2.6.39至Micro2440开发板
所有版本的Linux源代码压缩包都可以在https://github.com/torvalds/linux/下载。本文档使用的Linux源码为linux-2.6.39(网盘:http://pan.baidu.com/s/1dDxjNl3)。 1. 解压源码 解压源码到工作目录,这里使用的是p7zip工具中的7za命令,使用unzip命令会提示“File name too long”错误。 # 进入工作目录 # 7za x /media/sf_ShareDIR/MICRO2440/source/linux-2.6.39.zip # cd ./linux-2.6.39 2. Linux内核编译 在Linux 2.6
[单片机]
<font color='red'>移植</font>Linux 2.6.39至Micro2440开发板
爆一加Nord N10 5G新机采用了矩形后置四摄
一加即将于几天后发布定价实惠的 Nord N10 和 N100 5G 智能机新品,但网络上已经泄露了它的规格、价格、设计等细节。此外据说 Nord N10 5G 新机采用了类似 OnePlus 8T 的矩形后摄模组,而非沿用 OnePlus Nord 的设计风格,且爆料人暗示 N10 5G 将有某种蓝色可供消费者选择。 遗憾的是,Max J。 并未在 Twitter 上分享更多细节(比如 Nord N10 5G 新机的正面设计)。   早前传闻称,该机将搭载骁龙 690 芯片组(也是高通首款支持 5G 网络的 600 系列 SoC)。   作为对比,OnePlus Nord 机型搭载的是并不支持 5G 网络的骁龙
[手机便携]
HLK-W801-LVGL8之源码移植
前言 最近入手的一块HLK-W801开发板,加上早年买的一个ALIENTEK开发板中附带一块TFTLCD触摸电阻屏,看到网上的大神们都已经玩得很溜,刚好这样有条件用W801来玩一下基于LVGL的GUI开发,跃跃欲试。 先完成移植工作,看到官网和网上资料也很多,可以帮助自己更快的完成这个工作,主要内容包括三部分: 1. 源码移植 2. LCD驱动移植 3. 触摸驱动移植 本篇文章介绍第一部分:源码移植 移植思路 1) 浏览官网或其他中文网站关于lvgl的说明,先了解移植基础知识; 这里给下参考的链接:http://lvgl.100ask.org/8.1/get-started/index.html 2) 下载源码,访问git
[单片机]
HLK-W801-LVGL8之源码<font color='red'>移植</font>
东芝谈NAND闪存的应用动向 可靠性0担忧
平板终端的供货量2015年将达到目前12倍的2亿4230万台——。美国调查公司IHS iSuppli于2011年2月发表了这一预测。平板终端将借助其侵食现有个人电脑市场的进势走向普及。其存储器的主角就是使用多值(MLC:multi-level cell)技术实现了大容量化的NAND闪存。 2~3年前有很多个人电脑厂商都对配备NAND闪存的MLC产品表示过担心。原因在于NAND闪存的擦写次数等远远不及非多值(SLC:single-level cell)产品。然而,在最近的笔记本电脑及平板终端上,MLC产品的采用已变得相当普遍。MLC产品的采用为何在这一期间得以顺利推进,而SLC产品今后是否会彻底失去用武之地?日前,记者就以
[手机便携]
东芝谈<font color='red'>NAND</font>闪存的应用动向 可靠性0担忧
游狼采用Nordic的nRF52840 SoC和低延迟模式满足电子竞技高性能
键鼠外设公司 G-Wolves(游狼) 发布了一系列由 Nordic Semiconductor 驱动的双模(有线和无线)游戏鼠标,以轻巧的外形为用户提供超低延迟性能和低功耗。“Hati ACE”系列鼠标集成了 Nordic 的 nRF52840 高级多协议片上系统 (SoC),可在用户外围设备和 PC 之间提供 2.4 GHz 专有无线连接,从而在游戏和电子竞技应用中实现快速响应。 低延迟数据包模式 为确保快速稳定的响应时间,Hati ACE 系列鼠标采用蓝牙低功耗(蓝牙 LE)无线的低延迟数据包模式 (LLPM)。LLPM专为界面响应时间敏感的应用而设计,例如游戏鼠标、键盘或虚拟现实 (VR) 耳机等。 LLPM 已
[物联网]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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