uboot 在 ARM s3c2410 上移植过程

原创 2007年09月13日 21:04:00


 [转帖]uboot 在 ARM s3c2410 上移植过程                              

总述
                        u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,在LINUX下可以通过CVS来得到当前正在开发的u-boot软件。当前版本号:u-boot
                        1.0.2,见include/version.h中的定义。
                        #cvs
                        –dserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot
                        login
                        #cvs –z3 –d
                        server:anonymous@cvs.sourceforge.net:/cvsroot/u-boot
                        checkout –P u-boot
                        本文讲述S3C2410中u-boot的移植过程:S3C2410的硬件配置是:
                        l CPU:S3C2410
                        l NOR: 16M,INTEL EP28F128J3A
                        l SDRAM:64M, MICRON 48LC16M16A2-75 B
                        l DM9000AVICOM (10/100M) 网卡
                        l USB HOST一个
                        配置自已的主板
                        l 阅读Makefile文件,在Makefile文件中添加两行:
                        s3c2410_config: unconfig
                        @./mkconfig $(@:_config=) arm arm920t s3c2410
                        其中ARM是CPU的种类, arm920t是ARM CPU对应的代码目录,s3c2410是自已主板对应的目录。
                        l 在board目录中建立s3c2410目录,复制smdk2410目录中的内容(cp smdk2410/*
                        s3c2410)。
                        l 在include/configs/目录下复制smdk2410.h(cp smdk2410.h
                        s3c2410.h)
                        l 修改ARM编译器的目录名及前缀
                        本人ARM编译器的目录是在:/opt/host/armv4l/bin/armv4l-unknown-linux-
                        把CROSS-COMPILE = arm-linux- 改为实际目录:如
                        CROSS-COMPILE =
/opt/host/armv4l/bin/arm4l-unknown-linux-
                        l 完成之后,可以测试一下你的配置:
                        #make s3c2410_config
                        #make
                        编译应该在processor.h中出错
                        l 修改processor.h中:
                        union debug_insn
                        {
                        u32 arm;
                        u16 thumb;
                        }
                        修改成:
                        union debug_insn
                        {
                        u32 arm_mode;
                        u16 thumb_mode;
                        }
                        l 编译成功,编译好的程序同smdk2410一样。
                        l
                        注:如果第一次修改后编译没有在processor.h中出错,而在examples目录出错,认真检查以上修改(修改的内容不正确),并在examples目录中运行touch命令(不运行touch还会出错,可能uboot
                        Makefile没有写好,没查原因),再编译。
                        生成最基本的u-boot, 没有功能,只能起动
                        l 修改程序连接地址:
                        在board/s3c2410中有一个config.mk文件,用于设置程序连接的起始地址,因为会在u-boot中增加功能,所以留下6M的空间,修改33F80000为33A00000。
                        l
                        为了以后能用uboot的GO命令执行修改过的用loadb或tftp下载的u-boot:在board/s3c2410的memsetup.S中标记符”0:”上加入五句:
                        l mov r3, pc
                        l ldr r4, =0x3FFF0000
                        l and r3, r3, r4 //以上三句得到实际起动的内存地址
                        l aad r0, r0, r3 //用GO命令调试uboot时,启动地址在RAM
                        l add r2, r2, r3 //把初始化内存信息的地址,加上实际起动地址
                        u 0标记符0, 原来存在的标记符)
                        l 用SJF软件通过jtag口下载编译的u-boot, 启动!读取环境块时CRC出错,然后进入SMDK#。
                        l 把MIZI vivi中的PrintHexWord, PrintWord拷过来,
                        这样可以在调试汇编时可以打印一些信息,但其中有的PrintHexNibble中有缺陷,ldr r0, [r2,
                        r0] 应改为ldrb r0, [r2, r0],这样可以在四字节对齐的系统中使用。
                        INTEL nor flash操作功能
                        l INTEL
                        的28F128,在board目录中找到CMI主板有此FLASH,把cmi中flash.c拷到s3c2410目录代换原来的flash.c。
                        l
                        cmi中的flash.c在写入时要交换字节,所以删除它的write_short()和wirte_buff()函数,把ep7312主板目录中flash.c的wirte_word()和wirite_buff()函数复制过来。把flash.c中的FLASH_BASE0_PRELIM改为CFG_FLASH_BASE。把FLASH_BLOCK_SIZE改为0x20000,(E28F128J3A
                        flash中块的大小是128K)。
                        l 把s3c2410.h中的flash内容由原来的:
                        1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
                        2. #define CFG_FLASH_BASE PHYS_FLASH_1
                        3. #define CONFIG_AMD_LV400 1
                        4. #if 0
                        5. #define CONFIG_AMD_LV800 1
                        6. #endif
                        7. #define CFG_MAX_FLASH_BANKS 1 /* max number of memory
                        banks */
                        8. #ifdef CONFIG_AMD_LV800
                        9. #define PHYS_FLASH_SIZE 0x00100000 /* 1MB */
                        10. #define CFG_MAX_FLASH_SECT (19) /* max number of
                        sectors on one chip */
                        11. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x0F0000) /*
                        addr of environment */
                        12. #endif
                        13. #ifdef CONFIG_AMD_LV400
                        14. #define PHYS_FLASH_SIZE 0x00080000 /* 512KB */
                        15. #define CFG_MAX_FLASH_SECT (11) /* max number of
                        sectors on one chip */
                        16. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x070000)
                        改为:
                        1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
                        2. #define PHYS_FLASH_SIZE 0x01000000 /* 16 MB */
                        3. ##define CFG_FLASH_PROTECTION
                        4. define CFG_FLASH_BASE PHYS_FLASH_1
                        5. #define CFG_MONITOR_BASE PHYS_FLASH_1
                        6. #define CFG_MAX_FLASH_BANKS 1/* max number of memory
                        banks */
                        7. #define CFG_MAX_FLASH_SECT 128/* max number of
                        sectors on one chip */
                        8. #define CFG_FLASH_ERASE_TOUT (2*CFG_HZ) /* Timeout
                        for Flash Erase */
                        9. #define CFG_FLASH_WRITE_TOUT (2*CFG_HZ) /* Timeout
                        for Flash Write */
                        10. #define CFG_ENV_IS_IN_FLASH 1
                        11. #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x60000)
                        12. #define CFG_ENV_SIZE 0x20000 /* Total Size of
                        Environment Sector */
                        l 把cmd_mem.c中的cmd_get_data_size函数的default_size全改为1,
                        默认以字节显示,更直观,并且不会出现地址对齐错(data
                        abort)。而在do_mem_mw()及mod_mem()中加入:
                        if(addr2info(addr) != NULL)
                        {
                        printf(“can’t wirte or modify in flash! Use cp
                        instead./n”);
                        return 0;
                        }
                        以使mw和mm命令不能修改flash中的数据,而只开放cp修改flash中的数据。
                        l 改board/s3c2410/flash.c中的flash_erase(),把start =
                        get_timer(0)移到for(), 以去掉flash_erase timeout 错误。
                        设置FLASH和SDRAM时序
                        根据28F128J3A-150,这是一150ns的flash,
                        所以把flash时序设为最慢。把s3c2410设成202.8MHZ, 并且工作在异步模式,
                        修改memsetup.S。
                        实现网卡功能
                        本人的网卡是DM9000,在uboot中没有相应的驱动,所以自已写了一个网卡驱动。
                        1. 把驱动拷到drivers/dm9000.c
                        2. 在drivers/Makefile中加入dm9000.o
                        3. 在lib_arm/board.c中修改CS8900=>DM9000
                        4. 在include/configs/s3c2410中加入以下几句
                        #define CONFIG_DRIVER_DM9000 1 /* we have a CS8900
                        on-board */
                        #define DM9000_BASE 0x08000000
                        #define DM9000_BUS16 1 /* the Linux driver does accesses
                        as shorts */
                        #define CONFIG_ETHADDR 08:00:3e:26:0a:5b
                        #define CONFIG_NETMASK 255.255.255.0
                        #define CONFIG_IPADDR 192.168.2.120
                        #define CONFIG_SERVERIP 192.168.2.122
                        实现USB功能
                        1. 在include/configs/s3c2410中的CONFIG_COMMANDS中加入:
                        l CFG_CMD_USB |/
                        l CFG_CMD_FAT |/
                        2. 并在文件中加入以下设置:
                        l #define CONFIG_USB_OHCI
                        l #define CONFIG_USB_STORAGE
                        l #define CONFIG_USB_KEYBOARD
                        l #define CONFIG_DOS_PARTITION
                        l #define CFG_DEVICE_DEREGISTER
                        l #define CONFIG_SUPPORT_VFAT
                        l #define LITTLEENDIAN
                        3. 这时usb start 和 usb info等功能正常,而其它一些功能不正常。
                        4. 功能fatls 不正常,修改fs/fat/fat.c
                        l 没有把VFAT的UNICODE字符转换过来,加入UNICODE字符转换函数。Uni2ansi(),
                        增加slot2str()的cp936版, 增加一个toshort()。
                        l 加入#define cp936
                        l 在fat_getenv()中有一个对齐错误,修改fat.h使fatbuff字对齐。
                        l 在do_fat_read()中加入两句,以消除列根目录错误。
                        l 在board/cmd_fat.c中加入两句,以消除没有usb storage设备时的错误:
                        if(!dev_desc)
                        printf(“Not init storage usb device:/n usb start/n usb
                        info/n usb scan/n”);
                        5. 修改fs/fat/fat.c
                        get_cluster()函数中加入 if(size / FS_BLOCK_SIZE > 0),
                        以防读文件时不能成功读出。
                        引导LINUX
                        现在我们可以引导LINUX了。
                        l 要引导bzip2的linux核,把CFG_MALLOC_SIZE改为大于4M
                        l 把编译好的LINUX内存,通过uboot/tools/mkimage转换成uboot格式
                        1. mkimage -A arm -O linux -T kernel -C bzip2 -a
                        30000000 -e 30008000 -n 'linux kernel' -d vmlinux1.bz2 c
                        2. mkimage -A arm -O linux -T kernel -C gzip -a 30000000
                        -e 30008000 -n 'linux kernel' -d vmlinux.gz b
                        3. mkimage -A arm -O linux -T ramdisk -C gzip -a 0 -e 0
                        -n 'init ramdisk' -d ramdisk.image.gz ramdisk
                        l 在include/configs/s3c2410.h中加入:
                        1. #define CONFIG_BOOTARGS "initrd=0x30800000,0x200000
                        root=/dev/ram init=/linuxrc console=ttyS0,115200"
                        2. #define CONFIG_BOOTFILE "vmlinux_for_uboot.gz"
                        3. #define CONFIG_BOOTCOMMAND "bootm 0x80000 0x1a0000"
                        0x80000为内核在flash中的位置。
                        0x1a0000为ramdisk.image.gz在flash中的内容。
                        4. #define CFG_LOAD_ADDR 0x30800000 /* default load
                        address */
                        l 在lib_arm/armlinux.c的do_bootm_linux中加入:
                        1. memcpy ((char *)CFG_LOAD_ADDR, (char *)data, len);
                        2. data = CFG_LOAD_ADDR;
                        把ramdisk复制到0x30800000位置的RAM中
                        3. 定义以下配置,把信息传入LINUX核心的TAG区
                        #define CONFIG_SETUP_MEMORY_TAGS
                        #define CONFIG_INITRD_TAG
                        #define CONFIG_CMDLINE_TAG
                        常用U-BOOT命令介绍
                        1. ?得到所有命令列表
                        2. help: help usb, 列出USB功能的使用说明
                        3. ping:注:只能开发板PING别的机器
                        4. setenv: 设置互环境变量:
                        5. setenv serverip 192.168.0.1
                        6. setenv ipaddr 192.168.0.56
                        7. setenv bootcmd ‘tftp 32000000 vmlinux; kgo 32000000’
                        8. saveenv: 保存环境变量
                        9. 在设置好环境变量以后, 保存变量值
                        10. tftp: tftp 32000000 vmlinux,
                        把server(IP=环境变量中设置的serverip)中/tftpdroot/
                        下的vmlinux通过TFTP读入到物理内存32000000处。
                        11. kgo: 起动没有压缩的linux内核,kgo 32000000
                        12. bootm:起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000
                        13. protect: 对FLASH进行写保护或取消写保护, protect on
                        1:0-3(就是对第一块FLASH的0-3扇区进行保护),protect off 1:0-3取消写保护
                        14. erase: 删除FLASH的扇区, erase
