打印

arm入门笔记(转帖)

[复制链接]
2184|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
五谷道场|  楼主 | 2012-3-19 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
UBOOT 移植操作(1)
[0]目录结构
◆ board:和一些已有开发板有关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关。
◆ common:与体系结构无关的文件,实现各种命令的C文件。
◆ cpu:CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、设置指令Cache和数据Cache等;interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
◆ disk:disk驱动的分区处理代码。
◆ doc:文档。
◆ drivers:通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。
◆fs:支持文件系统的文件,U-BOOT现在支持cramfs、fat、fdos、jffs2和registerfs。
◆ include:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。
◆ net:与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
◆ lib_arm:与ARM体系结构相关的代码。
◆ tools:创建S-Record格式文件 和U-BOOT images的工具。
==========================================================================================
[1]u-boot.1.1.2目录下有Makefile
1)设置编译器
可以看到这一项:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
也就是说这里所用的交叉编译器是arm-linux-gcc,u-boot默认是用这个的,也有用arm-elf-gcc的,arm-elf-tools-20030314.sh,用它来编译,没有问题。如果最后MAKE的时候提示找不到arm-linux-gcc就是这错了,改一下。
arm-elf-gcc是用来编译uClinux内核的工具,arm-linux-gcc用来编译LINUX
2)加进自己板子的项目
搜索B2的这部分文件
B2_config      :      unconfig
       @./mkconfig $(@:_config=) arm s3c44b0 B2 dave
后面加上这部分:
TT_config       :      unconfig
       @./mkconfig $(@:_config=) arm s3c44b0 TT T2T
切记在@./mkconfig $(@:_config=) arm s3c44b0 TT T2T
前面的是Tab来的,TT_config       :      unconfig也是一样,不能用空格代替,因为它是靠这个来识别命令的
==========================================================================================

相关帖子

沙发
五谷道场|  楼主 | 2012-3-19 10:09 | 只看该作者
[2]在宿主机(PC机)上建立arm-elf-gcc交叉编译环境

1)建立arm-linux-gcc编译环境
在RedHat Linux系统下以root用户登录,
将cross-2.95.3.tar.bz2文件复制到/目录下,
安装:
# tar jxvf cross-2.95.3.tar.bz2
这个命令会在你的/usr/local/arm/2.95.3目录下安装 arm-linux-gcc 交叉编译程序,
然后在PATH变量中添加一项:/usr/local/arm/2.95.3/bin.
[root@localhost root]# export PATH=$PATH:/usr/local/arm/2.95.3/bin


把PATH=:$PATH:/usr/local/arm/2.95.3/bin添加到/ETC/bash_profile文件中

或者
在/etc/bashrc文件中添加一项:
export PATH=:$PATH:/usr/local/arm/2.95.3/bin
之后可以测试一下 echo $PATH

注意:PATH大小写不一样,另外LINUX下大小写是不同的,以后不特别声明。

注意:命令中的参数之间都由单个空格或者TAB隔开,命令前有的有# 代表命令行符,不用输入。

注意:不可在WINDOWS下用winRAR解压u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz这种文件,会少文件,去LINUX下,另外解压的时候也不用非点用命令行操作,LINUX现在对GUI已经支持的非常好了,比如解压只要右键点文件,选解压到当前文件夹就可以,执行的时候只要双击再选“执行”

注意:我用的VMWARE(虚拟机)装的LINUX,要在LINUX和WIN中间传递文件用VM-》SETTING里的SHARE FOLDER
该功能是把WIN 下的一个文件夹共享给LINUX。
这个功能必须装VMWARE TOOLS才能用,
装VMWARE TOOLS方法:首先在VM-》SETTING里CDROM项里把光驱设置为装入VMWARE安装文件夹下的LINUX工具的.ISO,LUINUX下就出现CDROM了 拷贝 解压 安装不在话下。必须注意的是VMWARE TOOLS在每次重起LINUX之后还必须也重起一下,TMD,谁搞定不用重起告诉我一声
重起的方法:/etc/init.d/vmware-tools restart
就有消息出来了

注意:另外郁闷的是我的WIN与LINUX之间复制文字似乎也不顺畅,干脆在SHARE FOLDER里建立一个TXT,两个系统捣文字玩~~

测试:
把终端关闭,重新打开后执行如下命令:

# arm-linux-gcc –v

建立好交叉编译环境后可以试着编译u-boot了
2)也可以建立arm-elf-gcc
与上面类似,用周立功的编译包直接安装
会在/usr/local/bin下产生arm-elf-gcc只类的文件
然后设置路径
[root@localhost root]# export PATH=$PATH:/usr/local/arm-elf/bin

使用特权

