历史上的今天
返回首页

历史上的今天

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

正在发生

2020年07月02日 | smdk2440移植u-boot笔记

2020-07-02 来源:eefocus

//韦东山u-boot移植笔记

1、下载、建立source insight工程、编译、烧写、如果无运行分析原因
tar xjf u-boot-2012.04.01.tar.bz2
cd u-boot-2012.04.01
make smdk2410_config
make

2. 分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程

a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
b. 如果bootloader比较大,要把它重定位到SDRAM
c. 把内核从NAND FLASH读到SDRAM
d. 设置"要传给内核的参数"
e. 跳转执行内核

2.1 set the cpu to SVC32 mode
2.2 turn off the watchdog
2.3 mask all IRQs by setting all bits in the INTMR
2.4 设置时钟比例
2.5 设置内存控制器
2.6 设置栈,调用C函数board_init_f
2.7 调用函数数组init_sequence里的各个函数
2.7.1 board_early_init_f : 设置系统时钟、设置GPIO
......
2.8 重定位代码:
2.8.1 从NOR FLASH把代码复制到SDRAM
2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"
      现在把程序复制到了SDRAM
      需要修改代码,把"基于0地址编译得到的地址"改为新地址
2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs
2.9 clear_bss
2.10 调用C函数board_init_r:第2阶段的代码

可以修改配置定义CONFIG_S3C2440

3. 修改U-BOOT代码
3.1 建一个单板
cd board/samsung/
cp smdk2410 smdk2440 -rf
cd ../../include/configs/
cp smdk2410.h smdk2440.h
修改boards.cfg:
仿照
smdk2410                     arm         arm920t     -                   samsung        s3c24x0
添加:
smdk2440                     arm         arm920t     -                   samsung        s3c24x0

3.2 烧写看结果
3.3 调试: 
a. 阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
   处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置
   
   编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot

3.4 乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440
    处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410
                                          #define CONFIG_S3C2440
                                         //#define CONFIG_CMD_NAND

将#define CONFIG_YAFFS2注释掉
3.5 修改UBOOT支持NAND启动
    原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"
    使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)
3.5.1 去掉 "-pie"选项
      arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行
      
3.5.2 参考"毕业班第1课"的start.S, init.c来修改代码
      把init.c放入board/samsung/smdk2440目录, 修改Makefile
      修改CONFIG_SYS_TEXT_BASE为0x33f80000
      修改start.S
3.5.3 修改board_init_f, 把relocate_code去掉
3.5.4 修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面
      ./arch/arm/cpu/u-boot.lds:
      
      board/samsung/smdk2440/libsmdk2440.o

3.6 修改UBOOT支持NOR FLASH
  driversmtdjedec_flash.c 加上新的型号
  #define CONFIG_SYS_MAX_FLASH_SECT (128)

  修复了重定时留下来的BUG:SP要重新设置

3.7 修改UBOOT支持NAND FLASH
    修改:include/configs/smdk2440.h: #define CONFIG_CMD_NAND
    
    把driversmtdnands3c2410_nand.c复制为s3c2440_nand.c

分析过程:
nand_init
nand_init_chip
board_nand_init
设置nand_chip结构体, 提供底层的操作函数
nand_scan
nand_scan_ident
nand_set_defaults
chip->select_chip = nand_select_chip;
chip->cmdfunc = nand_command;
chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;

nand_get_flash_type
chip->select_chip
chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
nand_command()  // 即可以用来发命令,也可以用来发列地址(页内地址)、行地址(哪一页)
chip->cmd_ctrl
s3c2440_hwcontrol

chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
*maf_id = chip->read_byte(mtd);
*dev_id = chip->read_byte(mtd);

3.8 修改UBOOT支持DM9000网卡
eth_initialize
board_eth_init
cs8900_initialize