1:0-2(就是对每一块FLASH的0-2扇区进行删除)
                        15. cp: 在内存中复制内容, cp 32000000 0
                        40000(把内存中0x32000000开始的0x40000字节复制到0x0处)
                        16. mw: 对RAM中的内容写操作, mw 32000000 ff
                        10000(把内存0x32000000开始的0x10000字节设为0xFF)
                        17. md: 修改RAM中的内容, md 32000000(内存的起始地址)
                        18. usb:
                        l usb start: 起动usb 功能
                        l usb info: 列出设备
                        l usb scan: 扫描usb storage(u 盘)设备
                        19. fatls:列出DOS FAT文件系统, 如:fatls usb 0列出第一块U盘中的文件
                        20. fatload: 读入FAT中的一个文件,如:fatload usb 0:0 32000000
                        aa.txt
                        21. 把USB中的aa.txt 读到物理内存0x32000000处!
                        22. flinfo: 列出flash的信息
                        23. loadb: 准备用KERMIT协议接收来自kermit或超级终端传送的文件。
                        24. nfs: nfs 32000000 192.168.0.2:aa.txt ,
                        把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt
                        读入内存0x32000000处。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

基于ARM S3C2410的TSLIB1.4的移植过程详解

一、在ubuntu下编译tslib1.4 1、下载tslib-1.4.tar.gz http://download.csdn.net/detail/it_newborn/5675271 2、解压ts...