评论回复
板凳
五谷道场|  楼主 | 2012-3-19 10:12 | 只看该作者
[3] 测试交叉编译器搞好没有
编译个44B0例子 在UBOOT包目录下执行一下命令,以下是编译的包自带的DAVE公司板子B2(名)
1)     Make distclean (清除以前编译的痕迹)
2)     Make B2_config(B2代表B2板子的,前面见到过)
3)     Make
没问题就可以进行下面了
注意:B2默认用arm-linux-gcc编译,要是前面安的arm-elf-gcc的话此时会报错 把UBOOT目录下的MAKEFILE按照前面说的改一下
注意:一般说来还会有个问题,怀疑是编译器的问题 提示什么abi=apcs-gnu只类的找不到吧~~记不住了
改UBOOT目录下config.mk (好象)
文件里改成如下
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
原来的行少了$(call cc-option,-mabi=apcs-gnu,) 具体在哪行忘了 CTRL+F搜索一下
其他应该没问题,有问题GOOGLE搜一下,不是通病就是自己安装的问题了
注意:
MAKE之后会生成三个文件:
u-boot——ELF格式的文件,可以被大多数Debug程序识别;
u-boot.bin——二进制bin文件,纯粹的U-BOOT二进制执行代码,不保存ELF格式和调试信息。这个文件一般用于烧录到用户开发板中;

使用特权

评论回复
地板
五谷道场|  楼主 | 2012-3-19 10:12 | 只看该作者
u-boot.srec——Motorola S-Record格式,可以通过串行口下载到开发板中

使用特权

评论回复
5
五谷道场|  楼主 | 2012-3-19 10:12 | 只看该作者
[4]开始配置U BOOT
1)给自己板子个公司起个名,我的公司叫T2T 板子叫TT,刚才那个例子公司名DAVE板子名B2
以B2板子的程序做为模板来做,省很多工作
#cd u-boot-1.1.2//进U BOOT目录
#cd board //进BOARD目录,该目录下存放各种公司的开发板,但44B0的好象只有一种B2
#cp -R dave T2T (复制 并且改名)
#cd T2T
#mv B2 TT (复制 并且改名)
#cd TT
# mv B2.c TT.c
修改TT里面的Makefile, 把B2改成TT,编译时如果报的其它类似找不到B2的错误也是把相应的B2改成TT来处理。
修改T2T/TT/config.mk
  TEXT_BASE = 0x0c1000000
修改T2T/TT/Makefile
  将所有的B2改为TT
2)/include/configs
cp B2.h TT.h依旧是把B2的改个名
注意:DAVE的板子是用44B0的,但还有其他板子用吗?怎么确定只有它用?用以下命令

到board目录查了一下:
#cd u-boot
#cd board
#find . -exec grep -l 44B0 {} \;
结果是:
./dave/B2/B2.c
B2网站是: http://www.dave-tech.it

3)以下文件修改记录

----------------------------------------------------------------------------------------------------
-----------------------------------/include/configs/TT.h-------------------------------------------
----------------------------------------------------------------------------------------------------
#define CONFIG_INIT_CRITICAL     1         这个在cpu/s3c44b0/start.S里面用到,如果你的u-boot程序不是在sdram中调试而是固化到flash中运行的话,这个必不可少。

找到 #define CONFIG_B2          1        改成CONFIG_TT

找到 #define CONFIG_S3C44B0_CLOCK_SPEED   75   主频改成60

找到Size of malloc() pool这部分设置,改成这样。

#define CFG_MONITOR_LEN            (256 * 1024)   /* Reserve 256 kB for Monitor      */

#define CFG_ENV_SIZE                 (64*1024)        /* 1024 bytes may be used for env vars*/

#define CFG_MALLOC_LEN              (CFG_ENV_SIZE + 128*1024 )

#define CFG_GBL_DATA_SIZE    128  /* size in bytes reserved for initial data */

#define CFG_ENV_IS_IN_FLASH         1  这个必不可少,如果你想把你的参数保存到flash的话
#define CFG_ENV_ADDR    (PHYS_FLASH_1+0x40000)  这个就是你的参数保存在flash里的起始地址了

#define CFG_ENV_OFFSET 0x40000      这个我后来看它源程序发现如果你上一步没有设置它的起始地址的话就会用它来作默认地址的了

#define CONFIG_AUTO_COMPLETE

其它地方没有深究哦,有些好像不要也行,你就试试吧。

找到Hardware drivers部分,这应该是网络芯片设置吧,参考一下这个吧(要看芯片的):

#define CONFIG_DRIVER_RTL8019        这个就要看你的板上用的是什么网卡了(这个是台湾出的,有10M)

#define RTL8019_BASE        0x06000300   这个是网卡相就寄存器的起始地址,有的挂在BANK4上了地址自然是0X08000300

以下部分我试过不要也行,你试下吧

#define RTL8019_BUS32             0

