历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2021年07月30日 | 2.移植uboot-添加2440单板,并实现NOR、NAND启动

2021-07-30 来源:eefocus

1.首先在uboot里新建单板2440


1.1将2410的单板文件夹拷贝成2440:


cd board/samsung/

cp smdk2410 smdk2440 -rf                //拷贝文件夹,


然后将smdk2440下的smdk2410.c改为smdk2440.c,以及修改更改好的Makefile 


1.2 将2410的头文件拷贝成2440:


cd ../../include/configs/

cp smdk2410.h smdk2440.h


2.新建后,还需要修改boards.cfg,使uboot支持2440单板:


仿照


smdk2410                     arm         arm920t     -                   samsung        s3c24x0


添加:


smdk2440                     arm         arm920t     -                   samsung        s3c24x0


添加后,就能够使用make smdk2440_config命令.


(该命令便会调用include/configs/smdk2440.h和board/samsung/smdk2440里的文件来配置uboot)


3.修改uboot系统时钟


在start.S里,uboot只设置了CLKDIVN寄存器


而2440的系统时钟需要设置两个寄存器:MPLLDIVN(设置FCLK频率)、CLKDIVN(设置分频比例),且还要设为异步模式


所以将:


      ldr   r0, =CLKDIVN

      mov r1, #3

      str   r1, [r0]


改为:


#define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x01<<4)|(0x01))   //设置FCLK=400MHZ

#define MPLLCON                          0x4C000004            //设置FCLK频率


       ldr r0,=0x4C000014

       mov r1,#5                  /*FCLK:HCLK:PCLK=1:4:8  (400M:100M:50M)*/

       str r1,[r0]       


       mrc  p15, 0, r1, c1, c0                 /* 读出控制寄存器 */  

       orr   r1, r1, #0xc0000000              /* 设置为“asynchronous bus mode” */

       mcr    p15, 0, r1, c1, c0, 0             /* 写入控制寄存器 */     


       ldr r0,=MPLLCON

       ldr r1,=S3C2440_MPLL_400MHZ      

       str r1,[r0]


并修改boardsamsungsmdk2440Smdk2440.c里的board_early_init_f()函数,屏蔽对MPLLDIVN, LOCKTIME寄存器的设置(该函数被start.S->board_init_f()调用,这些寄存器在前面已被设置)


4.烧写到NOR上,测试


烧写测试时,由于新的uboot较大,可以使用nor上的旧uboot,通过DNW烧写新的uboot到nor上面.


步骤:


usb 1 30000000            //使用usb下载到SDRAM上,1表示一直下载,直到完成

                         //然后打开DNW,传输新的uboot.bin给usb


protect off all           //关闭nor的写保护


erase  0   +7FFFF      //擦除nor上的 0~7FFFF地址内容, +7FFF=擦除长度=512kb,要大于新的uboot.bin才行


cp.b  30000000  0  80000         //将SDRAM上的新的uboot.bin,拷贝到nor上


烧写完成后,重启,通过JTAG调试的读地址命令, 判断是否与新uboot文件一致


使用JTAG调试时,发现向0x30000000地址上写值出错


5.接下来便修改bank寄存器


将boardsamsungsmdk2440lowlevel_init.S里SMRDATA符号下:


SMRDATA:

    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))

    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))

    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))

    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))

    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))

    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))

    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))

    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))

    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))

    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

    .word 0x32

    .word 0x30

    .word 0x30


改为:


SMRDATA:

       .long 0x22011110    //BWSCON

       .long 0x00000700    //BANKCON0

       .long 0x00000700    //BANKCON1

       .long 0x00000700    //BANKCON2

       .long 0x00000700    //BANKCON3 

       .long 0x00000700    //BANKCON4

       .long 0x00000700    //BANKCON5

       .long 0x00018005    //BANKCON6

       .long 0x00018005    //BANKCON7

       .long 0x008C04F4    //REFRESH

       .long 0x000000B1    //BANKSIZE

       .long 0x00000030    //MRSRB6

       .long 0x00000030    //MRSRB7


6.重新编译烧写uboot,发现串口已有数据,但是乱码:


6.1进入archarmcpuarm920ts3c24x0Speed.c下的get_HCLK ()函数:

由于我们没有配置CONFIG_S3C2440宏,所以uboot获取HCLK时钟设置波特率时,用的是CONFIG_S3C2410宏的方法


搜索CONFIG_S3C2410宏,找到位于smdk2440.h:

然后将smdk2440.h的CONFIG_S3C2410宏 改为: CONFIG_S3C2440宏


6.2编译测试


make时,发现以下几个error:

进入drivers/mtd/nand/s3c2410_nand.c 的72行:

其中nand是一个s3c2410_nand结构体:

该结构体如下所示:

从上图可以看出,只有定义了CONFIG_S3C2410宏,才能得到该结构体,而我们6.1小节里,使用的是CONFIG_S3C2440宏。


且上面的s3c2410_nand结构体和s3c2440_nand结构体的差别也很大,修改s3c2410_nand.c会很麻烦


6.3所以就直接去掉该文件,不让编译器编译即可,步骤如下所示:


1)直接进入s3c2410_nand.c的目录,打开Makefile:

如上图所示,需要去掉CONFIG_NAND_S3C2410宏定义才行


2)搜索CONFIG_NAND_S3C2410宏,位于include/configs/smdk2440.h:

如上图所示,我们直接来屏蔽CONFIG_CMD_NAND宏即可,因为该宏下的#ifdef,都是与2410相关的


3)屏蔽include/configs/smdk2440.h下的CONFIG_CMD_NAND宏定义

重新烧写进norflash,打印如下图所示:

发现无乱码了,表示nor启动成功,其中Flash: *** failed ***表示不支持norflash,因为我们只实现了重定位,并没有对nor实现写擦除等命令。


7.接下来便修改uboot,实现NAND启动


新的uboot链接地址位于0,且在arm-linux-ld时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)",从而程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K).


所以接下来修改代码,并取消"-pie"选项.


7.1去掉 "-pie"选项


使用grep "-pie" * -nR找到:


arch/arm/config.mk:75:LDFLAGS_u-boot += -pie             // LDFLAGS: arm-linux-ld的参数


所以屏蔽arch/arm/config.mk文件的"LDFLAGS_u-boot += -pie"这行即可


7.2参考之前自制uboot使用的start.S, init.c来修改uboot代码


1)将以前写uboot里的init.c放入board/samsung/smdk2440目录, 并检查是否有同名函数名,若函数只在同文件使用,则添加static.并修改Makefile 


2)修改include/configs/smdk2440.h文件


将CONFIG_SYS_TEXT_BASE宏改为0x33f00000,也就是uboot重定位后的位置, 这里留了1MB空间供给uboot重定位(在反汇编中看到,代码真正总大小为700多KB(包括了bss段))


3)修改arch/arm/cpu/arm920t/start.S,更改重定位代码


由于nand启动时,2440未初始化之前只有前4K可读写,所以将重定位代码放在start.S的cpu_init_crit(初始化SDRAM)段后面


添加以下带红色的字段:


#ifndef CONFIG_SKIP_LOWLEVEL_INIT


       bl    cpu_init_crit


#endif


       /*重定位                          */


       ldr   sp, =(CONFIG_SYS_INIT_SP_ADDR)          //等于0x30000f80


       bic   sp, sp, #7                                                   /* 8-byte alignment for ABI compliance */


    


       mov r0,#0                         //r0->src


       ldr r1,_TEXT_BASE          //_TEXT_BASE : 0x33f00000


       ldr r2,_bss_start_ofs       // _bss_start_ofs:  __bss_start - _start   (有效代码大小)


       bl copy_code_to_sdram     //该函数首先会初始化nand控制器,然后复制代码到SDRAM连接地址dest上


       bl clear_bss                         //清除bss段(参考自制uboot章节)


 


       ldr pc,=call_board_init_f                 //绝对跳转,跳到SDRAM上执行


call_board_init_f:


       ldr   r0,=0x00000000


       bl    board_init_f


上面的_TEXT_BASE,在start.S靠前处定义:

由于它位于靠前处,保证了_TEXT_BASE存在前4k空间里,若直接使用ldr r1,=CONFIG_SYS_TEXT_BASE,编译器可能会将这个宏定义放在SDRAM上,则会出错


4)重定位写在前面了,所以我们还要删除start.S后面的relocate_code重定位段,清除BSS段


board_init_r位置处的代码,改为如下所示:


/* void relocate_code (addr_sp, gd, addr_moni)*/

.globl      relocate_code

relocate_code:


       mov r4, r0      /* save addr_sp */       

       mov    sp, r4

       mov r0, r1      /* save addr of gd */

       mov r1, r2      /* save addr of destination */

       bl   board_init_r        //进入uboot第二阶段代码


7.3修改board_init_f()函数(位于arch/arm/lib/board.c)


本节添加的uboot重定位是直接以基地址0x33F00000开始的, 在上一章分析出,board_init_f()函数划分uboot重定位所在区域时,是通过动态划分的.


所以修改board_init_f()函数的第113行:


复制代码


       /*

        * reserve memory for U-Boot code, data & bss

        * round down to next 4 kB limit

        */


       //addr -= gd->mon_len;                     //屏蔽该行

       //addr &= ~(4096 - 1);                     //屏蔽该行


     addr=CONFIG_SYS_TEXT_BASE;           //0x33f00000,添加该行

推荐阅读

史海拾趣

Aerovox Corporation公司的发展小趣事

Aerovox Corporation成立于1922年,是一家专业生产电容器和电子元件的公司。以下是关于Aerovox Corporation发展的五个相关故事:

  1. 成立与初期发展: Aerovox Corporation于1922年在美国马萨诸塞州波士顿成立,最初名为"Northeast Electric Company",后来改名为"Aerovox Corporation"。公司的创始人是W·H·J·Gilbert先生,他致力于开发高性能的电容器。起初,Aerovox主要生产电感线圈和电容器,为无线电和电视等新兴行业提供支持。

  2. 二战期间的发展: 在二战期间,Aerovox Corporation转向军事市场,为美国军方生产电容器和其他电子元件,支持军事通信和雷达系统的发展。这一时期,公司迅速扩张并积累了丰富的技术经验。

  3. 技术创新与扩张: 随着电子技术的不断发展,Aerovox Corporation不断进行技术创新,推出了一系列具有创新性的产品,包括高压电容器、电感器和电源解决方案。公司不仅在军事领域取得了成功,还在民用市场上获得了广泛的应用。

  4. 全球化和市场拓展: Aerovox Corporation通过建立全球销售网络和合作伙伴关系,拓展了国际市场。公司在美国以外的地区设立了生产基地和销售办事处,提供定制化的解决方案,满足客户不断增长的需求。

  5. 持续创新与领先地位: 如今,Aerovox Corporation仍然致力于持续创新,不断开发新的产品和解决方案,以满足不断变化的市场需求。公司在电力电子、医疗设备、工业自动化、交通运输等领域拥有广泛的应用,保持着行业领先地位。

这些故事展示了Aerovox Corporation作为一家具有悠久历史和丰富经验的电子公司,在不同时期和领域的持续发展和创新。

得力(deli)公司的发展小趣事

得力公司在国内市场取得成功后,开始积极拓展海外市场。公司在全球建立了多个生产基地和创新研发中心,整合全球人才和资源,为用户提供卓越的产品和服务。同时,得力还注重品牌本土化经营和国际化运营,努力融入当地市场和文化,赢得了全球客户的信赖和认可。

Emmoco公司的发展小趣事

Emmoco一直将品质管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,Emmoco还注重持续改进,通过引入先进的生产设备和工艺、优化生产流程等方式,不断提高产品质量和生产效率。这些举措使得Emmoco的产品在市场上赢得了良好的口碑和声誉。

ALPS公司的发展小趣事

Emmoco公司成立于XXXX年,由一群富有远见和创新精神的电子工程师创立。公司自创立之初就明确了以技术创新为核心的发展道路,专注于研发高性能的电子元器件和模块。经过初期的不懈努力,Emmoco成功推出了一系列具有竞争力的产品,为公司的后续发展奠定了坚实的基础。

