跳至主要内容

【转】移植U-Boot手记

好久没来写blog了,有点对不住lupa了,赶紧补上两个这两天学嵌入式的心得,呵呵

一直想弄弄u-boot,却一直没时间弄。现在终于放假了,准备趁此清闲机会好好研究研究bootloader,于是从昨天开始往s3c2410板子上移植uboot,目前可以实现uboot在Nand Flash上的启动,擦写NF和引导Linux内核还没整明白。

一开始准备上sourceforge下的,不知怎么回事,就是上不去,于是改去www.denx.de上下载个最新版本的u-boot 1.2.0。下来之后在/usr/src中tar jxvf u-boot-1.2.0.tar.bz2解压缩了,进入代码目录,然后把board/smdk2410目录给cp成board/py2410,这个 py2410是我给自己板子起的名字,其他名字也可以,无特定要求。然后cd board/py2410,把里面的smdk2410.c改名称py2410.c(要与板子名称一致)。并且把 include/configs/smdk2410.h给cp成include/configs/py2410.h。最后退到源代码目录的根处,把 Makefile里面加上:
py2410_config: unconfig
  @$(MKCONFIG) $(@:_config=) arm arm920t py2410 NULL s3c24x0
并找到
ifeq($(ARCH), arm)
CROSS_COMPILE = arm-linux
在这里修改交叉编译工具的路径。这里有个问题,第一次我使用的是2.95.3的arm-linux-gcc,编译了一下不好使,说是一个什么符号不识别。然后我就改用了3.3.2版本的工具,然后问题解决。因为在网上搜帖子看到的大部份人编译uboot 1.1.3用的是2.95.3,难道1.2.0的时候不好使了?所以比较疑惑,有时间再研究一下这个地方。
做好以上工作之后就可以build一下了
make py2410_config
make all
一阵编译之后,没有问题,生成了u-boot.bin等文件,但是这个如果现在就下载到板子上用,那基本上是不好使的,所以接下来就开始修改一些参数,添加一些代码,使其能正常工作。

上网搜索了一下uboot移植的帖子,以下这个比较不错,很详细:
这个帖子说的是移植到arm7上的,可以参考一下移植过程以及了解一下uboot工作的方式
http://www.icwin.net/ShowArtitle.ASP?art_id=6598&cat_id=16
所谓修改参数主要是指修改在include/configs/py2410.h中定义的一些宏,这个文件里定义了像CPU频率,网卡地址,SDRAM的某些设置也都在这里。主要修改如下:
/*cs8900网卡的设置*/
#define CONFIG_DRIVER_CS8900   1         //使用cs8900的驱动
#define CS8900_BASE         0x19000300   //网卡的地址,如要变动,则需查阅板子的手册
#define CS8900BUS16         1
/*设置波特率*/
#define CONFIG_BAUDRATE       115200
下面是选择要编译的命令,这些命令是在uboot启动之后可以在提示符下使用的,具体含义README中有详细说明,需要指出的是,ping的功能得自己手动加上去,CONFIG_CMD_DEL中没有ping,将这里修改如下:
#define CONFIG_COMMANDS
(CONFIG_CMD_DFL |
CFG_CMD_CACHE |
/*CFG_CMD_NAND | */
/*CFG_CMD_EEPROM |*/
/*CFG_CMD_I2C |*/
/*CFG_CMD_USB |*/
CFG_CMD_PING   |
CFG_CMD_REGINFO |
CFG_CMD_DATE |
CFG_CMD_ELF)
这里关于nand的命令先没加上,因为擦写nand的功能还没搞明白
下面是关于网络的一些环境变量的设置(这些变量都可以在uboot起来之后重新修改):
#define CONFIG_BOOTDELAY   5
#define CONFIG_BOOTARGS   "root=/dev/mtdblock2 loadramfs=0 devfs=mount mem=64M init=/linuxrc console=ttyS0,115200"
#define CONFIG_ETHADDR       00:00:C0:FF:EE:08
#define CONFIG_NETMASK       255.255.255.0
#define CONFIG_IPADDR       10.0.0.110
#define CONFIG_SERVERIP       10.0.0.100
有关于网卡mac地址,ip地址,以及tftp服务器的ip的设置,还有linux内核启动的参数等
接下来非常重要,使关于SDRAM的设置:
#define CONFIG_NR_DRAM_BANKS     1        
#define PHYS_SDRAM_1           0x30000000   //SDRAM的开始地址
#define PHYS_SDRAM_1_SIZE       0x04000000   //SDRAM的大小,这里是64MB
py2410.h中基本修改这些就可以了,然后打开board/py2410/lowlevel_init.S文件:
按照板子上的实际情况的分配来修改以下寄存器的值。我是按照原来板子上给的bootloader中的设置修改的:
#define BWSCON 0x48000000       //这个是SFR区中控制SDRAM的寄存器的基址