#define CONFIG_SMC_USE_16_BIT

#undef  CONFIG_SHOW_ACTIVITY

#define CONFIG_NET_RETRY_COUNT           10       应该是重试的次数吧


#define CONFIG_SERIAL 1

#define CONFIG_BAUDRATE             115200  设置波特率




#define CONFIG_COMMANDS          ( CONFIG_CMD_DFL | \

                                                        CFG_CMD_DATE | \

                                                        CFG_CMD_ELF    | \

                                                        CFG_CMD_NET    | \

                                                        CFG_CMD_EEPROM   | \

                                                        CFG_CMD_I2C            | \

                                                        CFG_CMD_FAT | \

                                                        CFG_CMD_JFFS2)

把CFG_CMD_EEPROM改成CFG_CMD_FLASH吧,虽然不改也是可以的,具体没考究。




以下是板上env参数设置,看一下吧,其实我觉得了解一下就行的了,只是一些初始设置值,以后可以用命令setenv  saveenv来修改的。

#define CONFIG_BOOTDELAY   3                这个就是运行bootcmd之前的等待时间

#define CONFIG_BOOTARGS  "devfs=mount root=ramfs console=ttyS0,115200" 引导uClinux的时候传递的参数,不会就先不用管它也行。

#define CONFIG_ETHADDR       00:50:c2:1e:af:fb    网卡的物理地址MAC

#define CONFIG_NETMASK  255.255.255.0       掩码地址,设置过ip的人都应该知道吧

#define CONFIG_IPADDR   192.168.0.30          这是你板上网卡8019的ip地址

#define CONFIG_SERVERIP       192.168.0.10       这是你宿主机的ip地址,以后用tftp下载的时候用到,一定要跟你的宿主机一致才行。

#define CONFIG_BOOTFILE       "u-boot.bin"        这个就是你要下载文件的默认名字,注意的是不是UBOOT编译的文件 而是UBOOT下载以后在这个地址执行这个文件,比如这个文件在下LINUX后就常被改成UCLINUC.BIN了

#define CONFIG_BOOTCOMMAND   "bootm 0x50000"   这是bootdelay后运行的命令




Miscellaneous configurable options部分,参考一下吧:

#define    CFG_LONGHELP                       /* undef to save memory       */

#define    CFG_PROMPT      "TENWAY=>"   这是进入命令模式下的提示符,改个帅一点的吧

#define    CFG_CBSIZE        256         /* Console I/O Buffer Size     */

#define    CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */

#define    CFG_MAXARGS          100              /* max number of command args  */

#define CFG_BARGSIZE             CFG_CBSIZE /* Boot Argument Buffer Size       */




#define CFG_MEMTEST_START     0x0C400000   /* memtest works on     */

#define CFG_MEMTEST_END           0x0C800000   /* 4 ... 8 MB in DRAM  */

#undef  CFG_CLKS_IN_HZ              /* everything, incl board info, in Hz */

#define    CFG_LOAD_ADDR             0x0c008000    默认的下载地址

#define    CFG_HZ                      1000              /* 1 kHz */

#define CFG_BAUDRATE_TABLE  { 9600, 19200, 38400, 57600, 115200 } 可供选择的波特率







Physical Memory Map部分,比较重要,修改你的sdram和flash的地址和容量。

#define CONFIG_NR_DRAM_BANKS 1        我们只占用了一个Bank用来映射sdram

#define PHYS_SDRAM_1            0x0c000000     sdram的起始地址

#define PHYS_SDRAM_1_SIZE   0x00800000     sdram的容量(8M)

#define PHYS_FLASH_1              0x00000000     flash的起始地址

#define PHYS_FLASH_SIZE        0x00200000 flash的容量(2M)

#define CFG_FLASH_BASE         PHYS_FLASH_1   定义多个名字而已,其它地方会用到

注意:
存储容量的计算方法
2M=0x00200000-----------------16进制转换成10进制(用WINDOWS自带的计算机就行)-------------------》2097152
2097152=1024*1024*2

FLASH organization部分,看注释应该知道了吧,参考一下:
/*-----------------------------------------------------------------------
* FLASH organization
*/
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks  */
#define CFG_MAX_FLASH_SECT 256 /* 最大支持的SECTOR数量,另外SAM FEI的补丁这里设置了32个 是错误的*/
//#define CFG_MAIN_SECT_SIZE      0x10000  /* main size of sectors on one chip */

#define CFG_FLASH_ERASE_TOUT 4120000 /* Timeout for Flash Erase (in ms) 在前面加个4让它长点 */
#define CFG_FLASH_WRITE_TOUT 1000 /* Timeout for Flash Write (in ms) */
其他地方还没动 以后动的再补上

使用特权

