主题 : Tiny210 SDBOOT UART 输出成功 (ubuntu下裸编笔记) 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 69850
精华: 1
发帖: 24
金钱: 170 两
威望: 34 点
贡献值: 1 点
综合积分: 68 分
注册时间: 2012-05-12
最后登录: 2012-11-30
楼主  发表于: 2012-05-12 01:09

 Tiny210 SDBOOT UART 输出成功 (ubuntu下裸编笔记)

2012.5.11
如何在ubuntu下搭建开发环境 How to build dev environment on ubuntu
如何实现SD卡启动第一个闪灯程序 How to blink led on tiny210 board
如何实现时钟配置和串口输出字符 How to make uart putchar using SDBOOT

See https://github.com/limingth/LASO/wiki for my dev notes

Goto http://www.lumit.org for more details.
级别: 新手上路
UID: 69850
精华: 1
发帖: 24
金钱: 170 两
威望: 34 点
贡献值: 1 点
综合积分: 68 分
注册时间: 2012-05-12
最后登录: 2012-11-30
1楼  发表于: 2012-05-14 11:19

 回 楼主(limingth) 的帖子

把代码上传了,可以参考 https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes

已经基本实现了通过 SD 卡启动 lumit Bootloader 的功能,并且支持 从 NandFlash 上读数据,接下来计划能够实现 DDR2 SDRAM 的初始化和烧写 NandFlash 的功能。

随时更新!
级别: 新手上路
UID: 69850
精华: 1
发帖: 24
金钱: 170 两
威望: 34 点
贡献值: 1 点
综合积分: 68 分
注册时间: 2012-05-12
最后登录: 2012-11-30
2楼  发表于: 2012-05-14 23:38
DDR2 SDRAM 已经初始化成功,是从 uboot 中找到的初始化代码 mem_setup.S 。

### step 1:  make the project and get 9-autorun-demo-sd.bin
    limingth@ubuntu:~/Work-Dir/Linux-Codes/9-autorun-demo$ make
    arm-linux-as   -o start.o start.s
    arm-linux-gcc    -c -o mem_setup.o mem_setup.S
    arm-linux-gcc -Wall   -c -o command.o command.c
    arm-linux-gcc -Wall   -c -o led.o led.c
    arm-linux-gcc -Wall   -c -o lib.o lib.c
    arm-linux-gcc -Wall   -c -o main.o main.c
    arm-linux-gcc -Wall   -c -o nand.o nand.c
    arm-linux-gcc -Wall   -c -o printf.o printf.c
    arm-linux-gcc -Wall   -c -o shell.o shell.c
    arm-linux-gcc -Wall   -c -o stdio.o stdio.c
    arm-linux-gcc -Wall   -c -o uart.o uart.c
    arm-linux-gcc -Wall   -c -o xmodem.o xmodem.c
    arm-linux-ld -Ttext 0xD0030010 start.o mem_setup.o command.o led.o lib.o main.o nand.o printf.o shell.o stdio.o uart.o xmodem.o -o 9-autorun-demo.elf
    arm-linux-objcopy -O binary 9-autorun-demo.elf 9-autorun-demo.bin
    arm-linux-objdump -d -j .text 9-autorun-demo.elf > 9-autorun-demo.lst
    arm-linux-objdump -d -s -j .data -j .rodata 9-autorun-demo.elf >> 9-autorun-demo.lst
    ../mktiny210spl.exe 9-autorun-demo.bin 9-autorun-demo-sd.bin
    ls -l *.bin
    -rwxr-xr-x 1 limingth limingth 7400 2012-05-14 23:22 9-autorun-demo.bin
    -rw-r--r-- 1 limingth limingth 8192 2012-05-14 23:22 9-autorun-demo-sd.bin

### step 2:  Burn 9-autorun-demo-sd.bin to SD card
    limingth@ubuntu:~/Work-Dir/Linux-Codes/9-autorun-demo$ make b
    sudo dd iflag=dsync oflag=dsync if=9-autorun-demo-sd.bin of=/dev/sdb seek=1
    记录了16+0 的读入
    记录了16+0 的写出
    8192字节(8.2 kB)已复制,0.00023185 秒,35.3 MB/秒
    limingth@ubuntu:~/Work-Dir/Linux-Codes/9-autorun-demo$