/* BWSCON */
#define DW8   (0x0)
#define DW16   (0x1)
#define DW32   (0x2)
#define WAIT   (0x1<<2)
#define UBLB   (0x1<<3)

#define B1_BWSCON   (DW32)
#define B2_BWSCON   (DW16)
#define B3_BWSCON   (DW16 + WAIT + UBLB)
#define B4_BWSCON   (DW16)
#define B5_BWSCON   (DW16)
#define B6_BWSCON   (DW32)
#define B7_BWSCON   (DW32)

/* BANK0CON */
#if 0
#define B0_Tacs   0x0 /* 0clk */
#define B0_Tcos   0x0 /* 0clk */
#define B0_Tacc   0x7 /* 14clk */
#define B0_Tcoh   0x0 /* 0clk */
#define B0_Tah   0x0 /* 0clk */
#define B0_Tacp   0x0
#define B0_PMC   0x0 /* normal */

评论

此博客中的热门博文

【转】嵌入式开发中使用DDD进行调试

 在嵌入式程序开发过程中,程序员要进行大量的调试,以此验证程序的正确性,修改潜在的错误。调试器对于程序员来说是不可或缺的必备工具。在Linux环境中,有很多调试工具和调试辅助工具,例如GDB、XXGDB、RHIDE、XWPE、GVD和DDD等。其中,DDD是命令行调试器的图形前端,除了一般的程序调试功能以外,还具有交互式图形数据显示的功能。它在嵌入式应用开发中也十分出色。本文主要讲述DDD(Data Display Debugger)的使用方法。      1.认识DDD     GNU DDD是命令行调试程序,如GDB、DBX、WDB、Ladebug、JDB、XDB、Perl Debugger或Python Debugger的可视化图形前端。它特有的图形数据显示功能(Graphical Data Display)可以把数据结构按照图形的方式显示出来。DDD最初源于1990年Andreas Zeller编写的VSL结构化语言,后来经过一些程序员的努力,演化成今天的模样。DDD的功能非常强大,可以调试用C\C++、Ada、 Fortran、Pascal、Modula-2和Modula-3编写的程序;可以超文本方式浏览源代码;能够进行断点设置、回溯调试和历史纪录编辑;具有程序在终端运行的仿真窗口,并在远程主机上进行调试的能力;图形数据显示功能(Graphical Data Display)是创建该调试器的初衷之一,能够显示各种数据结构之间的关系,并将数据结构以图形化形式显示;具有GDB/DBX/XDB的命令行界面,包括完全的文本编辑、历史纪录、搜寻引擎。     DDD是开源软件,用户可以去 http://www.cs.tubs.de/softech/ddd/ 下载.rpm格式的DDD源码文件。      图1显示的是DDD的主窗口。它主要由选单栏、工具条、数据窗口、源文件窗口、机器码窗口、控制台和命令工具窗口等几部分组成。其中,数据窗口用于观察复杂的数据结构,在删除数据之后,显示仍然有效;源文件窗口显示源代码、断点和当前执行到达的位置,选择该窗口中的"Display"项,可以显示任意表达式的值;机...

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如...

【转】函数指针和指针函数

【函数指针】        在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 1.函数指针定义 函数类型 (*指针变量名)(形参列表); "函数类型"说明函数的返回类型,由于"()"的优先级高于"*",所以指针变量名外的括号必不可少,后面的"形参列表"表示指针变量指向的函数所带的参数列表。 例如: int (*f)(int x); double (*ptr)(double x); 在定义函数指针时请注意:     函数指针和它指向的函数的参数个数和类型都应该是―致的; 函数指针的类型和函数的返回值类型也必须是一致的。 2.函数指针的赋值 函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。 例如, int func(int x);   /* 声明一个函数 */ int (*f) (int x);    /* 声明一个函数指针 */ f=func;            /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。 3.通过函数指针调用函数 函数指针是通过函数名及有关参数进行调用的。 与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。 由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步: 首先,要说明函数指针变量。 例如:int (*f)...