评论回复
6
五谷道场|  楼主 | 2012-3-19 10:14 | 只看该作者
UBOOT 移植操作(3)

----------------------------------------------------------------------------------------------------
-----------------------------------board/myboard/common/flash.c-----------------------------------
----------------------------------------------------------------------------------------------------
找到这个函数:write_buff

里面有这句话,一共有6处吧?全改了:#ifdef CONFIG_B2

把CONFIG_B2改成上面TT.H文件里面起的名,我的叫CONFIG_TT

关于FLASH的一点疑问:
一直怀疑29LV160和39LV160在U BOOT下是否兼容的问题
看了这段程序后似乎U BOOT是可以自动检测的

----------------------------------------------------------------------------------------------------
-----------------------------------board/T2T/TT/memsetup.S-----------------------------------
-----------------------------------也叫board/T2T/TT/lowlevel_init.S-----------------------------------
----------------------------------------------------------------------------------------------------
按照如下改

* Bank 0 parameter */
.equ    B0_Tacs,      0x3 /* 0clk */
.equ    B0_Tcos,      0x3 /* 0clk */
.equ    B0_Tacc,      0x7 /* 14clk */
.equ    B0_Tcoh,      0x3 /* 0clk */
.equ    B0_Tah,       0x3 /* 0clk */
.equ    B0_Tacp,      0x1 /* 0clk */
.equ    B0_PMC,       0x0 /* normal(1data) */
/* Bank 1 parameter */
.equ    B1_Tacs,      0x0 /* 4clk */
.equ    B1_Tcos,      0x1 /* 4clk */
.equ    B1_Tacc,      0x2 /* 14clkv */
.equ    B1_Tcoh,      0x1 /* 4clk */
.equ    B1_Tah,       0x0 /* 4clk */
.equ    B1_Tacp,      0x0 /* 6clk */
.equ    B1_PMC,       0x0 /* normal(1data) */

/* Bank 2 parameter -  */
.equ    B2_Tacs,      0x0 /* 4clk */
.equ    B2_Tcos,      0x2 /* 4clk */
.equ    B2_Tacc,      0x4 /* 14clk */
.equ    B2_Tcoh,      0x2 /* 4clk */
.equ    B2_Tah,       0x3 /* 4clk */
.equ    B2_Tacp,      0x3 /* 6clk */
.equ    B2_PMC,       0x0 /* normal(1data) */

/* Bank 3 parameter */
.equ    B3_Tacs,      0x3 /* 4clk */
.equ    B3_Tcos,      0x3 /* 4clk */
.equ    B3_Tacc,      0x7 /* 14clk */
.equ    B3_Tcoh,      0x3 /* 4clk */
.equ    B3_Tah,       0x3 /* 4clk */
.equ    B3_Tacp,      0x3 /* 6clk */
.equ    B3_PMC,       0x0 /* normal(1data) */

/* Bank 4 parameter */
.equ    B4_Tacs,      0x3 /* 4clk */
.equ    B4_Tcos,      0x3 /* 4clk */
.equ    B4_Tacc,      0x7 /* 14clk */
.equ    B4_Tcoh,      0x3 /* 4clk */
.equ    B4_Tah,       0x3 /* 4clk */
.equ    B4_Tacp,      0x3 /* 6clk */
.equ    B4_PMC,       0x0 /* normal(1data) */

/* Bank 5 parameter */
.equ    B5_Tacs,      0x0 /* 4clk */
.equ    B5_Tcos,      0x1 /* 4clk */
.equ    B5_Tacc,      0x4 /* 14clk */
.equ    B5_Tcoh,      0x1 /* 4clk */
.equ    B5_Tah,       0x0 /* 4clk */
.equ    B5_Tacp,      0x0 /* 6clk */
.equ    B5_PMC,       0x0 /* normal(1data) */

/* Bank 6(if SROM) parameter */
.equ    B6_Tacs,      0x3 /* 4clk */
.equ    B6_Tcos,      0x3 /* 4clk */
.equ    B6_Tacc,      0x7 /* 14clk */
.equ    B6_Tcoh,      0x3 /* 4clk */
.equ    B6_Tah,       0x3 /* 4clk */
.equ    B6_Tacp,      0x3 /* 6clk */
.equ    B6_PMC,       0x0 /* normal(1data) */

/* Bank 7(if SROM) parameter */
.equ    B7_Tacs,      0x3 /* 4clk */
.equ    B7_Tcos,      0x3 /* 4clk */
.equ    B7_Tacc,      0x7 /* 14clk */
.equ    B7_Tcoh,      0x3 /* 4clk */
.equ    B7_Tah,       0x3 /* 4clk */
.equ    B7_Tacp,      0x3 /* 6clk */
.equ    B7_PMC,       0x0 /* normal(1data) */

