历史上的今天
返回首页

历史上的今天

今天是:2025年03月31日(星期一)

正在发生

2020年03月31日 | 给S5PV210裸机程序添加启动代码

2020-03-31 来源:eefocus

(说明:本贴适用于tiny210v2且NandFlash型号为:K9GAG08U0F,其他暂不支持_不知道这算不算标题党:) )


友善提供了全套的210裸机代码的确很好,代码编写风格也是值得学习的。不过裸机代码是用不开源的Superboot引导的,这样学习裸机总有一种穿着棉裤洗澡的感觉,很不爽。还好了解了S5PV210的启动方式后,对于小于16k的裸机代码都可以将链接地址改为0xd0020010,sp指针设置到0xD0037D80,然后用mkv210_image.c将bin文件制作成210.bin。再用Minitools下载u-boot的方式下载这个裸机程序。S5PV210的IROM中的BL0程序会从NandFlash拷贝代码到iram中的0xd0020000处,然后跳到0xd0020010处运行。裸机就可以跑起来了。


但是对于大于16k的代码,就不能完全靠IROM中BL0程序拷贝了。就要自己写一下BL1的启动代码了,自己拷贝。


经过《分析一下tiny210v2的16bitECC校验(已经实现u-boot for tiny210v2)》和《u-boot for tiny210v2 (NandFlash:K9GAG08U0F)》其实“BL1”代码已经做好了,并且经过引导u-boot的验证的。下面就说说怎么添加到友善的裸机代码中,完全整个裸机代码的开源。下面以13.uart_stdio这个裸机代码添加“BL1”启动的过程说明一下。(烧写方式同上)


1.添加“BL1”目录(目录中包含了Makefile和mkv210_image.c)

2.添加nand_cp.c memory.S s5pv210.h

3.修改原工程的Makefile添加如下红色内容


CC= arm-linux-gcc

LD= arm-linux-ld

AR= arm-linux-ar

OBJCOPY= arm-linux-objcopy

OBJDUMP= arm-linux-objdump


CONFIG_SYS_TEXT_BASE :=0X20000000

COPY_BL2_SIZE :=0x80000


INCLUDEDIR := $(shell pwd)/include

CFLAGS :=-g -Wall -O2 -fno-builtin -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)

-DCOPY_BL2_SIZE=$(COPY_BL2_SIZE)

CPPFLAGS   :=-g -nostdinc -I$(INCLUDEDIR) -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)

-DCOPY_BL2_SIZE=$(COPY_BL2_SIZE)

export CC AR LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS 


objs := start.o memory.o nand_cp.o main.o uart.o clock.o lib/libc.a


all: stdio.bin

make -C ./BL1

cat ./BL1/BL1.bin stdio.bin > 210.bin

stdio.bin: $(objs)

${LD} -Ttext ${CONFIG_SYS_TEXT_BASE} -Tstdio.lds -o stdio.elf $^

${OBJCOPY} -O binary -S stdio.elf $@

${OBJDUMP} -D stdio.elf > stdio.dis


.PHONY : lib/libc.a

lib/libc.a:

cd lib; make; cd ..

%.o:%.c