### step 3:  Reset with SDBOOT and load linux kernel from flash 0x4M to sdram 0x20008000 with size 0x8M
    LUMIT $ nand read 0x20008000 0x400000 0x800000
    your input: <nand read 0x20008000 0x400000 0x800000>
    0: <nand>
    1: <read>
    2: <0x20008000>
    3: <0x400000>
    4: <0x800000>
    command do <nand>
    sdram 0x20008000, nand 0x00400000, size 0x00800000
    nand read finished!
    LUMIT $ md 0x20008000
    your input: <md 0x20008000>
    0: <md>
    1: <0x20008000>
    command do <md>
    20008000: E1A00000 E1A00000 E1A00000 E1A00000
    20008010: E1A00000 E1A00000 E1A00000 E1A00000
    20008020: EA000002 016F2818 00000000 004182D8
    20008030: E1A07001 E1A08002 E10F2000 E3120003
    20008040: 1A000001 E3A00017 EF123456 E10F2000
    20008050: E38220C0 E121F002 00000000 00000000
    20008060: E28F00D0 E890387E E0500001 0A00000A
    20008070: E0855000 E08BB000 E08CC000 E0822000
    20008080: E0833000 E08DD000 E59B1000 E0811000
    20008090: E48B1004 E15B000C 3AFFFFFA E3A00000
    200080A0: E4820004 E4820004 E4820004 E4820004
    200080B0: E1520003 3AFFFFF9 EB000028 E1A0100D
    200080C0: E28D2801 E1540002 2A000016 E0840006
    200080D0: E1500005 9A000013 E1A05002 E1A00005
    200080E0: E1A03007 EB00023C E28000FF E3C0007F
    200080F0: E0851000 E28F2FA1 E59F305C E0823003
    LUMIT $ go 0x20008000
    your input: <go 0x20008000>
    0: <go>
    1: <0x20008000>
    command do <go>
    go to address 0x20008000
    Uncompressing Linux... done, booting the kernel.

### To be continued

    应该还需要给 Kernel 传递一些参数就可以自己来加载启动 Linux kernel 了。

See it also in this link:
https://github.com/limingth/LASO/wiki/4-How-to-boot-linux-kernel-from-nand-flash
[ 此帖被limingth在2012-05-15 00:06重新编辑 ]
级别: 新手上路
UID: 69850
精华: 1
发帖: 24
金钱: 170 两
威望: 34 点
贡献值: 1 点
综合积分: 68 分
注册时间: 2012-05-12
最后登录: 2012-11-30
3楼  发表于: 2012-05-15 17:51

 回 2楼(limingth) 的帖子

借鉴 s3c2440 启动 Linux 的参数和数据结构,完成了启动 linux kernel 的功能,增加了 bootm 命令。
根据经验,Linux 的加载和启动地址放到了 SDRAM + 0x8000 的地方
#define LINUX_BOOT_ADDR 0x20008000
根据 http://blog.csdn.net/liukun321/article/details/7383669 ,tiny210 的 mach type id 设为 3466
#define MACH_TYPE_TINY210 3466

代码已整理上传至 https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes/9-linux-demo
级别: 新手上路
UID: 69850
精华: 1
发帖: 24
金钱: 170 两
威望: 34 点
贡献值: 1 点
综合积分: 68 分
注册时间: 2012-05-12
最后登录: 2012-11-30
4楼  发表于: 2012-05-15 17:52

 回 3楼(limingth) 的帖子

中断代码移植成功
可以通过tiny210 开发板的 K1 按键 (左上角BACK键) 的 falling edge 触发中断,IRQ handler 输出 '+' 表示中断处理完毕。

代码已上传至
https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes/app1-EINT-demo

中断理论可参考
http://www.lumit.org/LASO/zh/chp9-4.html