/* Bank 6 parameter */
.equ    B6_MT,        0x3 /* SDRAM */
.equ    B6_Trcd,      0x1 /* 2clk */
.equ    B6_SCAN,      0x0 /* 8bit */

.equ    B7_MT,        0x3 /* SDRAM */
.equ    B7_Trcd,      0x1 /* 2clk */
.equ    B7_SCAN,      0x0 /* 8bit */


/* REFRESH parameter */
.equ    REFEN,        0x1 /* Refresh enable */
.equ    TREFMD,       0x0 /* CBR(CAS before RAS)/Auto *** */
.equ    Trp,        0x0 /* 2clk */
.equ    Trc,        0x3 /* 0x1=5clk 0x3=11clk*/
.equ    Tchr,       0x0 /* 0x2=3clk 0x0=0clks  */
.equ    REFCNT,       1550

MEMORY_CONFIG:
  .long   0x01000102 /* Bank0 = OM[1:0] , Bank1-2 4-7 16bit, ,BANK3 8BIT,Bank2=Nowait,UB/LB*/
  .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) /*GCS0*/
  .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) /*GCS1*/
  .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) /*GCS2*/
  .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) /*GCS3*/
  .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) /*GCS4*/
  .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) /*GCS5*/
  .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))  /*GCS6*/
  .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))  /*GCS7*/
  .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)  /*REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019*/
  .word 0x10      /*SCLK power down mode, BANKSIZE 16M/16M*/
  .word 0x20      /*MRSR6 CL=2clk*/
  .word 0x20      /*MRSR7*/
主要是设置MEMORY_CONFIG里的内容 值得注意的是.long   0x01000102 /* Bank0 = OM[1:0] , Bank1-2 4-7 16bit, ,BANK3 8BIT,Bank2=Nowait,UB/LB*/中设置了各个BANK的位宽,要注意。因为8019有8位的,有16位的,配置错了网络不通
其实就是一些字
有人从地址读出来后是下面这样也可以

MEMORY_CONFIG:
.long 0x11010102
.long 0x600
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x2610
.long 0x18000
.long 0x18000
.long 0x960459
.long 0x10
.long 0x20
.long 0x20
由于对armsys硬件不是太了解,没有办法,只得看armsys bootloader程序,但每个版本又有差别.因此是用AXD调试看bootlaoder启动后0x1c80000中的值定的.

注意:这个注意是后补上的,因为自己和朋友在做的时候发现网上对这部分分析的人特别少,可能因为理论比较简单,操作起来又比较麻烦吧。
听听菜鸟的方法吧。

首先U BOOT1.1.1和1.1.4版本有个小差别,就是文件名的差别1.1.1叫memsetup.S,1.1.4叫lowlevel_init.S如果把别人用1.1.1编译的直接拿过来也可以,但一定记得在改文件名的同时还一定要在文件里改函数名!就是这个文件最后那部分汇编上面的函数名。不然后来会提示START.S里找不到lowlevel_init。切记

另外,比较重要的这部分究竟代表什么,怎么改。
这个文件实际分3部分,这3个部分实际又是把44B0初始化那几个汇编文件重新组合了,就是ADS在RAM里调试文档里说的,把44B0当单片机用时C语言前面的那写汇编文件,一般说来包括44binit.s MEMCFG.S 44BLIB_A.S Option.s。其中44binit.s MEMCFG.S就包含了内存初始化的参数,按照这两个文件改吧。

再说这3部分
开始是内存设置,在数据手册(英文)4-14页,各个意思就不多说了。说说怎么改,当然得根据你的内存具体改(一句废话)但是有简单的方法,前面提到了,看MEMCFG.S这个文件。

然后是一些移位只类的操作,把各个BANK设置好,其实就是设置一些预定义的字,然后在其他的地方利用这些字设置寄存器。就把这些理解为宏或者就当是个结构体吧(不准确,就帮助理解)。为什么这么设置看看数据手册(英文)4-13页
这部分在怎么改的快?找,哪找?44binit.s里面有,一模一样,不罗嗦了。

最后那部分是这个文件唯一执行的部分
基本不需要改吧(除了有的时候函数名:))
看见0X01C80000还不明白吗?看数据手册(英文)4-3页去吧,有汇编的例子,至于这个32位寄存器为什么这么设置。

别看我这装的明白,就是会对付,别跟我较真,我还也在研究中:)

注意:顺便在这里说说个小问题,有朋友问“为什么原理图上地址线从A1开始,而不是A0”看数据手册(英文)4-4页,因为是16位地~~~
注意:我的8019是连在BANK3上的 而且是8BIT的 所以MEMORY_CONFIG下面第一项里要做设置 要不不好使