uboot在s3c2410上的移植文档

  • 2008-10-29 16:59
  • 225KB
  • 下载

s3c2410uboot移植实验

  • 2009-03-14 09:22
  • 142KB
  • 下载

uboot-1.3.2移植到s3c2410

1、下载u-boot源码:u-boot-1.3.2.tar.gz(文件大小约为7M)   2、用SSH服务登陆linux,将源码拷贝到linux下的/home/arm-work/下,这个是我自己习...

s3c2410移植nand支持到uboot, 使用nand.c ,linux mtd 架构

-boot-1.1.6与1.1.4相比,两者有较大的不同,1.1.6 更像是复制了 kernel 的方法来实现。 下面对nand flash的初始化代码nand_init()进行分析: ...

arm Linux系统移植步骤-s3c2410

ARM9S3C2410微处理器与Linux的结合越来越紧密,逐渐在嵌入式领域得到广范的应用。目前,在便携式消费类电子产品、无线设备、汽车、网络、存储产品等都可以看到S3C2410与Linux相结合的身...

基于S3C2410-ARM Linux启动过程分析

本文着重分析FS2410平台linux-2.6内核启动的详细过程,主要包括:zImage解压缩阶段、vmlinux启动汇编阶段、startkernel到创建第一个进程阶段三个部分,一般将其称为linu...

ucos在s3c2410上运行过程整体剖析之基础知识-与UCOS运行有关的ARM9芯片知识

阅读这些内容前,希望你对计算机有了一点简单的概念,最好学习过计算机组成原理并知道一些最基本的概念。如果你学习过51系列的单片机并且利用51系列的单片机做过一些开发,那看这些内容就很简单了。如果你没这些...

ucos在s3c2410上运行过程整体剖析之基础知识(5)-与UCOS运行有关的ARM9芯片知识--续 .

http://blog.csdn.net/zhanglianpin 用户模式(user模式),运行应用的普通模式; 快速中断模式(fiq模式),用于支持数据传输或通道处理; 中断模式(irq...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)