[tiny4412]学习总结-uboot

一、 sd_fuse目录的内容

主要是生成两个工具:mkbl2 和 sd_fdisk

交叉编译工具链:arm-none-linux-gnueabi  gcc version 4.5.1

通过tiny4412芯片手册,得知如下信息:

1、芯片可以提供 四个UART、四个 SD Host and high-speed Multimedia Card Interface,这个高速接口,个人理解是手册中提到的Mobile Storage Host,特殊之处在于 8-bit DDR传输(因为这款芯片较老,支持MMC4.41协议,频率为50MHz,现在eMMC协议发展到了5.0协议之后,都支持了HS400传输模式,频率为200MHz),其他的sd controller(Secure Digital/MultiMediaCard MMC Controller),支持高速MMC规范4.3版标准。

首先是什么?是什么的问题,需要反复研读加深理解,通过查阅资料,阅读协议。再学习怎么应用?

关于JEDEC对 MMC/EMMC 协议的改进以及发展历史:

https://www.cnblogs.com/gctech/p/11722194.html

MMC v4.3 版本增加了eMMC规格定义,可以通过CID寄存器,得知device是MMC Card还是eMMC

MMC v4.4 版本一个重要的改动是加入了 DDR模式,使得eMMC速度得到提升

MMC v4.41 版本主要增加了 Background Operations 和 High Priority Interrupt 两个可选的功能

MMC v4.5 版本移除了 MMC Card 的支持,只保留 eMMC 的规格定义

MTK平台的sd/mmc controller是 Memory Stick and SD Card Controller(MSDC)

MMC:强调的是多媒体存储。

SD:强调的是安全和数据保护(SD卡为Secure Digital Memory Card, 即安全数码卡。它在MMC的基础上发展而来,增加了两个主要特色:SD卡强调数据的安全安全,可以设定所储存的
使用权限。在数据传输和物理规范上,SD卡(24mm*32mm*2.1mm,比MMC卡更厚一点),向前兼容了MMC卡.所有支持SD卡的设备也支持MMC卡。SD卡和2.11版的MMC卡完全兼容。)

SDIO是从SD演化出来的,强调的是接口(SDIO是在SD标准上定义了一种外设接口,它和SD卡规范间的一个重要区别是增加了低速标准。在SDIO卡只需要SPI和1位SD传输模式。低速卡的目标应用是以最小的硬件开销支持低速IO能力)

MCI是Multimedia Card Interface的简称

exynos4412的启动:

 

[tiny4412]学习总结-uboot_第1张图片

 [tiny4412]学习总结-uboot_第2张图片

修改uboot/arch/arm/config.mk 的交叉编译工具链的名字,为本地的名字。

CONFIG_SYS_TEXT_BASE = 0x43e00000 的由来:

exynos4412的ram的起始地址是 0x40000000 ,设置uboot的加载地址是0x43e00000,从irom code启动开始一共设置三次栈:

1、sram中的栈

2、uboot刚加载运行的栈,就是0x43e00000往下的位置

3、uboot已经正常启动,重新设置栈,在uboot代码的上方往下的位置,只要不越界就OK.

堆栈是计算机中广泛应用的技术,基于堆栈具有的数据先进后出特性,常应用于保存中断断点、保存子程序调用返回点、保存CPU现场数据等,也用于程序间传递参数

为了更准确地描述堆栈,根据“压栈”操作时堆栈指针的增减方向,将堆栈区分为‘递增堆栈’(SP 向大数值方向变化)和‘递减堆栈’(SP 向小数值方向变化);又根据SP 指针指向的存储单元是否含有堆栈数据,又将堆栈区分为‘满堆栈’(SP 指向单元含有堆栈有效数据)和‘空堆栈’(SP 指向单元不含有堆栈有效数据)。

这样两两组合共有四种堆栈方式——满递增、空递增、满递减和空递减。满堆栈开口向上,空堆栈开口向下。