----------------------------------------------------------------------------------------------------
-----------------------------------board/T2T/TT/config.mk-----------------------------------
----------------------------------------------------------------------------------------------------
修改最后的TEXT_BASE为把UBOOT加载到RAM的地址,这里添0XC700000,当然添0XC300000也可以 但是如果添0XC300000之前的似乎在下载LINUX的时候会死机,因为地址空间不够


-----------------------------------------------------------------
-----------------------------------cpu/s3c44b0/start.S------
-------------------------------------------------------------------

找到
#if CONFIG_S3C44B0_CLOCK_SPEED==60
   
ldr r0, =0x70081 /* 60MHz (Quartz=10MHz) 具体怎么算的 可以看我写的计算方法说明*/
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0xac042  /* 75MHz  */
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
设置一下主频

------------------------------------------------------------------------------
--------------cpu/s3c44b0/serial.c-----------------------------------
--------------------------------------------------------------------------------
找到以下几项
主要是把频率改一下并把分拼设置对
void serial_setbrg (void)
{
DECLARE_GLOBAL_DATA_PTR;

u32 divisor = 0;

/* get correct divisor */
switch(gd->baudrate) {
      
           
     

case 1200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
  divisor =  3124;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
  divisor = 3905;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
  break;

case 9600:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
  divisor = 390;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
  divisor = 487;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
  break;

case 19200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
  divisor = 194;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
  divisor = 243;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
  break;

case 38400:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
  divisor = 97;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
  divisor = 121;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif  break;

case 57600:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
  divisor = 64;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
  divisor = 80;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif  break;

case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
  divisor = 32;/*具体算法和上面主频算法在一个文档里*/
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
  divisor = 40;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
--------------------------------------------------------------------------
---------board/T2T/TT/TT.C-------------------------------
------------------------------------------------------------
这个没什么好说的,如果你用的是网上流行的原理图,改动基本没有,我的因为加了些东西,所以这个文件改动很多。
但文件里主要就是对44B0各个管脚设置,哪个是IO哪个是TXD、RXD。不多说了,自己看数据手册8-6页,有点耐心。

---------------------------------------------------------------------
------------lib_arm/board.c-----------------------------------
---------------------------------------------------------
好象网卡需要加个INCLUDE
//待补充
这个文件不用修改,在网上找的讲解,顺便提一下

进行各种初始化设置,主要有:
cpu_init CPU相关的设置, 具体在./cpu/s3c44b0/cpu.c中.
board_init 板子相关的设置, 具体在board/wx/wx20/wx20.c 中
interrupt_init中断设置,我们没有用,具体在./cpu/s3c44b0/interrupts.c中
env_init 初始化环境变量, 具体要看用什么介质来存储环境变量,如果用flash来存贮, 程序在common/env_flash.c中.
init_baudrate 设置baud参数
serial_init 串口初始化, 具体在cpu/s3c44b0/serial.c.
console_init_f 控制台设置, 具体在./common/console.c

display_banner 显示标题.[这里可以鼓捣一下,让它输出些个性的东西:)]
dram_init 可用内存配置, 具体在./board/wx/wx20/wx20.c.
flash_init flash初始化,具体./drivers/cfi_flash.c.

接下来就是环境变量初始化, 网络初始化,最后到main_loop,可以运行各种命令.
====================================
[5]烧写FLASH
这部分可能过于简单,很少有人写,但是对于不了解ARM开发过程的人真的简单吗?我是菜鸟,在这卡了3天:)
一般说来有几种方法,
1)板子原来的BOOTLOADER程序或者为烧写而编写的专用ADS程序
比较高级而快速的方法,很多现成的开发板都用这种方法(相对来说有实力的公司),此状态下CPU是运行的,所以速度快。
比如ZLG的,但是对于初学或者不准备细研究硬件的人来说就比较麻烦,因为要编写(改写)ADS烧写程序。愿意的人可以看看。
2)FLUTED
和FLASHPGM一样,使用的好象叫边界扫描法,CPU此时并不运行,因此烧写的比较慢。
在这里也不推荐FLUTED这个软件,原因比较简单,麻烦+速度慢。
因为需要编写(改写)两个配置文件,而且是字符界面。倒是有人说这个软件只能在WIN98下用的说法好象不对(现在有可以让2000和XP下用的方法)
喜欢的朋友可以用用
3)FLASHPGM(推荐)
很简单的程序,GUI界面,速度尚好。
设置很简单,在CPU里选对型号,当然是3星的44B0。在FLASH里也一样,39LV160,29LV160都有。
确定好地址,RAM地址我的是0XC000000(BANK7上) FLASH地址0X0(BANK0上)
选完了以后读一下FLASH的ID(左下脚的按钮吧)能读出厂家的ID就行。
然后是烧写了,PROGRAME按钮,注意的是FLASHPGM不支持BIN格式,按照下面方法处理。
再有就是尽量在写之前擦一下,PROGRAME菜单里有个选项,打个钩就OK。
具体烧写方法可以看我总结的另一篇文档,在这里只说说UBOOT相关的。
前面说过UBOOT编译以后产生3个文件
u-boot——ELF格式的文件,可以被大多数Debug程序识别;
u-boot.bin——二进制bin文件,纯粹的U-BOOT二进制执行代码,不保存ELF格式和调试信息。这个文件一般用于烧录到用户开发板中;
u-boot.srec——Motorola S-Record格式,可以通过串行口下载到开发板中。
FLASHPGM不支持BIN格式的,可以烧写u-boot——ELF格式的文件,别看它没扩展名,一样烧写。
还有,如果你懒(和我一样),拿别人现成的BIN文件来烧,FLASHPGM还提供了一个BINTOS19的程序,就在它的安装目录下。具体用法运行它,它自己就告诉你了。