EDAC公司的发展小趣事

随着全球环保意识的提高,ECS-C公司积极响应国家号召,将绿色环保理念融入到企业的生产经营中。公司采用环保材料和生产工艺,减少废弃物排放和能源消耗。同时,ECS-C公司还积极参与环保公益活动,推动社会环保事业的发展。这些环保举措不仅提升了公司的社会形象,也为企业带来了可持续发展的动力。

Blue Creation公司的发展小趣事

Blue Creation公司深知人才是企业发展的核心。因此,公司高度重视人才队伍建设,通过校园招聘、社会招聘等多种渠道吸引优秀人才加入。同时,公司还建立了完善的培训体系,为员工提供持续的学习和发展机会。这些举措使得Blue Creation拥有一支高素质、专业化的人才队伍,为公司的快速发展提供了有力保障。

问答坊 | AI 解惑

锂离子电池智能充电器硬件的设计

锂离子电池具有较高的能量重量和能量体积比,无记忆效应,可重复充电次数多,使用寿命长,价格也越来越低。一个良好的充电器可使电池具有较长的寿命。利用C8051F310单片机设计的智能充电器,具有较高的测量精度,可很好的控制充电电流的大小,适时 ...…

查看全部问答>

天下最有才的辞职信

  亲爱的老板:    昨天外面下了一场雨嗳,这让我想起我国著名诗人汪国真的诗句:“总有些这样的时候,正是为了爱,才悄悄躲开,躲开的是身影,躲不开的,却是那份,默默的情怀。……“    领导你看,他写得多好啊,我一边读他的诗,一边 ...…

查看全部问答>

容阻降压电路输出电流过小

咖啡机降压电路为容阻降压,怎样解决容阻降压电路输出电流过小的问题,一般只能有几十mA…

查看全部问答>

mobile5.0下如何把ToolBar移动到顶部(vc2005)?

大家好,为什么mobile下面无法将工具栏放在顶部?有没有哪位遇到过类似问题?…

查看全部问答>

verilog HDL程序错误问题

一个数字跑表程序,clk:时钟信号;clr:异步复位信号;pause:暂停信号;msh,msl:百分秒高位和低位:sh,sl:秒高位和低位;mh,ml:分高位和低位module paobiao(msh,msl,sh,sl,mh,ml,clk,clr,pause);output [3:0]msh,msl,sh,sl,mh,ml;input&nbs ...…

查看全部问答>

工作,唉。

上学的时候吧想工作,一直认为上班好,可上班了觉得还是上学好啊,呵呵。开始的时候觉得工作了很新鲜,慢慢的就变得麻木啦,开始的时候还在想要不要换工作,最后还是决定坚持下去,不三心二意的换来换去的,没了换工作的烦恼,缺有了新的烦恼,那就 ...…

查看全部问答>

新手求救!定义bit变量!

我用c写程序的时候想定义一个可位操作的变量,可是430不支持bit指令,请高手赐教怎么实现?…

查看全部问答>

【共享】芯嵌stm32入门教程 + 视频

(一)芯嵌stm32入门视频,下载地址:http://pan.baidu.com/share/link?shareid=2052956608&uk=3942664303 芯嵌stm32入门视频之一《stm32入门初探》 芯嵌stm32入门视频之二《芯嵌stm32使用指南》 芯嵌stm32入门视频之三《JLink的安装和使用》 ...…

查看全部问答>

MDK474编译老出错

       领的LPC1500的板子之后,最近才抽得空出来玩NXP,可是编程环境一直弄不出来,急死我了!!!!!!! 在官网下了 MSK 474,装好之后也破解了 在论坛里在了个例程想看下板子能不能工作,可是编译一直不通过,老是提示 ...…

查看全部问答>

已知磁芯 如何选择骨架?

新手在此弱弱地请教一个问题  已知磁芯 如何选择骨架?是每个对应的磁芯可以能找到相对应的骨架吗? \0\0\0eeworldpostqq…

查看全部问答>