*** ERROR: `ethaddr' not set
set ipaddr 192.168.1.17
set ethaddr 00:0c:29:4d:e4:f4
set serverip 192.168.1.3

4. 易用性修裁剪及制作补丁


内核打印出来的分区信息
0x00000000-0x00040000 : "bootloader"
0x00040000-0x00060000 : "params"
0x00060000-0x00260000 : "kernel"
0x00260000-0x10000000 : "root"

nand erase 60000 200000
nand write 30000000 60000 200000

tftp 30000000 uImage
nand erase.part kernel
nand write 30000000 kernel

烧写JFFS2
tftp 30000000 fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 0x00260000 5b89a8

set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2

烧写YAFFS
tftp 30000000 fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000  889bc0

更新UBOOT:
tftp 30000000 u-boot_new.bin; protect off all; erase 0 3ffff; cp.b 30000000 0 40000

制作补丁:
diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask.patch
打补丁:
patch -p1 < ../u-boot-2012.04.01_100ask.patch

分析"重定位之修改代码为新地址":
#ifndef CONFIG_SPL_BUILD
/*
* fix .rel.dyn relocations
*/
ldr r0, _TEXT_BASE/* r0 <- Text base */
// r0=0, 代码基地址

sub r9, r6, r0/* r9 <- relocation offset */
// r9 = r6-r0 = 0x33f41000 - 0 = 0x33f41000

ldr r10, _dynsym_start_ofs/* r10 <- sym table ofs */
// r10 = 00073608

add r10, r10, r0/* r10 <- sym table in FLASH */
// r10 = 00073608 + 0 = 00073608

ldr r2, _rel_dyn_start_ofs/* r2 <- rel dyn start ofs */
// r2=0006b568

add r2, r2, r0/* r2 <- rel dyn start in FLASH */
// r2=r2+r0=0006b568

ldr r3, _rel_dyn_end_ofs/* r3 <- rel dyn end ofs */
// r3=00073608

add r3, r3, r0/* r3 <- rel dyn end in FLASH */
// r3=r3+r0=00073608

fixloop:
ldr r0, [r2]/* r0 <- location to fix up, IN FLASH! */
1. r0=[0006b568]=00000020

add r0, r0, r9/* r0 <- location to fix up in RAM */
1. r0=r0+r9=00000020 + 0x33f41000 = 0x33f41020

ldr r1, [r2, #4]
1. r1=[0006b568+4]=00000017

and r7, r1, #0xff
1. r7=r1&0xff=00000017

cmp r7, #23/* relative fixup? */
1. r7 == 23(0x17)

beq fixrel
cmp r7, #2/* absolute fixup? */

beq fixabs
/* ignore unknown type of fixup */
b fixnext
fixabs:
/* absolute fix: set location to (offset) symbol value */
mov r1, r1, LSR #4/* r1 <- symbol index in .dynsym */

add r1, r10, r1/* r1 <- address of symbol in table */

ldr r1, [r1, #4]/* r1 <- symbol value */

add r1, r1, r9/* r1 <- relocated sym addr */

b fixnext
fixrel:
/* relative fix: increase location by offset */
ldr r1, [r0]
1. r1=[00000020]=000001e0

add r1, r1, r9
1. r1=r1+r9=000001e0 + 0x33f41000 = 33F411E0

fixnext:
str r1, [r0]
1. [0x33f41020] = 33F411E0

add r2, r2, #8/* each rel.dyn entry is 8 bytes */
1. r2=r2+8=0006b568+8=6B570

cmp r2, r3
1. 

blo fixloop
#endif

推荐阅读

史海拾趣

GPD Optoelectronics Corp公司的发展小趣事

GPD Optoelectronics Corp公司发展故事

故事一:初创与锗晶体管的诞生

GPD Optoelectronics Corp.(前身为Germanium Power Devices Corp.)成立于1973年,最初专注于高品质锗晶体管的制造。在那个半导体技术刚刚起步的年代,锗晶体管作为重要的电子元件,在电子行业中占据着举足轻重的地位。公司凭借其精湛的工艺和严格的质量控制,迅速在市场中站稳了脚跟,为后续的光电二极管业务打下了坚实的基础。

故事二:转型为光电二极管制造商

进入1980年代,随着光电技术的快速发展,GPD Optoelectronics Corp.敏锐地捕捉到了市场趋势,开始逐步转型为光电二极管制造商。1980年,公司成功推出了Ge pn探测器产品,标志着其正式进入光电领域。这一转型不仅拓宽了公司的业务范围,也为其后续在光电领域的深入发展奠定了技术基础。

故事三:InGaAs探测器的研发与推广

为了进一步满足市场对高性能光电探测器的需求,GPD Optoelectronics Corp.在1993年推出了InGaAs探测器产品。InGaAs探测器以其优异的光谱响应范围和灵敏度,在光通信、光谱学等领域得到了广泛应用。公司的这一举措不仅巩固了其在光电领域的领先地位,也为其赢得了更多客户的青睐。

故事四:产能扩大与技术创新

进入21世纪,GPD Optoelectronics Corp.继续保持着强劲的发展势头。2000年,公司搬迁至新罕布什尔州塞勒姆的新工厂,产能实现了翻倍增长。同时,公司不断加大研发投入,推出了多款创新产品,如扩展波长InGaAs探测器、可定制的双色探测器以及InGaAs象限光电二极管等。这些产品的推出不仅丰富了公司的产品线,也进一步提升了其市场竞争力。

故事五:表面贴装封装选项的引入

随着电子产品的不断小型化和集成化,GPD Optoelectronics Corp.紧跟市场趋势,于2019年增加了表面贴装封装选项。这一举措使得公司的光电二极管产品更加符合现代电子产品的设计要求,进一步拓宽了其在智能手机、平板电脑等消费电子领域的应用市场。同时,公司也继续致力于为客户提供量身定制的定制零件服务,以满足不同客户的特定需求。

歌普(GEPU)公司的发展小趣事

机顶盒,全称为数字视频变换盒,作为现代家庭娱乐与信息交互的核心设备,其重要性日益凸显。从专业角度而言,机顶盒是一种能够接收来自有线电缆、卫星天线、宽带网络等多种信号源的数字电视信号,并将其转换成适合在电视机上播放格式的设备。它不仅能够解码并传输高清、超高清视频内容,还集成了众多增值服务功能,如电子节目指南、网页浏览、在线购物、游戏娱乐等,极大地丰富了用户的观看体验。

从技术层面看,机顶盒内部集成了复杂的调谐器、解码器及多种处理器,确保信号接收的稳定性和解码的高效性。随着科技的进步,机顶盒不断向高清化、智能化方向发展,支持4K乃至8K视频解码,并集成AI语音助手、智能推荐等先进技术,为用户带来更为便捷、智能的使用体验。

此外,机顶盒还具备强大的网络交互能力,通过连接互联网,用户可以轻松享受在线视频、社交媒体、远程教育、远程医疗等多元化服务,使电视机从单向接收设备转变为智能互动终端。未来,随着5G、VR/AR等技术的不断成熟,机顶盒的应用场景将进一步拓展,为用户带来更加沉浸式和互动式的观影体验。

综上所述,机顶盒作为连接电视与互联网的重要桥梁,正以其专业性、科普性和强大的功能,不断推动着家庭娱乐与信息化的发展。

Flambeau公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Flambeau公司积极实施市场拓展战略。公司不仅在北美市场深耕细作,还逐步将业务拓展到欧洲、亚洲等国际市场。通过参加国际展会、建立海外销售渠道、与当地企业建立合作关系等方式,Flambeau成功地将自己的品牌和产品推向全球。同时,公司还注重品牌建设和客户服务,通过提供优质的售前咨询、售中支持和售后服务,赢得了广大客户的信赖和好评。

EETools公司的发展小趣事

EETools公司成立于1992年,当时正值微处理器开发工具行业蓬勃发展的时期。公司创始人凭借对嵌入式系统产品的深刻理解和市场需求的敏锐洞察,决定投身于这一领域。EETools在硅谷的电子和计算机行业中心设立总部,迅速成为该地区的一颗新星。

在初创阶段,EETools专注于嵌入式系统产品的咨询和分销业务。通过与多家知名半导体厂商建立合作关系,EETools成功将各种高性能的嵌入式系统产品引入市场,满足了客户多样化的需求。同时,公司还积极研发自主品牌的嵌入式开发工具,为客户提供更为全面和专业的服务。

冠西电子(COSMO)公司的发展小趣事

冠西电子(COSMO)公司成立于1981年,起初便专注于光电元件产品的制造。公司创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,逐步将冠西电子打造成光电元件领域的专业制造商。通过不断的技术创新和产品质量提升,冠西电子逐渐在电子行业中崭露头角。

Conditioning Semiconductor Devices Corp公司的发展小趣事

为了进一步提升技术水平和扩大市场份额,CSDC积极寻求与国际半导体巨头的合作。通过与这些公司的技术交流和合作研发,CSDC不仅获得了先进的技术支持,还成功打入了国际市场。这一合作不仅提升了CSDC的品牌影响力,也为其带来了更多的商业机会。

问答坊 | AI 解惑

联发科PK晨星,谁将是台股股王

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 联发科作为台股股王,是全球前五大IC设计公司,而作为新兴的台湾未上市公司的股王晨星的实力也不容小看,笔者现将两大公司进行一个简单的对比。  联发科 晨星    董事长蔡明介 ...…

查看全部问答>

请教MAX267滤波器芯片应用问题

    MAX267是专用的带通滤波器芯片,我想要得到中心频率信号10000倍的增益,所以用两片267级联,每片有两个二阶滤波器,每个的Q都是10,时钟信号都一样1.83KHz,中心频率为11Hz,结果得到一放大的正弦波,放大倍数差不多是10000,但是幅值 ...…

查看全部问答>

PCB连线

请问高手们   其他元件是可以连线的 可是自己制作的封装  焊盘的线 竟然只能在封装里面画  不能划到外面去 为什么呢?…

查看全部问答>

CAN分帧接收问题

单帧接收正常,多帧情况下分帧接收时,只能重复收到第一帧,程序如下,数组时分配的是一个足够大的静态数组,不知道怎么回事? //ID号表示:主机, 控制1,查询1   表示接收的是查询1的数据      if (RxMessag ...…

查看全部问答>

终于熬夜将Alientek开发板的资料上传了一小半!

终于熬夜将Alientek开发板的资料上传了一半! 下一半这个周末上传,周末亚运多放一天假! Alientek开发板所有的代码都是原创(当然不排除有些外设驱动程序是 移植的网上的代码进行修改),一共28个实例,由正点原子完成, 不完全手册一共 ...…

查看全部问答>

请教5509的bootloader问题

使用5509,通过MCBSP0以SPI外接一个串行flash 程序硬件仿真正常, 但却无法将已经转换为hex格式的程序下载到flash里面, 报错是flashburn显示flash和ccs没有联通。 我想请教的包括: 以mcbsp0口链接flash的时候, flash的逻辑地址,物理地址 ...…

查看全部问答>

【求助】f149的SPI收数据问题请教大家!

我写了个SPI的程序来读MMC卡,用软件模拟SPI读写正常,用硬件SPI口能发送数据,就是不能收到数据不知道为什么,下面是我的软件SPI程序和硬件SPI程序和初始化,希望大家能帮忙看看出了什么问题,非常感谢,程序如下!(都采用SPI0口的三根线)P3.3,P ...…

查看全部问答>

MLX90615与MSP430单片机连接

RT,哪位大哥用过MLX90615红外温度传感器与MSP430单片机,求连接图和驱动代码,不胜感激!…

查看全部问答>

论坛高手帮个忙

data verification failed at address 0x3fffc0please verify target memory and memory map   怎么解决,请问?高手帮帮忙,…

查看全部问答>

1-9999秒倒计时程序

1-9999秒倒计时程序…

查看全部问答>