${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<


%.o:%.S

${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<


clean:

make  clean -C lib

make clean -C ./BL1/

rm -f *.bin *.elf *.dis *.o 


4.保证工程目录已经实现uart.c 和 start.S,并在start.S中添加如下红色内容:


@******************************************************************************

@ File:start.S

@ 功能:启动代码,设置栈,拷贝代码到CONFIG_SYS_TEXT_BASE处

@******************************************************************************  

.text

.global _start

_start:

/*

* set the cpu to SVC32 mode

*/

mrs r0, cpsr

bic r0, r0, #0x1f

orr r0, r0, #0xd3

msr cpsr,r0

/*

* Invalidate L1 I/D

*/

mov r0, #0 @ set up for MCR

mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs

mcr p15, 0, r0, c7, c5, 0 @ invalidate icache

mcr p15, 0, r0, c7, c5, 6 @ invalidate BP array

mcr p15, 0, r0, c7, c10, 4 @ DSB

mcr p15, 0, r0, c7, c5, 4 @ ISB

/*

* disable MMU stuff and caches

*/

mrc p15, 0, r0, c1, c0, 0

bic r0, r0, #0x00002000 @ clear bits 13 (--V-)

bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)

orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align

orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB

bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache

mcr p15, 0, r0, c1, c0, 0


ldr sp, =0xD0037D80       @ 设置栈,以便调用c函数

adr r0, _start                    @ 重定位

                                      @ _start当前所位于的地址

ldr r1, =_start                  @ _start的链接地址:CONFIG_SYS_TEXT_BASE

cmp r0, r1

beq run_on_dram             @ 如果在是链接地址处,则直接运行


bl  uart_init                     @ 初始化串口 

bl  nand_asm_init            @ NandFlash初始化 

bl  mem_init                   @ dram初始化


bl  board_init_f_nand     @ 拷贝bl2代码到dram中,并运行


run_on_dram:  

bl  main                  @ 跳转

/* Setting GPIO for NAND */

/* This setting is NAND initialze code at booting time in iROM. */

nand_asm_init:

/*

 * Nand Interface Init for SMDKC110

 */

 

#define ELFIN_GPIO_BASE 0xE0200000 

#define ELFIN_NAND_BASE 0xB0E00000

#define NFCONF_VAL    (2<<23)|(7<<12)|(7<<8)|(7<<4)|(1<<3)|(0<<2)|(1<<1)|(0<<0)

#define NFCONT_VAL      (0x1<<23)|(0x1<<22)|(0<<18)|(0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0x2<<1)|(1<<0)


//#define  NFCONF_VAL     (0<<25)|(0x3<<23)|(7<<12)|(7<<8)|(7<<4)|(1<<3)|(0<<2)|(1<<1)|(0<<0)

//#define NFCONT_VAL      (0x1<<23)|(0x1<<22)|(0<<18)|(0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(1<<5)|(0x2<<1)|(1<<0)


#define MP01CON_OFFSET 0x2E0

#define MP01PUD_OFFSET 0x2E8

#define MP03CON_OFFSET      0x320

#define MP03PUD_OFFSET      0x328

#define NFCONF_OFFSET       0x00

#define NFCONT_OFFSET       0x04

 


ldr r0, =ELFIN_GPIO_BASE


ldr r1, [r0, #MP01CON_OFFSET]

bic r1, r1, #(0xf<<8)

orr r1, r1, #(0x3<<8)

str r1, [r0, #MP01CON_OFFSET]


ldr r1, [r0, #MP01PUD_OFFSET]

bic r1, r1, #(0x3<<4)

str r1, [r0, #MP01PUD_OFFSET]


ldr r1, [r0, #MP03CON_OFFSET]

bic r1, r1, #0xFFFFFF

ldr r2, =0x22222222

orr r1, r1, r2

str r1, [r0, #MP03CON_OFFSET]


ldr r1, [r0, #MP03PUD_OFFSET]

ldr r2, =0x3fff

bic r1, r1, r2

str r1, [r0, #MP03PUD_OFFSET]


ldr r0, =ELFIN_NAND_BASE


ldr r1, [r0, #NFCONF_OFFSET]

ldr r2, =0x777F

bic r1, r1, r2

ldr r2, =NFCONF_VAL

orr r1, r1, r2

str r1, [r0, #NFCONF_OFFSET]


ldr r1, [r0, #NFCONT_OFFSET]

ldr r2, =0x707C7

bic r1, r1, r2

ldr r2, =NFCONT_VAL

orr r1, r1, r2

str r1, [r0, #NFCONT_OFFSET]


ldr r1, [r0, #NFCONF_OFFSET]

orr r1, r1, #0x70

orr r1, r1, #0x7700

str     r1, [r0, #NFCONF_OFFSET]


ldr r1, [r0, #NFCONT_OFFSET]

orr r1, r1, #0x03

str     r1, [r0, #NFCONT_OFFSET]


mov pc, lr


例子源代码:

http://arm9home.net/read.php?tid-80458.html

运行截图:


=============================================================================================================

13-06-26更新:

1.在start.S中添加了启动方式的判断,可以判断是从NandFlash启动还是SD卡启动:

    

//判断启动方式

#define PRO_ID_BASE            0xE0000000

#define PRO_ID_OFFSET            0x00

#define OMR_OFFSET            0x04


#define BOOT_ONENAND        0x1

#define BOOT_NAND        0x2

#define BOOT_MMCSD        0x3

#define BOOT_NOR        0x4

#define BOOT_SEC_DEV        0x5


#define INF_REG_BASE            0xE010F000

#define INF_REG3_OFFSET            0x0c


        ldr    r0, =PRO_ID_BASE

        ldr    r1, [r0,#OMR_OFFSET]

        bic    r2, r1, #0xffffffc1


        /* NAND BOOT */

        cmp    r2, #0x0        @ 512B 4-cycle

        moveq    r3, #BOOT_NAND


        cmp    r2, #0x2        @ 2KB 5-cycle

        moveq    r3, #BOOT_NAND


        cmp    r2, #0x4        @ 4KB 5-cycle    8-bit ECC

        moveq    r3, #BOOT_NAND


        cmp    r2, #0x6        @ 4KB 5-cycle    16-bit ECC

        moveq    r3, #BOOT_NAND


        cmp    r2, #0x8        @ OneNAND Mux

        moveq    r3, #BOOT_ONENAND


        /* SD/MMC BOOT */

        cmp     r2, #0xc

        moveq   r3, #BOOT_MMCSD    


        /* NOR BOOT */

        cmp     r2, #0x14

        moveq   r3, #BOOT_NOR    


        /* Uart BOOTONG failed */

        cmp     r2, #(0x1<<4)

        moveq   r3, #BOOT_SEC_DEV


        ldr    r0, =INF_REG_BASE

        str    r3, [r0, #INF_REG3_OFFSET]

    

        ldr    r1, [r0, #INF_REG3_OFFSET]

        cmp    r1, #BOOT_NAND        /* 0x0 => boot device is nand */

        beq    nand_boot_210

        cmp     r1, #BOOT_MMCSD

        beq     mmcsd_boot_210

    

nand_boot_210:

        mov r0, #'N'

        bl  putc

        bl  board_init_f_nand     @ 拷贝bl2代码到dram中,并运行


mmcsd_boot_210:

        mov r0, #'S'

        bl  putc

        bl  board_init_f_mmc


2.添加了mmc_cp.c其中有从SD卡copy到dram中的程序:

typedef unsigned int (*copy_sd_mmc_to_mem) (

            unsigned int  channel,

            unsigned int  start_block,

            unsigned short block_size,

            unsigned int  *trg,

            unsigned int  init);


void copy_code_to_dram(void)

{

    unsigned long ch;

    void (*BL2)(void);

    ch = *(volatile unsigned int *)(0xD0037488);

    unsigned char channel = 0;

    

    putc('n');putc('r');

    putc('B');putc('L');putc('1');putc(' ');putc('V');putc('e');putc('r');putc(':');

    putc('1');putc('3');putc('0');putc('6');putc('2');putc('6');

推荐阅读

史海拾趣

台湾固锝(GD)公司的发展小趣事
避免输入功率过大导致放大器过热。
Electronic-Bauteile Goerlitz GmbH公司的发展小趣事

在快速发展的过程中,Electronic-Bauteile Goerlitz GmbH公司非常重视企业文化和团队建设。公司倡导以人为本的管理理念,注重员工的培养和发展。公司定期组织各种培训和学习活动,提高员工的专业素质和工作能力;同时,公司还建立了完善的激励机制和福利待遇体系,确保员工能够全身心地投入到工作中。这些努力使得公司形成了一支高效、团结、富有创新精神的团队,为公司的发展提供了坚实的保障。

请注意,以上故事均为模拟构建,旨在展示一个电子公司可能的发展过程和相关故事。如有需要,您可以根据具体情况进行调整和补充。

B&F Fastener Supply公司的发展小趣事

随着电子产品的日益小型化和复杂化,对紧固件的要求也越来越高。B&F Fastener Supply公司紧跟行业趋势,投入大量资源进行技术创新。公司成功研发出一系列适用于微型电子设备的紧固件产品,不仅满足了市场的迫切需求,还凭借出色的性能和稳定的品质赢得了客户的广泛认可。

广芯电子(BROADCHIP)公司的发展小趣事

随着电子产品的日益小型化和复杂化,对紧固件的要求也越来越高。B&F Fastener Supply公司紧跟行业趋势,投入大量资源进行技术创新。公司成功研发出一系列适用于微型电子设备的紧固件产品,不仅满足了市场的迫切需求,还凭借出色的性能和稳定的品质赢得了客户的广泛认可。

ECLIPTEK公司的发展小趣事

随着公司规模的扩大和订单量的增加,ECLIPTEK面临着越来越大的供应链管理挑战。为了应对这些挑战,公司投入大量资源优化供应链管理,引入先进的供应链管理系统和自动化生产设备。通过提高生产效率和降低生产成本,ECLIPTEK成功地保持了其在市场上的竞争优势。

飞虹(FeiHong)公司的发展小趣事

苏州锋驰深知知识产权的重要性,公司高度重视技术创新和知识产权保护工作。截至目前,苏州锋驰已拥有商标信息2条、专利信息13条,这些知识产权的积累为公司的持续发展提供了有力的保障。同时,公司还积极参与行业标准制定和技术交流活动,不断提升自身的技术水平和行业影响力。

问答坊 | AI 解惑

MPLAB C18用户指南(中文)

MPLAB C18用户指南(中文)…

查看全部问答>

求无线数传系统

求购无线数传系统,要求: 载频2.4G;传输速率1M;传输距离1千米…

查看全部问答>

AVR系列单片机C语言编程与应用实例

AVR系列单片机C语言编程与应用实例…

查看全部问答>

IRIS的相关软件工具-观察眼图

业界在用示波器进行测试的过程中存在着如何观察眼图的问题,这些问题与串行数据的特征和示波器的特性有关。本白皮书和一个叫做IRIS的相关软件工具可以帮助你了解测试中串行数据与示波器特征的相互关系。本白皮书讲述每种示波器的特征如何在频域和 ...…

查看全部问答>

ESD过不了

各位大侠,我现在有一款充电器ESD过不了 一打8KV,手机就保护了.请问是什么原因,有什么解决的办法 啊…

查看全部问答>

求助,在电脑上画电路图用什么工具?

求助,在电脑上画电路图用什么工具方便快捷啊?最好能画得像教科书上的那样。…

查看全部问答>

我的PXA270跑不起来了!请大家帮帮忙啊!

  我完全仿照PXA270开发板,做的PCB,现在出现的情况就是,板子完全能够实现BOOTLOAD的下载, 但是BOOTLOAD始终不能运行,我已经检查过了外围电压,似乎都完全正确,我现在已经没有办法了, 求大家帮帮忙 ,帮我分析下原因啊!谢谢!…

查看全部问答>

驱动开发

我刚学驱动开发。希望大虾给点建议,该看些什么书?…

查看全部问答>

移植ucosii的时候ads编译器遇到的问题

我是新手,第一次移植系统,在移植过程中遇到了以下问题,我尽量把相关的函数都贴出来: 在os_cpu.h中,我定义了函数: #define        OS_ENTER_CRITICAL()        ARMDisableInt() #define  &n ...…

查看全部问答>

扩展串口芯片16550中断问题

请教各位:     我的串口芯片16550用了外部中断EINT3     在注册表中:我需要加     \"SysIntr\"=dword:3      串口4的中断为EINT3     \"MeMBase\"=dword:0x20000000  &nbs ...…

查看全部问答>