一、arm复习
芯片组成:控制器 存储器 运算器
1、寄存器:
1)通用寄存器:r0-r15 r13:sp r14:lr r15:pc
2)程序状态寄存器: cpsr spsr 高4位(NZCV) 低8位(FITM)
2、模式
3、异常
通用指令:
移动:mov
四则:add sub
位:and orr
比较:cmp
moveq
跳转:b bl
mov pc, lr
ldr pc, =main
存取:str ldr
ldr r1, [r0]
str r1, [r0]
多寄存器:stmfd ldmfd
1、需求:com2 poll 发送 接收 (字符串)
2、看原理图:
1)原理
2)管脚:BUF_XuTXD2---》GPA1_1 BUF_XuRXD2--》GPA1_0
3)控制芯片:有芯片,芯片手册去看
3、看芯片手册:
1)管脚: GPA1CON
2)控制芯片:
驱动:
start.S : 启动文件
main.c : 源文件,驱动文件
makefile :编译文件
map.lds :链接文件
s-->o : arm-linux-gcc start.S -o start.o -c
o--->elf: arm-linux-ld -Tmap.lds start.o -o start.elf
elf--->bin: arm-linux-objcopy -O binary start.elf start.bin
main.c
void uart_sendch(char a)
{
UTXHn = a;
}
void uart_init(void)
{
/*管脚*/
GPA1CON = GPA1CON & ~0xff | 0x22;
/*控制芯片*/
ULCONn = 0x3;
UCONn = UCONn & ~0xf | 0x1 | 0x1<<2;
UBRDIVn = 0x35;
UFRACVALn = 0x4;
}
void main()
{
char a = 'A';
uart_init();
uart_sendch(a);
}
二、加载内核
sudo apt-get install tftpd-hpa
u-boot-fs4412.bin BootLoader二进制文件
uImage 内核的二进制文件
Exynos4412-fs4412.dtb 设备树的二进制文件
ramdisk.img 根文件系统的二进制文件
rootfs.tar.xz 根文件系统的压缩包
gatewayip=192.168.2.1 网关
ipaddr=192.168.2.42 目标板IP
netmask=255.255.255.0 掩码
serverip=192.168.2.240 服务器IP
set gatewayip 192.168.2.1
set ipaddr 192.168.2.42
set netmask 255.255.255.0
set serverip 192.168.2.240
save
tftp 41000000 uImage
tftp 42000000 exynos4412-fs4412.dtb
tftp 43000000 ramdisk.img
bootm 41000000 43000000 42000000
1、把压缩包放到家目录下某个目录
2、进入这个目录 解压: tar -xvf u-boot-2013.01.tar.bz2
3、cd u-boot-2013.01
修改makefile:
184 #ifeq ($(HOSTARCH),$(ARCH))
185 CROSS_COMPILE ?= arm-linux-
186 #endif
4、make distclean //清理环境,只在第一次使用
5、make origen_config //选中需要编译的芯片和板子
6、make //编译
三、uboot流程
1、找入口---》链接文件--》Makefile
2、Makefile中找到 arch\arm\cpu\u-boot.lds
3、u-boot.lds --》ENTRY(_start) //入口函数
CPUDIR/start.o (.text*) //第一个代码文件
4、_start:(start.S)
-->reset
-->set the cpu to SVC32 mode && 关中断
-->Setup vector
-->cpu_init_cp15 //Invalidate L1 I/D disable MMU
-->cpu_init_crit
-->lowlevel_init(board/samsung/origen/lowlevel_init.S)
-->如果在内存中:直接到下一步;如果不在内存中:system_clock_init mem_ctrl_asm_init
--> 初始化uart uart_asm_init
--> tzpc_init
-->_main(arch\arm\lib\crt0.S)
-->搭建C环境
--> 清bss
--> board_init_r (arch\arm\lib\board.c)
-->各种设备的初始化,各种逻辑的初始化后
-->for() //等待命令,执行命令
--》main_loop
四、uboot移植流程
1、需求:把内核加载起来
2、确认芯片是否支持(rch\arm\cpu\armv7)
1)支持 goto 3
2) 不支持(新的uboot,芯片厂商
3、确认板子是否支持(board)
1)支持:
2)不支持:新uboot 板子厂家 找芯片一模一样的板子(origen)
4、cp board/samsung/origen board/samsung/fs4412 -af
cp include/configs/origen.h include/configs/fs4412.h
修改 boards.cfg 增加:
origen arm armv7 origen samsung exynos
fs4412 arm armv7 fs4412 samsung exynos
5、编译
6、烧写:
1)断电,拨码开关拨到 SD卡启动
2)上电,进入uboot命令行 FS4412 #
3)tftp 41000000 u-boot.bin (ubunt 把uboot.bin 拷贝到 tftp目录)
4)movi write u-boot 41000000
1)断电,拨码开关拨到 EMMC启动
2)上电 ,就能看到我们自己做的uboot的效果了
7、验证:
现象:板子变板砖
思考:程序是否执行到 ---》 添加一个观察点 --》程序开始的地方点灯
在 start.S中 135行下添加:
136 /*led on*/
137 ldr r0, =0x11000c40
138 ldr r1,[r0]
139 bic r1,r1,#0xf0000000
140 orr r1,r1,#0x10000000
141 str r1,[r0]
142
143 ldr r0, =0x11000c44
144 ldr r1,[r0]
145 orr r1,r1,#0x80
146 str r1,[r0]
现象: 板子依然是板砖。。。。。
思考: uboot 没有被执行 ----> 上电 到 uboot启动 中间有一块 没有搞清楚的 ---》 芯片手册 5章节
emmc : bl1 + bl2 + uboot
拷贝 CodeSign4SecureBoot 到 uboot的主目录下
进入主目录,执行./build.sh
现象: 板子灯终于亮了。。。。 but 灯灭了 then 亮了 灭了。。。。。
思考: uboot在板子上运行了。板子在不断的复位
复位原因:1、异常: X
2、看门狗: X
从下往上找,逆向思维,电源---》电源管理模块
ONO 高电平输出
现象: 灯一直亮着。。。。 but 终端还是没有打印
思考: 去看看串口是否ok ---》 修改串口时钟,确认是100M
现象:终端有显示了,但是ping命令没有
思考:ping有,但是是否编译进去了, common的目录下去找ping ,ping由宏开关控制, 打开这个宏开关
现象:ping命令有了, but 卡死了
思考: 怀疑网卡是不是出了问题。。。 找dm9000初始化 dm9000_initialize
board_init_r--》eth_initialize --》board_eth_init --》dm9000_initialize
在origin.c 里面 添加网卡初始化 及对应的头文件内容
#ifdef CONFIG_DRIVER_DM9000
int board_eth_init(bd_t *bis)
{
return dm9000_initialize(bis);
}
#endif
头文件修改 fs4412.h,具体内容在实验手册中看
现象:网卡有了,但是出现下面的打印
ERROR: resetting DM9000 -> not responding
dm9000 not found at 0x05000000 id: 0x00000000
ping failed; host 192.168.2.240 is not alive
思考:0x05000000地址的设备有问题,需要把这个设备初始化好,该设备是SROMC(这个分析原理图,由片选得知的)
在origin.c 中增加如下调用:
board_init (参考的)
--》smc9115_pre_init
--》s5p_gpio_cfg_pin
--》s5p_config_sromc
board_init (我们自己加的)
--》sdm9000aep_pre_init
--》gpio设置,未封装
--》exynos_config_sromc
现象:网络有了,可以用了
五、编译内核
修改makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
1、make exynos_defconfig //arch/arm/configs
2、make menuconfig // 功能的选择 增加或者删减或者修改
3、make uImage
sudo apt-get install libncurses-dev
mkimage
cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-fs4412.dts
vi arch/arm/boot/dts/Makefile exynos4412-fs4412.dtb
make dtbs
增加网卡设备:
1、make menuconfig dm9000增加
2、修改设备树文件 exynos4412-fs4412.dts
#include
srom-cs1@5000000 {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x5000000 0x8000000>;
ranges;
ethernet@5000000 {
compatible = "davicom,dm9000";
reg = <0x5000000 0x2 0x5000004 0x2>;
interrupt-parent = <&gpx0>;
interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;
davicom,no-eeprom;
};
};
自动的把网卡设备开启,把ip设置好
Networking support --->
Networking options --->
[*] IP: kernel level autoconfiguration
bootargs=root=/dev/ram rw console=ttySAC2,115200 init=/linuxrc ip=192.168.2.42 clk_ignore_unused
NFS启动
解压rootfs压缩包,得到一个目录,比如是:/home/lyx/mydd/rootfs
在Ubuntu下开启nfs:
1、修改配置 /etc/exprots
/home/lyx/mydd/rootfs *(rw,sync,no_root_squash,no_subtree_check)
2、 sudo /etc/init.d/nfs-kernel-server restart
在 uboot界面下设置:
setenv bootargs root=/dev/nfs nfsroot=192.168.2.240:/home/lyx/mydd/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.2.42 clk_ignore_unused
set bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
修改内核的配置,增加nfs
File systems --->
Network File Systems --->
<*> NFS client support
[*] Root file system on NFS
配置好了,make Image 一下
六、busybox 制作方法
1、解压busybox-1.22.1.tar.bz2
2、进入busybox-1.2
2 执行 make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs) x x
(arm-linux-) Cross Compiler prefix
3、make
4、make install
5、cd _install 扩展我们的目录:etc lib proc sys tmp //自己创建,再添加
6、填充内容:
etc 参考之前发的 rootfs
lib :cp ~/mydd/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/* lib/ -af
7、rm xxxxx/rootfs -rf
cp _install xxxx/rootfs -af