MMU使能后linux内存中的栈区和堆区 相向而生 堆区符合人们的习惯存放方式  栈区由操作系统来控制

注意区分 数据结构的堆(用来排序)栈(先进后出),和操作系统的内存布局中的堆区栈区 和 uboot中没有开启MMU的内存布局中的堆栈区,uboot中其实就是栈,用sp来控制。

下载uboot:

git clone https://gitee.com/haoyungrz/tiny4412-ddr_1g-uboot.git && git checkout develop

编译 用于生成bl2 的工具
make -C sd_fuse

修改 arch/arm/config.mk ,将自己本地的工具链名字修改好,再编译

编译uboot:

   make tiny4412

制作bl2.bin:
../mkbl2 ../../u-boot.bin bl2.bin 14336

插上SD卡,找到对应的设备节点,执行 sudo ./sd_fusing.sh /dev/sdb 完成写入bl1,bl2,uboot.bin

[tiny4412]学习总结-uboot_第3张图片

SD卡虽然不会用作windows的启动盘,但是为了兼容,还是会在前512字节存放MBR,包括分区信息。

另外,如果已经用友善的sdflash工具将SD卡已经分好区,那么结果就是前130M用来放小系统,后边格式化成FAT32,以后使用sd_fusing.sh并不会损坏正常的FAT32分区的信息。

此时可以从SD卡启动了。

方便以后脱离SD卡,对emmc重新格式化,放入支持fastboot的uboot,以及支持dtb的kernel4.4,以及ramdisk。

格式化emmc

fdisk -c 1 320 6064 300  -> 如果uboot较大,可以将cache分区调小

fatformat mmc 1:1    -> 分区1格式化成FAT32,这个分区小,需要保持兼容性,不整成ext3

ext3format mmc 1:2 -> system分区

ext3format mmc 1:3 -> data分区

ext3format mmc 1:4 -> cache分区

接下来刷写镜像:

板子执行:emmc open 1

dnw 0x40000000  -> 下载到ram的这个位置

pc执行 dnw ~/uboot/sd_fuse/tiny4412/E4412_N.bl1.bin

板子执行:mmc write 1 0x40000000 0 0x10  -> 1代表设备,0x40000000代表ram地址,0x10代表8kb

pc执行 dnw ~/uboot/sd_fuse/tiny4412/bl2.bin

板子执行:mmc write 1 0x40000000 0x10 0x1C -> 写入14k,这个区域预留32个block,所以下一个开始是32+16=48(0x30)

pc执行 dnw ~/uboot/sd_fuse/tiny4412/u-boot.bin

板子执行:mmc write 1 0x40000000 0x30 0x230 -> 写入280k uboot.bin,预留有328kb的空间

之后emmc close 1,就可以从emmc启动了。

接下来编译busybox,首先配置下生成的目录 make menuconfig

Installation Options  ---> (./out_ramdisk) BusyBox installation prefix

编译:

make -j8 && make install

完善生成的目录,结果目录如下:

https://gitee.com/haoyungrz/ramdisk.git

接下来配置kernel中的ramdisk的路径,到时候会生成uImage:

修改 .config(cp tiny4412_linux_4_4_defconfig .config) 中的 CONFIG_INITRAMFS_SOURCE= 即可,如果根文件系统很大,需要修改kernel分区大小。

接下来编译kernel-4-4:

make LOADADDR=0x40008000 uImage -j16

make dtbs

板子执行:fastboot

pc执行:

fastboot flash kernel-4-4 arch/arm/boot/uImage

fastboot flash dtb arch/arm/boot/dts/exynos4412-tiny4412.dtb

然后就可以启动到ramdisk了。

[tiny4412]学习总结-uboot_第4张图片

[tiny4412]学习总结-uboot_第5张图片

你可能感兴趣的:(Linux系统,学习,linux,C,驱动开发)