iTop4412的uboot第一阶段
解析迅为三星iTOP解析迅为三星iTOP-4412开发板硬件接口功能
解析迅为三星iTOP-4412开发板硬件接口功能本帖最后由xunwei 于2014-1-9 15:18 编辑iTOP-4412开发板底板iTOP-4412开发板提供了丰富的底板外设,标配WIFI和蓝牙模块,连接LCD或HDMI 显示器可实现通过无线wifi进行视频播放:下面对底板功能模块分别进行相关阐述:1、以太网接口通过一条RJ45线,连接这个接口到PC或者路由器,甚至到另外一个开发板,可实现有线以太网络通讯。
连接成功以后,两台机器的IP地址要设置在同一个网段,即同一个子网(例如:192.168.0.x),这样双方就可以通过PING命令来通讯了:ping 192.168.0.88至此,上层应用可以通过socket协议实现端到端的数据通讯,完成各种网络应用。
网络接口芯片采用LAN9215,这颗芯片稳定可靠,适合工业应用,通过16位数据总线以及6位地址总线与处理器交换数据,在通讯速率等方面要优于其他方案。
2、HDMIExynos 4412内置HDMI控制器,不需要外接转换芯片即可输出高性能1080P高清影像:该接口可以与LCD接口同步输出,没有购买LCD的用户可以直接使用HDMI接口连接普通显示器或者电视,显示效果十分理想,软件稍作调整,就是一个高性能的机顶盒了,如下图:3、WIFI与蓝牙WIFI和蓝牙由同一颗芯片来实现,三星自家模组:开发板出厂时会标配这个模组,以方便用户使用。
WIFI和蓝牙共享一颗天线,通过分时切换的方式兼顾两者应用,这样做并不会影响速度,而且成了平板或者手机设计的传统做法。
4、LCD接口如上图所示,左边是TP触摸屏接口,右边是LVDS标准的LCD接口,上面的芯片将RGB信号转换成LVDS;为了兼容RGB接口的屏幕,在开发板的背面引出同规格的兼容RGB标准的液晶接口;配套开发板使用的是款9.7寸LCD屏幕,与IPAD 屏幕大小及规格兼容,TP为十点触控:5、触摸屏TP接口开发板留出了单独的触摸屏TP接口,配套TP支持十点触控操作。
uboot框架熟悉(一)itop4412-uboot2015引导阶段程序在各存储介质的分布
uboot框架熟悉(⼀)itop4412-uboot2015引导阶段程序在各存储介质的分布 本⽂分析itop4412开发板在uboot引导启动阶段,程序在各存储介质的分布情况,为理解uboot代码框架提供基础。
以uboot2015为例,以外部SD/MMC作为启动介质。
⽬录⼀、itop4412-uboot2015镜像⽂件组成⼆、itop4412-uboot启动流程1>> 开机运⾏iROM中的代码2>> BL1阶段3>> BL2(SPL)阶段4>> uboot第⼆阶段代码⼀、itop4412-uboot2015镜像⽂件组成 在ubuntu中将uboot镜像烧写到SD卡的命令如下,功能是将uboot镜像⽂件itop4412-uboot.bin⽂件烧写到SD卡第1个扇区开始的地⽅: dd iflag=dsync oflag=dsync if=itop4412-uboot.bin of=/dev/sdb seek=1 其中itop4412-uboot.bin由如下⽂件制作成: cat E4412_N.bl1.SCP2G.bin bl2.bin env.bin u-boot.bin > itop4412-uboot.bin 其中, E4412_N.bl1.SCP2G.bin :8KB,三星提供的bin⽂件,没有源码,下⽂称为BL1 bl2.bin :16KB,uboot启动第⼀阶段代码,在uboot2015中称为SPL阶段,下⽂称为BL2 env.bin :8KB,内容是全0的bin⽂件,在SD卡中占位8KB⽤于存储uboot的环境变量 u-boot.bin :⼩于512KB,uboot启动第⼆阶段代码 因此,itop4412 uboot2015镜像组成⽂件中,bl2.bin和u-boot.bin是移植uboot2015编译⽣成,其他⼏个是现成的bin⽂件,直接从讯为提供的SDK 中获取。
iTOP-4412以模块的方式编译内核驱动
iTOP-4412以模块的方式编译驱动大家好,本章节我们将向大家讲解如何在linux下实现以模块的方式加载内核驱动。
我们以内核里面蜂鸣器的驱动为例来讲解。
1)首先打开内核的源码,如下图所示:2)使用命令“cd drivers/char/”,进入到蜂鸣器驱动所在的目录,如下图所示:3)然后使用命令“vi Kconfig”打开当前目录下的内核配置文件,如下图所示:4)然后找到“config BUZZER_CTL”所在的位置,如下图所示:5)然后把“bool"Enable BUZZER config"“一行改成”tristate"Enable BUZZER config"“,如下图所示:6)然后保存并退出,如下图所示:7)然后回到内核源码的根目录下,如下图所示:8)然后输入命令”make menuconfig“配置内核,如下图所示:9)选择”Device Drivers“->"Character devices"->"Enable BUZZER config",如下图所示:10)然后把”Enable BUZZER config“左边的”*“改成”M“,如下图所示:11)然后保存并退出配置界面,如下图:12)然后使用命令”vi arch/arm/mach-exynos/mach-itop4412.c“打开mach-itop4412.c,如下图所示:13)然后找到”struct platform_device s3c_device_buzzer_ctl“一行,如下图所示:14)把这一行前面的”#ifdef CONFIG_BUZZER_CTL“改成”#if defined(CONFIG_BUZZER_CTL)|| defined(CONFIG_BUZZER_CTL_MODULE)“,如下图所示:15)然后找到”&s3c_device_buzzer_ctl“一行,如下图所示:16)把这一行前面的”#ifdef CONFIG_BUZZER_CTL“改成”#if defined(CONFIG_BUZZER_CTL)|| defined(CONFIG_BUZZER_CTL_MODULE)“,如下图所示:17)然后保存并退出,返回到linux内核源码的根目录下,如下图所示:18)然后输入命令”make“,开始编译内核,如下图所示:19)编译完成后会在内核的”arch/arm/boot“目录下生成镜像文件”zImage“,如下图所示:20)在内核的”drivers/char“目录下生成了蜂鸣器的驱动模块”itop4412_buzzer.ko“,如下图所示:21)下一步我们烧写生成的zImage到开发板上,然后开发板启动进入到android系统。
【资源分享】迅为 iTOP-4412开发板平台详解
【资源分享】迅为iTOP-4412开发板平台详解开发板是一个相对复杂的电子系统,请耐心按照本章说明组装,以免造成不必要的损失。
用户最好使用迅为提供的连接线,因为有些部件是专门定制的,可能和市场上购买的其它连接线和部件不匹配,擅自使用市场上购买的接线或者部件可能损伤开发板。
在完全弄清楚开发板接口信号定义之前,如果本文档中没有提到该部件和您在市场上所购买的部件兼容,不要擅自使用自己购买的接线和其它部件,如有疑问请咨询我司技术人员。
开发板的组装控制台(Console)串口使用串口线连接开发板的COM3 到PC 机的串口,如果PC或笔记本没有串口,就需要准备一条USB转串口的设备。
注意:插拔串口,要在断电的情况下进行,以免带电插拔出现器件损坏。
PC 上对串口的操作软件请参考“3.1 超级终端的安装和使用”。
Exynos 4412 共有四个串口,其中CON3 是作为系统的调试串口,如下图所示:屏幕的连接从外观上来看,开发板有2 个HDMI 接口,其实只有一个可以接到HDMI 显示器上。
如下图所示:外形较大的HDMI-A 接口(上图中红色方框内的接口),只能连接迅为提供的7 寸屏幕或者9.7 寸屏幕,里面有5V(或者 3.3V)电源,绝对不能接到HDMI 显示器上。
使用迅为提供的HDMI 线是可以防呆的,不会接错,在用户弄清楚信号之前,不要擅自使用自己购买的HDMI 线!外形较小的HDMI(上图褐色方框内的接口)是标准的HDMI-C 接口(不属于国际标准,但是在很多电器设备中都有使用,属于日本SONY 公司定义的一种HDMI 接口,具体可以百度),建议使用我司的C 口转A 口的HDMI 线连接。
iTOP-4412 精英版除了使用HDMI 线连接屏幕外,也可以通过用户平常使用的软排线的方式来连接,如下图所示:上图中两个红色方框内的LCD 接口信号是自定义的接口,只能连接迅为提供的屏幕,和其它公司的屏幕并不保证完全兼容,这点大家一定要注意!电阻屏的连接(4.3 寸屏幕)iTOP-4412 精英版可支持4.3 寸电阻屏幕,连接方式如下图所示:4.3 寸屏幕的接口是翻盖式的,软排线带有金属触点的一面朝下连接。
iTOP-4412以模块的方式编译内核驱动
iTOP-4412以模块的方式编译驱动大家好,本章节我们将向大家讲解如何在linux下实现以模块的方式加载内核驱动。
我们以内核里面蜂鸣器的驱动为例来讲解。
1)首先打开内核的源码,如下图所示:2)使用命令“cd drivers/char/”,进入到蜂鸣器驱动所在的目录,如下图所示:3)然后使用命令“vi Kconfig”打开当前目录下的内核配置文件,如下图所示:4)然后找到“config BUZZER_CTL”所在的位置,如下图所示:5)然后把“bool "Enable BUZZER config"“一行改成”tristate "Enable BUZZER config"“,如下图所示:6)然后保存并退出,如下图所示:7)然后回到内核源码的根目录下,如下图所示:8)然后输入命令”make menuconfig“配置内核,如下图所示:9)选择” Device Drivers “->"Character devices"->"Enable BUZZER config",如下图所示:10)然后把” Enable BUZZER config “左边的”*“改成”M“,如下图所示:11)然后保存并退出配置界面,如下图:12)然后使用命令” vi arch/arm/mach-exynos/mach-itop4412.c“打开mach-itop4412.c,如下图所示:13)然后找到” struct platform_device s3c_device_buzzer_ctl “一行,如下图所示:14)把这一行前面的” #ifdef CONFIG_BUZZER_CTL“改成”#if defined(CONFIG_BUZZER_CTL) || defined(CONFIG_BUZZER_CTL_MODULE) “,如下图所示:15)然后找到” &s3c_device_buzzer_ctl“一行,如下图所示:16)把这一行前面的” #ifdef CONFIG_BUZZER_CTL“改成”#if defined(CONFIG_BUZZER_CTL) || defined(CONFIG_BUZZER_CTL_MODULE) “,如下图所示:17)然后保存并退出,返回到linux内核源码的根目录下,如下图所示:18)然后输入命令”make“,开始编译内核,如下图所示:19)编译完成后会在内核的” arch/arm/boot“目录下生成镜像文件”zImage“,如下图所示:20)在内核的” drivers/char“目录下生成了蜂鸣器的驱动模块” itop4412_buzzer.ko “,如下图所示:21)下一步我们烧写生成的zImage到开发板上,然后开发板启动进入到android系统。
第一章4412裸机相关操作
第⼀章4412裸机相关操作⼀、知识点:1、Cortex-A9开发板平台1.1、了解Cortex-A9核介绍1.2、了解Cortex-A9核⼼,三星公司⽣产的Exynos 44121.3、熟悉tiny4412开发资源:ddr3⼤⼩、emmc⼤⼩、led、key等2、Exynos 4412 GPIO介绍2.1、掌握GPIO编程2.2、点亮⼀个灯(掌握GPIO编程的验证)2.3、掌握开发步骤:编程、编译、烧写程序(重要)(注:需要前期知识:掌握交叉编译各个功能,掌握makefile管理编译程序,了解编译过程与IO操作⽅式)(注:linux操作系统环境:前提搭建好虚拟机)知识点讲解:1、了解Cortex-A9开发平台1.1、Cortex-A9核介绍Cortex-A9 是性能最⾼的ARM处理器,可实现受到⼴泛⽀持的ARMv7 体系结构的丰富功能。
Cortex-A9 处理器的设计旨在打造最先进的、⾼效率的、长度动态可变的、多指令执⾏超标量体系结构,提供采⽤乱序猜测⽅式执⾏的8 阶段管道处理器,凭借范围⼴泛的消费类、⽹络、企业和移动应⽤中的前沿产品所需的功能,它可以提供史⽆前例的⾼性能和⾼能效。
Cortex-A9 微体系结构既可⽤于可伸缩的多核处理器(Cortex-A9 MPCore?多核处理器),也可⽤于更传统的处理器(Cortex-A9 单核处理器)。
可伸缩的多核处理器和单核处理器⽀持16、32 或64KB 4 路关联的L1 ⾼速缓存配置,对于可选的L2 ⾼速缓存控制器,最多⽀持8MB 的L2 ⾼速缓存配置,它们具有极⾼的灵活性,均适⽤于特定应⽤领域和市场。
1.2、基于Cortex-A9核的CPU介绍本课程采⽤三星⾼性能的Exynos 4412四核处理器为CPU。
Exynos 4412内部集成了GPU 为Mali-400 MP的⾼性能图形引擎,⽀持3D图形流畅运⾏,并可播放1080P⼤尺⼨⾼清视频,流畅运⾏Android等⾼级操作系统,⾮常适合开发⾼端物联⽹终端,⼴告多媒体终端,智能家居,⾼端监控系统,游戏机控制板等设备。
三星高端四核Exynos 4412处理器-4412核心板
迅为电子iTOP-4412核心板说明
Exynos4412核心板图:
规格参数
堪称行业最小巧耐用的核心板!总体厚度仅2.5毫米!长宽尺寸:5cm*6cm 八层盲埋孔设计,沉金OSP工艺,PCB大厂制作
CPU:三星得意之作Exynos4412,四核Cortex-A9,主频为1.6GHz,被认
为是近几年最有前途的ARM处理器
内存:1G双通道LPDDR2,在超低功耗的前提下具有与DDR3一样的速度存储:8GB(可根据需要配置16GB以及32GB),采用三星EMMC,时钟频率高达52MHZ,满足MMC V4.41协议标准
电源管理:选用三星自家电源管理芯片,高效节能!具有9路DC/DC和28路LDO输出电源.经千百万部手机实践检验,与三星4412处理器匹配最佳!
USB HOST:板载USB3503,引出高性能HSIC,实现两路USB HOST输出连接器:采用进口高质量板对板连接器,引出绝大部分CPU资源,可扩展性高,确保长期运行可靠性
在-20℃至70℃范围的高低温运行测试中运行良好
引出脚达320个,满足用户各类扩展需求
支持MPEG-4/MPEG2、H.264/H263、VC-1、DivX的视频编解码1080p@30fps
支持2D,3D图形加速ARM Mali-400MP Core
支持SD/MMC/SDIO接口存储卡,最高支持32GB
支持JPEG硬件编解码,最大支持8192×8192分辨率
预留电磁屏蔽罩接口以及加固螺孔
支持5V电压供电。
uboot启动流程
U-Boot工作过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置好栈跳转到第二阶段代码入口(2)第二阶段的功能初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核1.1.1 U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/和board/samsung/mini2440/。
U-Boot启动第一阶段流程如下:图 U-Boot启动第一阶段流程根据cpu/arm920t/中指定的连接方式:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/ (.text)board/samsung/mini2440/ (.text)board/samsung/mini2440/ (.text)*(.text)}… …}第一个链接的是cpu/arm920t/,因此的入口代码在cpu/arm920t/中,其源代码在cpu/arm920t/中。
下面我们来分析cpu/arm920t/的执行。
1. 硬件设备初始化(1)设置异常向量cpu/arm920t/开头有如下的代码:.globl _start_start: b start_code /* 复位*/ldr pc, _undefined_instruction /*未定义指令向量 */ldr pc, _software_interrupt /* 软件中断向量 */ldr pc, _prefetch_abort /* 预取指令异常向量 */ldr pc, _data_abort /* 数据操作异常向量 */ldr pc, _not_used /* 未使用 */ldr pc, _irq /* irq中断向量 */ldr pc, _fiq /* fiq中断向量 */ /* 中断向量表入口地址 */_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef以上代码设置了ARM异常向量表,各个异常向量介绍如下:表 ARM异常向量表在cpu/arm920t/中还有这些异常对应的异常处理程序。
第二章 4412启动流程
Booting:一、Exynos 4412 SCP has 64 KB ROM (iROM) and 256 KB SRAM (iRAM) as internal memory. Exynos 4412拥有64K的内部ROM(IROM)和256K的内部SRAM(IRAM)。
Exynos4412支持四种启动方式:1、General NAND flash memory2、SD/MMC memory card3、eMMC memory4、USB device二、上电执行过程当系统复位或者上电,程序会从IROM(0x00000000)运行,引导加载程序。
IROM是芯片厂家事先烧写到芯片上的(固化在内部ROM中的),自带bootloader。
(无源码)问:那么IROM功能是什么呢?IROM把启动设备上特定地址的程序读入到片内内存(IRAM),然后执行这个程序。
(这个程序就叫BL1,一样由芯片厂商提供)问:那么启动这个芯片厂商的程序后,又会做什么事情?BL1又从特定的地址把程序读入片内内存(IRAM),并且执行。
(这个程序叫BL2,由工程师自己编写的源码)那么根据上面的图来总结下4412的启动过程:第一步:图上的①在内部64K的IROM运行程序(也就是0地址运行程序)功能是把启动设备上特定位置处图上的②的程序读入到片内的IRAM里面(这种方式叫BL1,BL1 是三星公司提供的,无源码。
)第二步:IRAM运行的程序(也就是BL1的程序,0x0202 1400位置开始运行程序),这个程序又会将③的程序读入片内内存/或者片外内存,并且去执行它。
(这个阶段叫BL2,程序由编写者提供)猜想:如果OS文件大于256K那么片内内存空间不够,那么程序应该如何去执行,在BL1把OS文件拷贝到内部内存时候,前面的小于256K用于把启动设备中的OS文件拷贝到更大的片外内存去运行。
(u-boot时候就能体现出来)总结上面,可以了解4412的启动过程,那么如何让4412开发板工作起来?那就有以下几个问题:1、IROM做了什么事情?固化在芯片的那个位置?2、BL1又做了什么事情?又是如何去存放的?3、BL2(自己写的程序)是如何构成,又是如何去存放的?接下来先介绍BL1和BL2文件。
Tiny4412用户手册
更新说明:GPU为Mali-400 MP的高性能图形引擎,支持大尺寸高清视频,流畅运行Android等高级操作系统,非常适合开发高端物联网终端,广告多媒体终端,智能家居,高端监控系统,游戏机控制板等设备。
用户可以到我们网站浏览最新通知及下载更新最新的手册和系统网址:Tiny4412SDK上的CPLD(EPM240T100)的固件。
联系代理购买可用的转接线。
接下来,会跳出如下窗口,点“取消”最重要的一步是设置串口,注意必须选择无流控制,否则,或许你只能看到输出而2.2 制作用于安装系统的SD卡一般 Tiny4412 出厂时已经安装好 Android4.2.1 系统,以后要重新烧写系统,则需要 SD 卡 来烧写系统,无论是通过 USB 烧写,还是 SD 卡脱机烧写,都需要使用 SD 卡启动开发板来进 行。
制作用于安装系统的 SD 卡的本质是: 将 Tiny4412 的 Bootloader (Tiny4412-Boot.bin) 烧写到 SD 卡的第一个分区, 这样以后 Tiny4412 就可以通过 SD 卡启动了,利用 Bootloader 的 USB 烧写和 SD 卡脱机烧写功能,将系统烧写到 eMMC,达到重新安装系统的目的。
2.2.1 使用SD-Flasher工具烧写Tiny4412-Boot.bin到SD卡本步骤将执行以下操作: SD-Flasher.exe 会对 SD 卡进行分区,第一个分区为 130M 用于存放 Tiny4412-Boot.bin,剩 下的空间格式化为 FRIENDLYARM 分区,用于存放系统文件 images。
有些小于 256M 的 SD 卡是无法使用的,我们推荐使用至少 4G 的 SD 卡。
以下是详细步骤,基于 Windows7 环境: Step1: 打开光盘\tools\目录, 解压 SD-Flasher-1327.7z 得到 SD-Flasher.exe 烧写软件,启动它, 请注意,你需要通过管理员身份来打开该软件才行,如图启动 SD-Flasher.exe 软件时,会弹出“Select your Machine…”对话框,请在其中选择 “Mini4412/Tiny4412”项:第- 31 -页点 Next 后将弹出 SD-Flasher 主界面,点击一下 Scan,将列出你的 SD 卡,选中它,然后点 “ReLayout”对 SD 卡进行分割,注意,本操作会将 SD 卡内的数据清空然后重新分区。
exynos4412-uboot移植笔记
Exynos4412 uboot移植笔记一、准备原料三星原厂提供的UBOOT代码-u-boot-samsung-dev.二、在4212平台代码基础上修改成自己的平台YYGY44121.用户目录下新建文件夹yygy4412-uboot cd, mkdir yygy4412-uboot2.进入yygy4412-uboot文件夹,将三星平台代码压缩文件拷贝至此。
解压,重命名为:yygy4412-uboot tar -vxf u-boot-samsung-dev.tar.gz mv u-boot-samsung-dev yygy4412-uboot3.拷贝迅为的CodeSign4SecureBoot文件夹到当前目录。
至此当前目录结构为:4.进入文件夹yygy4412-uboot cd yygy4412-uboot 进入三星平台cd board/samsungcp -rf smdk4212 yygy4412 cd yygy4412Mv clock_init_smdk4212.S clock_init_yygy4412.SMv mem_init_smdk4212.S mem_init_yygy4412.SMv smdk4212.c yygy4412.cMv smdk4212_val.h yygy4212_val.hMv smdk4412_val.h yygy4412_val.hVi lowlevel_init.S#ifdef CONFIG_EXYNOS4412#include "smdk4412_val.h" //改为#include "yygy4412_val.h"#else#include "smdk4212_val.h" //改为#include "yygy4212_val.h"#endifVi clock_init_yygy4412.S#ifdef CONFIG_EXYNOS4412#include "smdk4412_val.h" //改为#include "yygy4412_val.h"#else#include "smdk4212_val.h" //改为#include "yygy4212_val.h"#endifVi Makefile33行:COBJS-y := smdk4212.o //改为:COBJS-y := yygy4412.o37行;SOBJS += mem_init_smdk4212.o //改为:SOBJS += mem_init_yygy4412.o38 ;SOBJS += clock_init_smdk4212.o //改为:SOBJS += clock_init_yygy4412.oCd , cd yygy4412-uboot/yygy4412-uboot修改boards.cfg 添加yygy4412 arm armv7 yygy4412 samsung exynos Cp -av include/configs/smdk4412.h include/configs/yygy4412.hVi include/configs/yygy4412.h265: #define CONFIG_SYS_PROMPT "SMDK4412 # "改为:#define CONFIG_SYS_PROMPT "YYGY4412 # "319:#define CONFIG_IDENT_STRING " for SMDK4412"改为;#define CONFIG_IDENT_STRING " for YYGY4412"Vi u-boot.ldsboard/samsung/smdk4212/libsmdk4212.o (.text)修改为:board/samsung/yygy4412/libyygy4412.o (.text)5.编译make yygy4412_config make6.制作UBOOT因CPU exynos_4412的启动过程是BL0 //BL0固化在iram中的程序(关闭看门狗,关闭中断及MMU,时钟设置,检测om决定启动方式,拷贝bl1到iram中BL1 <8k /*BL1 初始化化环境(中断初始化,设置堆栈等),搬移bl2代码到RAM中,并允许它,BL1是三星提供的,无源码,见CodeSign4SecureBoot/E4412_N.bl1.SCP2G.bin| 如果想看源码,可以反汇编分析,如arm-none-linux-gnueabi-objdump -D -b binary -m arm E4412_N.bl1.SCP2G.bin > b1.asmBL2 <14k //bl2 完成基本硬件初始化(Low_init.s 时钟串口内存flash等)u-boot.bin所以我们单独运行u-boot是不行的,需使用三星提供的BL1 BL2进行打包加密校验cp -rf sdfuse_q ./ //sdfuse_q 三星提供的加密处理(checksum)Cp mkuboot ./ //拷贝SD卡制作UBOOT脚本。
实验五 制作用于安装系统的SD卡
实验五制作用于安装系统的SD卡一般Tiny4412 出厂时已经安装好Android5.0.2 系统,以后要重新烧写系统,则需要SD卡来烧写系统,无论是通过USB烧写,还是SD卡脱机烧写,都需要使用SD卡启动开发板来进行。
制作用于安装系统的SD 卡的本质是:将Tiny4412的Bootloader(Superboot4412.bin)烧写到SD卡的第一个分区,这样以后Tiny4412就可以通过SD 卡启动了,利用Superboot的SD卡脱机烧写功能,将系统烧写到eMMC,达到重新安装系统的目的。
1使用SD-Flasher工具烧写Superboot到SD卡本步骤将执行以下操作:SD-Flasher.exe 会对SD 卡进行分区,第一个分区为130M 用于存放Superboot4412,剩下的空间格式化为FRIENDLYARM 分区,用于存放系统文件images。
有些小于256M的SD卡是无法使用的,我们推荐使用至少4G的SD卡。
以下是详细步骤,基于Windows7 环境:Step1: 打开光盘\tools\目录,解压SD-Flasher-1327.7z 得到SD-Flasher.exe 烧写软件,启动它,请注意,你需要通过管理员身份来打开该软件才行,如图启动SD-Flasher.exe 软件时,会弹出“Select your Machine…”对话框,请在其中选择“Mini4412/Tiny4412”项:点Next 后将弹出SD-Flasher 主界面,点击一下Scan,将列出你的SD 卡,选中它,然后点“ReLayout”对SD 卡进行分割,注意,本操作会将SD 卡内的数据清空然后重新分区。
Step3:点“Fuse”,Superboot4412.bin 就会被安全地烧写到SD 卡的无格式区中了,以后再使用SD-Flasher制作SD卡时,无需再执行ReLayout 操作,FAT32 分区中的数据会得以保留。
iTOP-4412-驱动-设备注册分析V1.0
把驱动程序“platform_device_test.c”和 Makefile 文件上传到同一目录,执行
“make”命令编译驱动。如下图。
通过 U 盘挂载、tftp 或者 nfs 功能把“platform_device_test.ko”文件上传到开发板。 先使用“ls /sys/devices/platform/”命令查看平台有限公司
如上图所示,是平台文件中定义的 LEDS 设备注册的结构体,再次搜索。
可以查看到,如下图所示,是 LEDS 设备注册结构体的引用。
#ifdef CONFIG_LEDS_CTL &s3c_device_leds_ctl,
#endif
该引用在结构体数组*smdk4x12_devices[]中,该结构体数组中引用了大量的设备注册的结构 体。
},
};
static int __init iTop4412_platform_add_device_init(void) {
5
北京迅为电子有限公司
return platform_device_register(&leds_device); }
static void __exit iTop4412_platform_add_device_exit(void) {
static void leds_release(struct device * dev) { }
static struct platform_device leds_device = {
.name
= "my_code_led",
.id
嵌入式Linux 系统中 三星Exynos 4412 gpiolib 初始化流程梳理
unsigned int cfg_eint; // Configuration setting when used for external interrupt source
s3c_gpio_pull_t (*get_pull) (struct s3c_gpio_chip *chip, unsigned offs);
int
(*set_pull)
(struct s3c_gpio_chip *chip, unsigned offs, s3c_gpio_pull_t pull);
unsigned
(*get_config) (struct s3c_gpio_chip *chip, unsigned offs);
int
(*set_config) (struct s3c_gpio_chip *chip, unsigned offs, unsigned config);
};
//这个结构体封装了一个变量和四个函数指针,变量 cfg_eint 用于保存当 GPIO 需要被配置成外部中断的获取 GPIO 的上下拉状态,set_pull 用于设置 GPIO 的上下拉状态,get_config 用于获取配
置信息
//set_config 用于进行相应的配置
s3c_gpio_chip exynos4212_gpio_4bit[] ) 并 为 链 表 中 的 每 一 个 元 素 执 行 了 两 个 操 作 , 一 是
samsung_gpiolib_add_4bit(chip);二是 s3c_gpiolib_add(chip);
/* Only 4212/4412 GPIO part */ chip = exynos4212_gpio_4bit; nr_chips = ARRAY_SIZE(exynos4212_gpio_4bit); for (i = 0; i < nr_chips; i++, chip++) { if (chip->config == NULL) chip->config = &gpio_cfg; if (chip->base == NULL) pr_err("No allocation of base address [4212 gpio]"); } samsung_gpiolib_add_4bit_chips(exynos4212_gpio_4bit, nr_chips);
Tiny4412u-boot分析(2)u-boot启动流程
Tiny4412u-boot分析(2)u-boot启动流程从⼤⽅⾯来说,u-boot的启动分成两个阶段,第⼀个阶段主要的职责是准备初始化的环境,主要有以下⼏点①设置异常向量表②把CPU的⼯作模式设置为SVC32模式③关闭中断、MMU和cache④关闭看门狗⑤初始化内存、时钟、串⼝⑥设置堆栈⑦代码搬移⑧清bss段⑨跳转到c语⾔中执⾏(第⼆阶段)此时系统还没有进⼊C语⾔的运⾏阶段,并没有堆栈,也就不需要额外的RAM。
第⼆阶段在上⼀段建⽴好C语⾔运⾏环境的基础上,进⾏各种外设的初始化,并循环执⾏⽤户命令。
主要流程图如下当我们执⾏make命令来构建u-boot时,它的构建过程是:⾸先使⽤交叉编译⼯具将各⽬录下的源⽂件⽣成⽬标⽂件(*.o),⽬标⽂件⽣成后,会将若⼲个⽬标⽂件组合成静态库⽂件(*.a),最后通过链接各个静态库⽂件⽣成ELF格式的可执⾏⽂件。
在链接的过程中,需要根据链接脚本(⼀般是各个以lds为后缀的⽂本⽂件),确定⽬标⽂件的各个段,链接⽂件通常是board/<board>/⽬录中的u-boot.lds⽂件。
⼀般在链接脚本中通过ENTRY(_start)来指定⼊⼝为_start标号,通过⽂本段(.text)的第⼀个⽬标来制定u-boot⼊⼝⽂件。
所以我们通过这个链接脚本⽂件可以确定u-boot执⾏的⼊⼝。
Tiny4412 u-boot的链接脚本内容为// board/samsung/tiny4412/u-boot.ldsOUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{arch/arm/cpu/armv7/start.o (.text)board/samsung/tiny4412/libtiny4412.o (.text)arch/arm/cpu/armv7/exynos/libexynos.o (.text)*(.text)}. = ALIGN(4);.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }. = ALIGN(4);.data : {*(.data)}. = ALIGN(4);. = .;__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }__u_boot_cmd_end = .;. = ALIGN(4);.rel.dyn : {__rel_dyn_start = .;*(.rel*)__rel_dyn_end = .;}.dynsym : {__dynsym_start = .;*(.dynsym)}.bss __rel_dyn_start (OVERLAY) : {__bss_start = .;_end = .;}/DISCARD/ : { *(.dynstr*) }/DISCARD/ : { *(.dynamic*) }/DISCARD/ : { *(.plt*) }/DISCARD/ : { *(.interp*) }/DISCARD/ : { *(.gnu*) }}在本链接脚本⽂件中,定义了起始地址为0x00000000,每个段使⽤4字节对齐(.ALIGN(4)),⼏个段分别为代码段(.text)、只读数据段(.rodata)、数据段(.data)其中,代码段的第⼀个⽬标为arch/arm/cpu/armv7/start.o,在其中定义了映像⽂件的⼊⼝_start。
使用TF卡烧写系统(iTop4412)
一、制作可以下载的TF卡第一步:给TF卡分区把TF卡插入开发板上,连接开发板串口到电脑,EMMC启动方式(0101),开发板启动。
注意:只有在烧写了错误的uboot到EMMC时才需要用到SD卡启动方式。
超级终端(SecureCRT)返回数据中出现倒计时,输入任意命令,进入uboot。
输入下列命令(同EMMC,只是把0换成1)1) fdisk -c 12) fatformat mmc 1:13) ext3format mmc 1:24) ext3format mmc 1:35) ext3format mmc 1:4注:如果是2G卡,fdisk -c 1改为fdisk –c 1 300 300 300第二步:烧写u-boot1、从开发板取下TF卡,使用读卡器连接TF卡或者SD卡到Ubuntu系统。
2、拷贝光盘中Android源码中的iTop4412_uboot_xxx压缩包到Ubuntu系统中,解压。
拷贝镜像u-boot-iTop-4412.bin到解压的文件夹中。
(注意:如果搭建了Android 环境,则在uboot中有解压的文件夹,也生成了镜像)3、在解压的文件夹(iTop4412_uboot)中,执行:df –l (查看盘符)./mkuboot /dev/sdb(可能是sdc;注意mkuboot后面有空格)二、使用TF烧写第一步:TF卡连接到PC,新建sdupdate文件夹,文件夹名字是固定的。
第二步:拷贝镜像到sdupdate中。
镜像在光盘文件夹image中。
第三步:TF卡插到开发板上,重新启动开发板。
在SecureCRT中输入任意字符进入uboot。
第四步:执行:sdfuse flashall也可以分开烧写:sdfuse flash bootloader u-boot-iTOP-4412.binsdfuse flash kernel zImagesdfuse flash ramdisk ramdisk-uboot.imgsdfuse flash system system.img第五步:烧写完成后,输入重启命令:reset(大概半个小时)。
4 bootloader程序
u-boot的配置过程
配置u-boot时,要了解选项的功能,一般采用默 认即可。
配置为u-boot之后,配置的功能保存在“.config”因 此文件中。
然后通过make命令进行编译,编译时会读取 .config文件来确定哪些功能需要被编译。
u-boot的配置过程
具体配置过程如下:
cd u-boot-tiny4412
配置u-boot源码支持tiny4412开发板: $ cp tiny4412_config .config
开始编译: $ make
U-BOOT编译生成的映像文件
u-boot编译后生成如下主要文件:
u-boot的配置过程
u-boot的源码是通过类似于Linux内核的配置系统 来组织的。
配置u-boot时一般先将其配置成默认的,在默认选项 的基础上进一步配置,配置成默认的命令是:
cp tiny4412_config .config
make menuconfig
加载默认配置
make
退出菜单,保存选项到.config中 读取.config来进行编译
SD卡烧写脚本分析
烧写u-boot到SD卡的脚步是 sd_fuse/tiny4412/sd_fusing.sh
sd_fusing.sh脚本的执行流程:
配置需要执行脚本mkconfig
tiny4412的启动分成irom,bl1,bl2,u-boot,4 个过程;
irom将bl1加载iram中执行 bl1将bl2加载到iram中执行 bl2将u-boot加载到dram中执行
u-boot通过命令和环境变量来使用。
思考题
如何将u-boot从sd卡烧写到emmc上?
Bootloader
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2uboot源码分析2.5.1.star t.S2.5.1.star t.S 引入引入2.5.1.1、u-boot.lds中找到start.S入口(1)在C语言中整个项目的入口就是 main函数(这是个.c文件的项目,第一个要分析的文件就是包含了C语言规定的),所以譬如说一个有main函数的那个文件。
10000( 2 方。
ENTRY(_start)因此_start符号所在的文件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。
2.5.1.2、SourceInsight中如何找到文件(1)当前状况:我们知道在uboot中的1000多个文件中有一个符号叫_start,但是我们不知道这个符号在哪个文件中。
这种情况下要查找一个符号在所有项目中文件中的引用,要使用SourceInsight的搜索功能。
(2)start.s 在cpu/arm_cortexa9/start.s(3)然后进入start.S文件中,发现个uboot的入口代码,就是第57 57行中就是行。
_start标号的定义处,于是乎我们就找到了整2.5.1.3、SI中找文件技巧(1)以上,找到了start.S文件,下面我们就从start.S文件开始分析uboot第一阶段。
(2)在SI中,如果我们知道我们要找的文件的名字,但是我们又不知道他在哪个目录下,我们要怎样找到并打开这个文件?方法是在 SI中先打开右边的工程项目管理栏目,然后点击最左边那个(这个是以文件为单位来浏览的),然后在上面输入栏中输入要找的文件的名字。
我们在输入的时候,SI在不断帮我们进行匹配,即使你不记得文件的全名只是大概记得名字,也能帮助你找到你要找的文件。
2.5.2.start.S解析12.5.2.1、不简单的头文件包含(1)#include<config.h>。
config.h是在include目录下的,这个文件不是源码中本身存在的文件,而是配置过程中自动生成的文件。
这个文件的内容其实是包含了下面3个头文件(2)经过分析后,这3个头文件,这个文件是整个uboot移植时的配置文件。
这里面是因此这个头文件包含将这三个文件和start.S文件关联了起来。
因此之后在分析时,主要要考虑的就是include/configs/itop_4412_android.h 文件。
好多宏。
start.S文件(3)#include<version.h>。
include/version.h 中包含了include/version_autogenerated.h ,这个头文件就是配置过程中自动生成的。
里面就一行内容:#define U_BOOT_VERSION"U-Boot 2010.03"。
如下图所示。
这里面定义的宏U_BOOT_VERSION的值是一个字符串,字符串中的版本号信息来自于Makefile中的配置值。
这个宏在程序中会被调用,在uboot 启动过程中会串口打印出uboot的版本号,那个版本号信息就是从这来的。
(4)在include/configs/itop_4412_android.h 中定义了CONFIG_ENABLE_MMU#include<asm/proc/domain.h>。
asm目录不是uboot中的原生目录,uboot中本来是没有这个目录的。
asm目录是配置时创建的一个符号链接,实际指向的是就是asm-arm(详解上一章节分析 mkconfig脚本时).(5)经过分析后发现,实际文件是:include/asm-arm/proc-armv/domain.h(6)从这里可以看出之前配置时创建的符号链接的作用,如果没有这些符号链接则编译时根本通不过,因为找不到头文件。
(所以uboot不能在windows的共享文件夹下配置编译,因为windows中没有符号链接)思考:为什么start.S不直接包含asm-arm/proc-armv/domain.h,而要用asm/proc/domain.h。
这样的设计主要是为了可移植性。
因为如果直接包含,则start.S文件和CPU架构(和硬件)有关了,可移植性就差了。
譬如我要把uboot移植到mips架构下,则start.S源代码中所有的头文件包含全部要修改。
我们用了符号链接之后,则start.S中源代码不用改,只需要在具体的硬件移植时配置不同,创建的符号链接指向的不同,则可以具有可移植性。
2.5.3.start.S解析22.5.3.1、启动代码的16字节头部(1)在SD卡启动/Nand启动等整个镜像开头需要16字节的校验头。
(mkv210image.c中就是为了计算这个校验头)。
我们以前做裸机程序时根本没考虑这16字节校验头,因为:1、如果我们是 usb启动直接下载的方式启动的则不需要16字节校验头( iromapplicationnote);2、如果是 SD卡启动mkv210image.c中会给原镜像前加16字节的校验头。
(2)uboot这里start.S中在开头位置放了16字节的填充占位,这个占位的16字节只是保证正式的image的头部确实有16字节,但是这16字节的内容是不对的,还是需要后面去计算校验和然后重新填充的。
2.5.3.2、异常向量表的构建(1)异常向量表是硬件决定的,软件只是参照硬件的设计来实现它。
(2)异常向量表中每种异常都应该被处理,否则真遇到了这种异常就跑飞了。
但是我们在uboot中并未非常细致的处理各种异常。
(3)复位异常处的代码是:breset,因此在CPU复位后真正去执行的有效代码是reset处的代码,因此reset 符号处才是真正的有意义的代码开始的地方。
2.5.3.3、有点意思的deadbeef(1).balignl16,0xdeadbeef.这一句指令是让当前地址对齐排布,向后走地址直到对齐,并且向后走的那些内存要用0xdeadbee f如果当前地址不对齐则自动来填充。
(2)0xdeadbeef 这是一个十六进制的数字,这个数字很有意思,组成这个数字的十六进制数 全是abcdef 之中的字母,而且这8个字母刚好组成了英文的deadbeef 这两个单词,字面意思是坏牛肉。
(3)为什么要对齐访问?有时候是效率的要求,有时候是硬件的特殊要求。
2.5.3.4、TEXT_BASE 等(1)第100行这个 TEXT_BASE 就是上个课程中分析Makefile 时讲到的那个配置阶段的TEXT_BASE ,其实就是我们链接时指定的 uboot 的链接地址。
(值就是 c3e00001) (2)源代码中和配置Makefile 中很多变量是可以互相运送的。
简单来说有些符号的值可以从Makefile 中传递到源代码中。
2.5.4.start.S 解析3(1)CFG_PHY_UBOOT_BASE33e00000 uboot 在DDR 中的物理地址2.5.4.1、设置CPU 为SVC 模式(1)msr cpsr_c,#0xd3将CPU 设置为禁止 FIQIRQ ,ARM 状态,SVC 模式。
(2)其实ARMCPU 在复位时默认就会进入 SVC 模式,但是这里还是使用软件将其置为式。
整个 uboot 工作时CPU 一直处于 SVC 模式。
SVC 模2.5.4.2、设置L2、L1cache 和MMU(1)bldisable_l2cache // 禁止L2cache(2)blset_l2cache_auxctrl_cy cle //l2cache 相关初始化 (3)blenable_l2cache // 使能l2cache (4)刷新L1cache 的icache 和dcache 。
(5)关闭MMU总结:上面这 5步都是和 CPU 的cache 和mmu 有关的,不用去细看,大概知道即可。
2.5.4.3、识别并暂存启动介质选择(1)从哪里启动是由SoC的OM5:OM0这6个引脚的高低电平决定的。
(2)实际上在我们芯片内部有一个寄存器(地址是 0x10020000),这个寄存器中的值是硬件根据OM引脚的设置而自动设置值的。
这个值反映的就是OM引脚的接法(电平高低),也就是真正的启动介质是谁。
(3)我们代码中可以通过读取这个寄存器的值然后判断其值来确定当前选中的启动介质是Nand还是SD还是其他的。
(4)start.S的0行执行完后,在r2寄存器中存储了一个数字,这个数字等于某个特定值时就表示SD启动,等于另一个特定值时表示从Nand启动····(5)260行中给r3中赋值#BOOT_MMCSD(0x03),这个在SD启动时实际会被执行,因此执行完这一段代码后r3中存储了0x03,以后备用。
2.5.4.4、设置栈(SRAM中的栈)并调用lowlevel_init(1)第一次设置栈。
这次设置栈是在SRAM中设置的,因为当前整个代码还在SRAM中运行,此时DDR还未被初始化还不能用。
栈地址_TEXT_PHY_BASE是自己指定的,指定的原则就是这块空间只给栈用,不会被别人占用。
(2)在调用函数前初始化栈,主要原因是在被调用的函数内还有再次调用函数,而返回地址存储到LR中,但是我们只有一个LR,所以在第二层调用函数前要先将否则函数返回时第一层的返回地址就丢了。
????BL只会将LR入栈,我们的uboot中没有两次设置栈2.5.5.start.S解析4(1)使用 SourceInsight的 Reference功能,找到lowlevel_init函数真正的地方,是在uboot/board/samsumg/smdkc210/lowlevel_init_scp.S中。
因为在MKconfig中产生了软链接。
这一点跟视频中有点不一样2.5.5.1、检查复位状态(1)复杂CPU允许多种复位情况。
譬如直接冷上电、热启动、睡眠(低功耗)状态下的唤醒等,这些情况都属于复位。
所以我们在复位代码中要去检测复位状态,来判断到底是哪种情况。
(2)判断哪种复位的意义在于:冷上电时DDR是需要初始化才能用的;而热启动或者低功耗状态下的复位则不需要再次初始化2.5.5.2、IO状态恢复itop4412 DDR。
没有这个代码(1)这个和上一个和主线启动代码都无关,因此不用去管他。
2.5.5.3、关看门狗(1)参考裸机中看门狗章节2.5.5.4、一些SRAMSROM相关GPIO设置(1)与主线启动代码无关,不用管2.5.5.5、供电锁存(1)lowlevel_init.S的第100-104行,开发板供电锁存。
总结:在前100行,lowlevel_init.S中并没有做太多有意义的事情(除了关看门狗、供电锁存外),然后下面从110行才开始进行有意义的操作。