在 armcc 中的内嵌汇编语法不能支持,需要移植到 start.s 汇编中。
这个代码的 bin 文件,需要依靠 bootloader 下载到开发板的 0x21000000 之后,通过 go 0x21000000 执行。
How to enable Interrupt handler with K1 button
https://github.com/limingth/LASO/wiki/6-How-to-enable-Interrupt-handler-with-K1-button
级别: 新手上路
UID: 65048
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
贡献值: 0 点
综合积分: 28 分
注册时间: 2012-03-13
最后登录: 2012-08-27
5楼  发表于: 2012-05-21 17:50
期待
级别: 新手上路
UID: 69850
精华: 1
发帖: 24
金钱: 170 两
威望: 34 点
贡献值: 1 点
综合积分: 68 分
注册时间: 2012-05-12
最后登录: 2012-11-30
6楼  发表于: 2012-05-28 00:31
tiny210 SD卡 Bootloader 功能初步模拟成功!

启动分2个阶段 BL1 完成搬移 BL2,BL2 实现类似 uboot 的命令 md/mw/loadb/loadx/go/nand read/bootm。

实现了加电后自动播放 wav 音乐和显示 bmp 图片。文件存储在 SD 卡的 FAT32 文件系统上。

代码下载 https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes/b-superboot-demo  听听是什么歌?


from  https://github.com/limingth/LASO/wiki

2012.5.27
=========
1. 基本实现读取 SD 卡上的 FAT32 文件系统。 fat.c 移植于 uboot 中的实现, sdhc.c 移植于 6410 开发板裸板的 sd 卡驱动。
   移植需要解决的关键问题是需要得到 SD block 0 在偏移 0x1C6 到 0x1C9 这 4 个字节的偏移量 part_offset 。
   ( 一个本来无关紧要的小bug,耽误了最开始的2天时间。看来以后日志还是要多写,以免做到后面忘记了前面做过的改动。)
2. 现在是通过 autocmd 来进行加电后的自动启动 (显示bmp图片和播放wav音乐)。
    char * autocmd[] = {"sdload tian.bmp 0x21800000", "draw 0x21800000", "sdload today.wav 0x23000000", "play 0x23000000"};
3. 目前对bmp和wav文件的解析只是简单用了一下数据的偏移量 offset ,没有对文件头进行解析,留待以后再完善了。
    添加了一个 boot.ini 文件,为了以后能够和友善之臂的 FriendlyARM.ini 兼容,但还没有具体实现。
[ 此帖被limingth在2012-05-28 00:54重新编辑 ]
级别: 新手上路
UID: 69850
精华: 1
发帖: 24
金钱: 170 两
威望: 34 点
贡献值: 1 点
综合积分: 68 分
注册时间: 2012-05-12
最后登录: 2012-11-30
7楼  发表于: 2012-06-05 00:20

 回 6楼(limingth) 的帖子

2012.6.4
=========
1. 解决了 LCD 驱动闪烁的问题,原因是 clock source 的选择不对,VIDCON0 寄存器差了一个 bit
   CLKSEL_F  [2]  Selects the video clock source.
   linux 下的配置是用 1 = SCLK_FIMD  改成 0 = HCLK 就成功了,不再闪烁。
2. 解决了 LCD 驱动中 Framebuffer 里面 4个字节交换 SWAP 的问题,原因是设置 WINCON0 寄存器差了一个 bit
   WSWP_F  [15]  Specifies the Word swap control bit.
   默认 0 = Swap Disable 修改为 1 = Swap Enable  就成功了。
3. 更新后的 LCD 驱动 demo 程序上传至 https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes/app3-lcd-demo
4. https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes/b-superboot-demo
   可以实现加电后的自启动 BL1 是 b-superboot-demo.bin; BL2 是 bootloader/bootloader.bin
   make b 可以将这2个bin文件烧写到 SD卡上,分别写入 block 1 和 block 0x1DC000 两个位置。
   BL1 实现把 BL2 加载到 0x20A00000 位置处,然后跳转到 0x20A00000 ,然后执行 BL2
   (0x20A00000 是基于 linux 内核会被加载到 0x20008000 位置,长度为 8M 字节,因此需要留出足够空间)
   BL2 实现 3 秒内用户按键进入 shell 中,进行命令操作。 3 秒内无用户按键则进入到 autocmd 方式自动执行命令。