注意:有时(尤其是FLASH里已经有程序的时候)0XC000000会莫名奇妙的提示内存不可以写,有几个方法可以试试:把地址改成0x10000000(好象是缓存地址),之后点EREASE擦除芯片,擦除一般说来是不成功的,最后无论如何都下不去,没关系,这时候关闭擦除对话框,然后0x10000000地址不变,烧FLASH,我一般是烧写一个我自己写的LED测试小程序把内存占上:)。回来这时候再把0X1000000换成0XC000000再按照正常操作,一般可以正常。
这现象的原因就是过去下的程序(多数是不正确的程序)正在运行 占用了RAM与ROM,下个LED测试小程序就是把这几个部分清除掉。
如果以上方法还不正常,可以用另一个程序叫FLASHP就差2个字母:)很好!在这里对这个程序的作者致敬!!
用这个软件擦FLASH,然后再用FLASHPGM烧,原因是FLASHP擦厉害,但写好象有些问题~~

细小的问题--patch命令的使用
有的时候大家收到的别人移植好的UBOOT了UCLINUC了是以patch包发布的

这里转个写的比较好的patch命令的使用方法

文件:isp1161-2.6.12.patch(在/root下)

--- linux-2.6.12/drivers/usb/Makefile 2005-06-17 22:48:29.000000000 +0300
+++ linux-2.6.12-new/drivers/usb/Makefile 2005-07-27 08:11:47.908336540 +0300

......
......

由于patch文件的首行已经指明了路径,所以根据当前所在的目录,加不同的参数使用patch命令:

1:如果当前的目录是和linux-2.6.12的同级目录:

[root@kcn-110mw]#patch -p0 </root/isp1161-2.6.12.patch

2:如果当前的目录为 linux-2.6.12/:

[root@kcn-110mw]#patch -p1 </root/isp1161-2.6.12.patch

3:如果当前的目录为 linux-2.6.12/drivers/:

[root@kcn-110mw]#patch -p2 </root/isp1161-2.6.12.pathc

0,1,2,是指略去的patch文件中的前几级目录

使用特权

评论回复
7
五谷道场|  楼主 | 2012-3-19 10:15 | 只看该作者
细小的问题---VMWARE安装与使用
首先 推荐大家在开发的过程中使用VMWARE虚拟机 安装LINUX
原因比较简单 开发过程中会频繁的在两个系统之间交换 对于没有两个计算机的朋友来说 过于麻烦
对的不说了 说说开发里遇到问题
==================================
一 安装VMWARE虚拟机与LINUX
1 分出个10G左右的地方
我是分个10G的FAT32格式分区来单独做LINUX的区域,推荐分出来的空间大于9G,因为对于新手来说LIXUN要尽量全部安装。
分区尽量是FAT32格式(WINDOWS用的)NTFS听有的朋友说过好象有问题。
推荐计算机内存大于256M,我用的是512M,开VMWARE再开ACROBAT时就会明显慢。
安装后的VMWARE虚拟机基本是3种文件,VMWARE程序文件我安在C盘下了,VMWARE的配置文件(安装后再添加的,比较小)和VMWARE虚拟出的硬盘文件(选10G,该文件就是10G),所以我单独分出个驱存他们。
虚拟机里安装后的操作系统(一般都是LINUX吧,顺便说一下,你也可以按WIN了苹果了操作系统)
2 安装VMWARE虚拟机
VMWARE虚拟机对于WINDOWS来说就是个软件,用这个软件虚拟出个计算机来。对于VMWARE虚拟机里面安装的系统来说自己就独占了一台计算机。
安装没有什么特殊的,我用的是VER5.5,选标准安装,基本一律下一步就搞定。
值得注意的是中间有问你分出来多大硬盘空间,默认是8G ,改成10G吧。
之后是建立VMWARE虚拟机配置文件,根据自己的要求建立,基本不用改什么,就是整错了也可以在后来的SETTING里改。
不多说了。
3 安装LINUX
把LINUX安装盘放光驱里吧,启动虚拟机,自己就检测启动了。
多说一句,到这大家都明白了吧?启动虚拟机就相当于启动一个计算机,光盘自动启动也跟物理上的计算机完全一样。
值得注意的是:如果电脑里安了虚拟光驱可能影响光盘自动启动,如果有问题就把虚拟光驱卸了吧。
安装的时候同样没什么问题,手动分驱,按照内存大小的2倍分出来个SWAP分驱,其余的我分成一个驱,强制为主分驱,挂载点选“/”根目录,分驱格式选EXT3……
多说一句,在分驱里就能看出来了吧?LINUX完全独占了这10G的地方,看不到WINDOWS

