技术标签: path c null linux 测试 makefile flash
移植是一个复杂的过程,其中的东西太多,最初应该以掌握思路、方法为主,能够编译通过,实现简单功能,在实践中慢慢积累经验,熟悉过程。
在PC上编译好U-Boot,生成Bin文件,将开发板与PC通过串口和USB口相连,把生成的Bin文件通过USB口下载到开发板上RAM里,从RAM里直接运行,查看串口是否按要求输出信息。熟悉u-boot移植的流程和基本设置,对于设计flash,网卡,usb等的移植在后面结合内核移植深入研究
移植内容:LED,串口,时钟以及基本硬件初始化等内容
移植过程:
一.建立交叉编译环境
拷贝并解压arm-linux-gcc-3.4.1.tgz,
#tar xvzf arm-linux-gcc-3.4.1.tgz –C /
建立工作目录
#mkdir /home/u-boot1.1.6
运行命令,改变路径
#gedit /root/.bashrc
编辑/root/.bashrc文件最后一行
export PATH=$PATH:/usr/local/arm/3.4.1/bin
重启linux,然后测试编译环境是否建立
#arm-linux-gcc –v
二.在u-boot中建立自己的开发板类型,并测试编译
1.在U-Boot源码Board中找一款与目标开发板配置相近的文件夹,进入board目录,把smdk2410复制一份并命名为mini2440,进入mini2440目录,将里面的smdk2410.c改成mini2440.c,同时Makefile中也要作相应的更改。
2. 进入include/configs目录,将smdk2410.h复制一份并命名为mini2440.h。
3. 打开U-Boot根目录下的Makefile文件,搜索smdk2410,定位到smdk2410_config : unconfig处,对照该格式在下面加两行:
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
各项的意思如下:
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
mini2440: 开发板的型号(BOARD),对应于board/mini2440目录。
Null: 开发者/或经销商(vender),直接在board目录下此处为NULL
s3c24x0: 片上系统(SOC)。
4.进入mini2440目录修改Makefie文件
COBJS := smdk2410.o flash.o为
COBJS := mini2440.o flash.o
5.测试编译
[[email protected] u-boot-1.1.6]# make mini2440_config
Configuring for mini2440 board...
[[email protected] u-boot-1.1.6]# make
测试通过完成第一步工作
三.修改u-boot文件,匹配mini2440
3.1 修改/cpu/arm920t/start.S
(1)启动代码的正式开始处,加上led驱动,使其能够显示u-boot进程
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
#define GPBUP 0x56000018
ldr r0, =GPBUP
ldr r1, =0x7FF
str r1, [r0]
ldr r0, =GPBCON
ldr r1, =0x154FF
str r1, [r0]
ldr r0, =GPBDAT
ldr r1, =0x000 /*使其全部点亮四个led灯*/
str r1, [r0]
在以上向行代码分别定义了操作PB口的寄存器地址,关闭PB口上拉,设置PB5、6、7、8口为输出口(对应mini2440开发板上的4个LED),设PB5、PB6、7、8设为为低电平,对应LED亮。
(2) 关闭u-boot的RAM初始化功能
一般的Bootloader都有以下两个功能:上电首先初始化RAM;然后将自身复制到RAM中运行,提高运行速度。以上两点我们可以从start.S文件中start_code往下的两个宏看到:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
我们直接通过现在Bootloader将U-Boot.bin文件下载到内存中运行,RAM初始化的动作已经由Supervivi做了,这里我们不需要再次进行初始化,而且如果进行初始化也会导致试验失败,因此一定要将LOWLEVEL_INIT功能关掉,你可以在这里把bl cpu_init_crit注释掉,也可以在include/configs/mini2440.h中增加一个宏定义:
#define CONFIG_SKIP_LOWLEVEL_INIT 1
(3)修改寄存器地址
#if defined(CONFIG_S3C2400)
#define pWTCON 0x15300000
#define INTMSK 0x14400008 /* Interupt-Controller base addresses */
#define CLKDIVN 0x14800014 /* clock divisor register */
#else
#define pWTCON 0x53000000
#define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
#define INTSUBMSK 0x4A00001C
#define CLKDIVN 0x4C000014 /* clock divisor register */
#endif
(4)修改中断部分
#if defined(CONFIG_S3C2410)
ldr r1,=0x7ff /*根据2410芯片手册,INTSUBMSK有11位可用, vivi也是0x7ff,U-Boot一直没改过来。*/
ldr r0,=INTSUBMS
str r1,[r0]
#endif
#if defined(CONFIG_S3C2440)
ldr r1,=0x7fff /*根据2440芯片手册,INTSUBMSK有15位可用*/
ldr r0,=INTSUBMSK
str r1,[r0]
#endif
(5)修改时钟
#define MPLLCON 0x4C000004
#define UPLLCON 0x4C000008
ldr r0, =UPLLCON
ldr r1, =0x38022
str r1, [r0]
ldr r0, =MPLLCON
ldr r1, =0x7F021
str r1, [r0]
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
第一段代码定义了相关寄存器,CLKDIVN前面已有定义;第二段设置了USB时钟频率48MHz;第三段设置了系统的主频405MHz;第四段设置了分频系数,将主频降频分配给系统总线,等其它慢速设备使用
打开board//mini2440/mini2440.c,修改M_MDIV、
M_PDIV、M_SDIV等几个值,在这里主要就是修改宏定义,改成与前面在汇编文件中寄存器设置的参数一致即可,
#define M_MDIV 0x7f
#define M_PDIV 0x2
#define M_SDIV 0x1
//ldr r0, =MPLLCON
//ldr r1, =0x7F021(由此处设计上面数值)
(6)修改串口
修改cpu/arm920t/s3c24x0/speed.c中的频率计算函数。2440中FCLK的计算与2410有一定的区别,是原2410计算值的2倍,另外已知前面设置的分频参数是FCLK:HCLK:PCLK=1:4:8,直接把HCKL设为FCLK的1/4,代码修改如下:
ulong get_FCLK(void)
{
......
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
if (pllreg == MPLL)
r = clk_power->MPLLCON;
return((CONFIG_SYS_CLK_FREQ * m*2) / (p << s));
else if (pllreg == UPLL)
r = clk_power->UPLLCON;
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
else
hang();
}
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/4 : get_FCLK());
}
(7)在文件中添加“CONFIG_S3C2440”,使得原来s3c2410的代码可以编译进来。
U-Boot里有些驱动根据处理的型号的不同,配置的方法、参数各不相同,那么就是通过这个CONFIG_XXXXX来定义区分的。由于S3C2410和S3C2440的寄存器地址和参数设置基本是相同的,所以只需在定义CONFIG_S3C2410的地方加上CONFIG_S3C2440即可,CONFIG_MINI2440同理;如果处理器差异较大,那么在具体地置你就要根据该处的功能需要编写相应的驱动代码。
在u-boot根目录下运用命令寻找带有”CONFIG_S3C2410”的文件然后在后面加上||defined(CONFIG_S3C2440)
[[email protected] u-boot-1.1.6]# grep 'CONFIG_S3C2410' * -R
然后依次进行修改
特别注意:
/cpu/arm920t/s3c24x0/interrupts.c文件的181行,加上红字部分
#elif defined(CONFIG_SBC2410X) || \
defined(CONFIG_SMDK2410) || \
defined(CONFIG_VCMA9)||defined(CONFIG_mini2440)
四:修改完毕后,进行编译
[[email protected] u-boot-1.1.6]# make
编译生成uboot.bin,现在运行
Uboot的基本流程已经基本熟悉,后面可以根据需要进行flash,网卡等相关移植。
by 麦田
2009.6.25
本文主要参考以下两位博友文章,表示感谢
目录一、实验目的及要求二、实验原理三、实验环境四、实验步骤及内容4.1账户与口令4.2审核与日志4.3安全模板五、实验总结六、分析与思考一、实验目的及要求了解Windows账户与密码的安全策略设置,掌握用户和用户组的权限管理、审核,以及日志的启用,并学会使用安全模版来分析配置计算机。二、实验原理Windows系列是目前世界上使用用户最多的桌面操作系统。由于历史原因,Windows的很多用户都直接以管理员权限运行系统,对计算机安全构成很大隐患。从Wi...
先附上我的跳转源码<navigator open-type="navigate" url="../addtime/index"><image style="width:50px;height:45px;float:right;padding-right:15px;padding-top:15px;" src="{{imageSrc}}"></image></navigator>1、跳转到的目标page未定义在app.json中{"pages":
Oracle RAC的基本介绍RAC编辑RAC,全称real application clusters,译为“实时应用集群”,是Oracle新版数据库中采用的一项新技术,是高可用性的一种,也是Oracle数据库支持网格计算环境的核心技术。Oracle RACRAC提供的优缺点优点Oracle RAC主要支持Oracle9i、10g、11g版本,可以支持24 x
1、用于监听I2C读写操作,判断配置操作是否正确,用于快速问题定位。2、FPGA实现思路,SCL和SDA均为输入,检测I2C操作START、STOP,地址解析,数据解析。3、利用XILINX FPGA,将I2C操作用在线调试工具体现。4、效果如下:监听I2C效果:Start->0x98->ACK->0x0F->ACK->0x00->ACK->STOPStart->0x98->ACK->0x05->ACK->0
在进行后处理时,Ansys默认读取当前目录下的默认求解结果文件。Ansys的求解结果文件有以下几种:(1).RST –结构分析或耦合场分析结果;(2).RTH –热分析和扩散分析结果;(3).RMG –磁场分析结果;(4).RFL –FLOTRAN分析结果。在Ansys中可通过如下方法读取非默认的结果文件数据:(1)GUI:General Postproc - Data&File ...
目录 序 言 1.1 大数据时代的技术挑战 1.2 数据可视化的技术难点 1.3 可视化工具的必备特性 第一部分:大数据可视化基础篇 2.1 集群的安装及网络配置 2.1.1 Hadoop集群概述 2.1.2 集群软件及其版本 2.1.3 集群网络环境配置 2.2 集群案例数据集简介 2.2.1 数据字段说明 2.2.2 数据...
Docker内运行ROS(melodic版本)以及使用Rviz写在前文Docker的安装以及介绍本文就不再累述了,安装Docker的版本任意,但是要注意的一点是你是ARM板子还是x86的板子,一般在ARM板上实现上述功能较为麻烦,如果是在ARM板子上使用Docker+ROS的话可以参考这篇文章http://wiki.ros.org/docker/Tutorials/Hardware%20Acceleration#nvidia-docker1在ROS的官网上有教程,但是还是有些坑的,如果你使用的是Nvi
1.通过运行Oracle Database Configuration Assistant 创建、配置、或删除数据库(也可在命令行下输入dbca);2.用命令行的方式建立数据库3.通过运行自定义的批处理脚本(或create_ORACLE_SID.bat(create_ORACLE_SID.sql))来创建、配置、或删除数据库。1.通过运行Oracle Database Configuration ...
编译丨维克多、王晔吴恩达是人工智能(AI)和机器学习领域国际最权威的学者之一,最近一年里,他一直在提“以数据为中心的AI”,希望将大家的目光从以模型为中心转向以数据为中心。最近,在接受IE...
以前我们提过,当一个类的非explicit构造函数接受一个实参时,如果你在使用该类的地方填入的是那个实参类型,就会发生隐式转化:通过实参临时创建一个该类的对象,然后把这个对象填入使用该类的地方。其实我们也可以自己定义类型的转化。有人可能觉得这件事情不是很有意义,其实,在某些地方,它的使用往往能起到事半功倍的效果。举一个例子说明,加入我们定义了一个“较小”的整数范围0~255,把它封装成一个类。(在
如图打开:设置-设备-触摸板-取消勾选连接鼠标时让触摸板保持打开状态这样设置之后,当有鼠标连接的时候,系统会关闭触摸板,反之,当拔掉鼠标时,触摸板随之恢复!