使用特权

评论回复
8
五谷道场|  楼主 | 2012-3-19 10:15 | 只看该作者
二 安装VMWARE-tools

VMWARE-tools还是安装比较好,最起码WIN和LINUX交换文件就方便了
引用别人的** 加上自己的注释吧
1、以ROOT身份进入LINUX

2、按下 CTRL+ALT组合键,进入主操作系统,点击VMWARE状态栏安装提示,或者点击 SETTING菜单下的ENABLE VMWARE TOOLS子菜单。

3、确认安装VMWARE TOOLS。
这时我们并没有真正的安装上了VMWARE TOOLS软件包,如果您点击菜单:DEVICES,您就会发现光驱的菜单文字变为:ide1:0-> Crogram FilesVMwareVMware WorkstationProgramslinux.iso,这表示VMWARE将LINUX的ISO映象文件作为了虚拟机的光盘

注释:有的时候不能自动挂载,自己要在菜单里光驱项目里选挂载VMWARE安装目录(不是配置文件存储目录,我的在C盘里)里某个目录的linux.iso

4、鼠标点击LINUX界面,进入LINUX。

5、运行如下命令,注意大小写。

mount -t iso9660 /dev/cdrom /mnt

加载CDROM设备,这时如果进入 /mnt 目录下,你将会发现多了一个文件:vmware-linux-tools.tar.gz。这就是WMWARE TOOLS的LINUX软件包,也就是我们刚才使用WINISO打开LINUX.ISO文件所看到的。

注释:在新版本里可以不用命令挂载和卸载了,打开 LINUX.ISO后LINUX桌面会自动弹出光驱标志,双击打开。

cp /mnt/vmware-linux-tools.tar.gz /tmp

将该软件包拷贝到LINUX的 TMP目录下。

umount /dev/cdrom

卸载CDROM。

cd /tmp

进入TMP目录

tar zxf vmware-linux-tools.tar.gz

解压缩该软件包,默认解压到vmware-linux-tools目录下(与文件名同名)。

cd vmware-linux-tools

进入解压后的目录

./install.pl

运行安装命令。

这时install提示你是否需要备份以前的配置文件,建议选择"y"。

等待INSTALL运行完成后,这时键入 START 命令,是不是可以看到漂亮的LINUX图形界面了?

使用特权

评论回复
9
五谷道场|  楼主 | 2012-3-19 10:15 | 只看该作者
三 使用VMWARE TOOLS
必须注意的是VMWARE TOOLS在每次重起LINUX之后还必须也重起一下,TMD,谁搞定不用重起告诉我一声
重起的方法:/etc/init.d/vmware-tools restart
就有消息出来了

使用特权

评论回复
10
五谷道场|  楼主 | 2012-3-19 10:15 | 只看该作者
四 文件共享
我用的VMWARE虚拟机装的LINUX,要在LINUX和WIN中间传递文件用VM-》SETTING里的SHARE FOLDER
该功能是把WIN 下的一个文件夹共享给LINUX。
这个功能必须装VMWARE TOOLS才能用。
共享以后在LINUX的MNT目录下就出一个F什么打头的文件夹,进去就是你共享的文件夹名了

细小的问题---arm-linux-gcc与arm-elf-gcc的区别
总看见有人问

arm-linux-gcc为有MMU的LINUX准备的比如2410上的LINUX

arm-elf-gcc为没有MMU的UCLINUX准备的比如44B0上的UCLINUX

就这么简单

使用特权

评论回复
11
lirfv| | 2012-3-19 11:18 | 只看该作者
好资料                                 
楼主辛苦了                       
感谢分享

使用特权

评论回复
12
老电工1979| | 2012-3-19 12:22 | 只看该作者
真不少,楼主方便整个文档上传啊!!

使用特权

评论回复
13
大江东去| | 2012-3-19 14:52 | 只看该作者
楼主辛苦了 支持一个

使用特权

评论回复
14
张凤武| | 2012-3-19 17:40 | 只看该作者
学习一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7647

主题

9805

帖子

11

粉丝