1.前言
在上一遍的文章中,我介绍了如何设置芯片的启动模式,根据三星的官方主推的IROM模式,介绍了如何从IROM模式启动,并从Nand中加载我们的引导程序,有了一些前面的知识铺垫后,这一篇文章,我将进一步深入,教你如何实现你的引导程序,并搭建一个调试引导程序的实验环境。这里我介绍两种方式,这两种方式各有前提条件,具体如下:
2.开发环境的搭建
开发环境其实大同小异,总结一下用到的几个:
windows主机
vmware虚拟机
在vmware虚拟机中安装ubuntu桌面操作系统或者redhat或者debain或者centOS均可,看你自己习惯
调试工具(H-JTAG或者J-link)
H-JTAG和J-link的调试搭建环境不太一样,有区别,详细见下面
使用H-JTAG作为开发工具的
准备H-JTAG软件用到的配置文件,以及驱动文件,如果H-JTAG的官方已经支持了你的nandflash或者Norflash,那么很幸运,你不需要去写这样的配置文件,如果你像我一样用的是H-JTAG的官方还没有支持的,那就得我们自己写配置文件和初始化脚本
拿我的开发板来说,我用iROM启动,从nand中加载引导程序,但我的nand型号是SPANSION公司的S34ML02G100TF100这款芯片,H-JTAG的官方还不支持我的s3c2416x+S34ML02G100TF100这样的板子,那我就得自己写这配置文件,也就是s3c2146+S34ML02G.hfc,不用担心,这种配置文件读一遍H-JTAG的官方文档就会写的。
使用H-JTAG软件,如果能正确识别出你的芯片和nandflash,能对nand芯片进行擦除和读写,那么接下来的部分,你就跳过了,不用看了。
使用J-link作为开发工具的
使用J-link的前提是你的开发板中已经有了一个引导程序,U-Boot或者自己写的bootstrap,不然不好调试。
假设你有U-Boot在你的开发板中,s3c2416的地址映射中有说SDRAM的地址是0x30000000,如果开启了MMU的,那么SDRAM的起始地址是0xC0000000,如果不懂为什么是0xC0000000,你可以百度百度。
假设你的U-Boot能正常引导,那么你想调试你自己的Bootstrap.bin的时候,用下面的命令就可以调试了
tftp c0008000 bootstrap.bin
go c0008000
或者纯用J-link调试的命令
h
r
speed 8000
loadbin d:sharebootstrap.bin 0x30008000
setpc 0x30008000
g
3.如何为自己的芯片跟Nand写一份*.hfc配置文件?
就以我的主控s3c2416+nand(S34ML02G100TF100)为例,我的H-JTAG软件装在了C:Program Files (x86)H-JTAG,我要的写的配置文件就是放在该目录下的HFC Examples下面的,那么我们先从HFC Examples下找一个相似的,比如说s3c2416+K9F2G08.hfc,具体修改步骤如下:
拷贝一份s3c2416+K9F2G08.hfc,重命名成s3c2416+S34ML02G100TF100.hfc
打开s3c2416+S34ML02G100TF100.hfc,进入修改其中的参数,用记事本打开即可
下面是未修改前的s3c2416+K9F2G08的内容:
FLASH SECTION:
NAND-FLASH
S3C2416+K9F2G08
MEMORY SECTION:
08-BIT X 1-CHIP
0x0
0x30000000
XTAL SECTION:
NULL
TCK SECTION:
0
0
SCRIPT SECTION:
SoftReset+++
SetMem+32-Bit+0x53000000+0x00000000
SetMem+32-Bit+0x4A000008+0xFFFFFFFF
SetMem+32-Bit+0x4A000048+0xFFFFFFFF
SetMem+32-Bit+0x4A00001C+0x1FFFFFFF
SetMem+32-Bit+0x4A000004+0x00000000
SetMem+32-Bit+0x4A000044+0x00000000
SetMem+32-Bit+0x4C000024+0x00000225
SetMem+32-Bit+0x4C000000+0x00000E10
SetMem+32-Bit+0x4C000004+0x00000800
SetMem+32-Bit+0x4C000010+0x00640061
SetMem+32-Bit+0x4C000018+0x00200102
SetMem+32-Bit+0x4C00001C+0x00000000
SetMem+32-Bit+0x4C000020+0x00000051
SetMem+32-Bit+0x48000000+0x00049253
SetMem+32-Bit+0x48000004+0x44000050
SetMem+32-Bit+0x48000008+0x005D0035
SetMem+32-Bit+0x48000004+0xC4000051
SetMem+32-Bit+0x4800000C+0x80000032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x4800000C+0xC0000032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x4800000C+0x44000032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x4800000C+0x44000130
SetMem+32-Bit+0x48000004+0xC4000052
SetMem+32-Bit+0x48000004+0xC4000051
SetMem+32-Bit+0x48000010+0x00000020
SetMem+32-Bit+0x4800000C+0x44000030
SetMem+32-Bit+0x48000004+0xC4000052
Delay+++1
SetMem+32-Bit+0x4800000C+0x47800032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x4800000C+0x44000032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x48000010+0x0000040D
SetMem+32-Bit+0x48000004+0xC4000050
PGMOPTION SECTION:
ADDON SECTION:
NULL
下面说说怎么修改这文件
FLASH SECTION:
NAND-FLASH
S3C2416+K9F2G08 //这里是名称,改成S3C2416+S34ML02G100TF100
MEMORY SECTION:
08-BIT X 1-CHIP //我的开发板的硬件接线(指Nand)8bit,数量就一个
0x0 //这里填的地址是H-JTAG将把擦写或者编程Nand的驱动加载到哪里
0x30000000 //内存的地址,s3c2416的内存放在BANK6起始,物理地址是0x30000000
XTAL SECTION:
NULL //可以不填,有些nand芯片驱动需要知道外接晶振的大小,但我们2416不需要
TCK SECTION:
0
0
//接下来这个区域可以要,可以不要,这里主要是初始化ARM的内存或者寄存器,这是一段脚本
//命令格式:SetMem+地址位宽+寄存器或者内存地址+要设置的值
//比如说,第二行的SetMem+32-Bit+0x53000000+0x00000000意思是将0x53000000处设置成0x00000000
SCRIPT SECTION:
SoftReset+++
SetMem+32-Bit+0x53000000+0x00000000
SetMem+32-Bit+0x4A000008+0xFFFFFFFF
SetMem+32-Bit+0x4A000048+0xFFFFFFFF
SetMem+32-Bit+0x4A00001C+0x1FFFFFFF
SetMem+32-Bit+0x4A000004+0x00000000
SetMem+32-Bit+0x4A000044+0x00000000
SetMem+32-Bit+0x4C000024+0x00000225
SetMem+32-Bit+0x4C000000+0x00000E10
SetMem+32-Bit+0x4C000004+0x00000800
SetMem+32-Bit+0x4C000010+0x00640061
SetMem+32-Bit+0x4C000018+0x00200102
SetMem+32-Bit+0x4C00001C+0x00000000
SetMem+32-Bit+0x4C000020+0x00000051
SetMem+32-Bit+0x48000000+0x00049253
SetMem+32-Bit+0x48000004+0x44000050
SetMem+32-Bit+0x48000008+0x005D0035
SetMem+32-Bit+0x48000004+0xC4000051
SetMem+32-Bit+0x4800000C+0x80000032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x4800000C+0xC0000032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x4800000C+0x44000032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x4800000C+0x44000130
SetMem+32-Bit+0x48000004+0xC4000052
SetMem+32-Bit+0x48000004+0xC4000051
SetMem+32-Bit+0x48000010+0x00000020
SetMem+32-Bit+0x4800000C+0x44000030
SetMem+32-Bit+0x48000004+0xC4000052
Delay+++1
SetMem+32-Bit+0x4800000C+0x47800032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x4800000C+0x44000032
SetMem+32-Bit+0x48000004+0xC4000053
SetMem+32-Bit+0x48000010+0x0000040D
SetMem+32-Bit+0x48000004+0xC4000050
PGMOPTION SECTION:
ADDON SECTION:
NULL
上面简单的介绍了一下如何去自己编写一个正确的.hfc文件,那么光有这个配置文件还是不够的,你还得有个相应驱动文件,这个文件应该放置在C:Program Files (x86)H-JTAGFDeviceNAND-FLASH下,是与你的.hfc文件相匹配的。
4.如何在~/…/H-JTAG/FDevice/NAND-FLASH下实现一个匹配的驱动?
在上一个小段中我们在C:Program Files (x86)HFC Examples下实现了一个s3c2416+S34ML02G100TF100.hfc文件,只有这个文件还无法让H-JTAG正确的识别我们的nandflash,我们还需要增加个描述性的文件,这个文件该放在C:Program Files (x86)H-JTAGFDeviceNAND-FLASH,同样的,在C:Program Files (x86)H-JTAGFDeviceNAND-FLASH下复制一份s3c2416+K9f2G08的描述文件,未修改的文件如下:
FLASH_TYPE=3
FLASH_SIZE=256M
FLASH_ID=0x00AA00EC
FLASH_ID2=0x00DA00EC
FLASH_ADDRESS=0x0
FLASH_NAND_DEVICE=(2048+64)x64PAGESx2048BLOCKS
FLASH_WIDTH=8/0/0
FLASH_DRIVER=1204/0/0
具体修改步骤如下:
将C:Program Files (x86)H-JTAGFDeviceNAND-FLASHs3c2416+K9f2G08的描述文件复制一份
重命名成C:Program Files (x86)H-JTAGFDeviceNAND-FLASHs3c2416+S34ML02G100TF100
文件名与我们之前的s3c2416+S34ML02G100TF100.hfc文件一致
修改s3c2416+S34ML02G100TF100这个文件
下面说说怎么修改
FLASH_TYPE=3 //这一行是nandflash的类型,3代表nandflash
FLASH_SIZE=256M //这是我的S34ML02G100TF100的存储容量,256MB
FLASH_ID=0x00DA0001 //这里是nandflash的芯片的ID,我的S34ML02G100TF100的ID应该是0x00DA0001,所以这里要修改一下
FLASH_ID2=0x000F000F //这里是nandflash的第二ID,有的nandflash会有个复用的名字或者叫别名,我的S34ML02G100TF100的这个地方值0x000f000f,所以修改一下
FLASH_ADDRESS=0x08000000 //我的开发板上的原理图接入的地方是BANK1,而BANK1的物理地址是0x08000000,所以,这里得改
FLASH_NAND_DEVICE=(2048+64)x64PAGESx2048BLOCKS//这里描述是nandflash的页、块、容量大小
FLASH_WIDTH=8/0/0 //这里是nandflash的接入位宽,我的开发板原理图是8位的IO模式,所以选这个
FLASH_DRIVER=1204/0/0 //这里是默认值,不用改
总结
经过上面的这几步骤的配置,至少应该是能完成这个arm-linux的逻辑开发环境,为接下来的全面裸机开发调试做准备。
上一篇:[初级教程]samsung s3c2416x 的启动方式
下一篇:[初级教程]arm-linux裸机开发之-bootstrap.bin的实现
推荐阅读最新更新时间:2024-11-13 07:00
推荐帖子
- 【下载】基于STM32的μC/OSⅡ移植例程
- 资料大小:1583K(本论坛限制,传不上来)资料说明:1.改移植和模板工程不包括操作系统核ucosⅡ的源代码,如需使用请向操作系统的供应商联系或者网上下载免费的源代码。2.本移植使用的是ucosⅡ2.83版本,需要在OS文件夹下添加的操作系统源代码包括如下文件:os_flag.cos_mbox.cos_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cos_tmr.cos_core.c下载地址:
- ellyzhang stm32/stm8
- UCF文件中时序约束的语法
- 约束UCF文件,从ConstrainsEditor直接输入是最方便、最直接的添加约束的方法了。我总结了以下几种常用的语法:2\\-i:Tu/Q!k2u\"T2v*r;H\"M$`\"A6Q7s4x1)周期约束;n,M$i6B!t:{约束是一个基本时序和综合约束,它附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件的时序是否满足要求,它将检查与同步时序约束端口相连接的所有路径的延迟,但是不会检查PAD到寄存器的路径
- eeleader FPGA/CPLD
- 申请个板子学习
- 申请个板子学习楼主请详述相关内容回复楼主izero的帖子楼主想拿到开发板,可得说详细点哦,赶紧把内容补全吧
- izero 微控制器 MCU
- 求探界者USB接口干扰问题
- 探界者领界(低配),在使用过程中发现车机连接CARPLAY后,经常掉线。后经多方学习,此问题为该车多媒体USB接口模块供电不稳定造成,常规解决方法是更换海外版车辆的USB接口模块可以解决。但在某宝发现,原来价格几十元到一百元的模块,价格飞涨至290元。兜中缺米,不得已自己想办法。思路是解决原车USB接口供电不稳问题,方法是使用带额外供电接口的USB数据线转接线,数据端接USB模块,额外供电端接点烟器电源转换器,手机数据线接数据转接线接口。通过为手机提供额外的供电,解决了原车USB模块供电不稳定
- zhuifengyashi 汽车电子
- 蓝牙遥控器串口的问题
- 我想做一个蓝牙遥控器,买了一本讲蓝牙BLE4.0的书。讲TI的一个SimpleBLEPeripheral项目。说如果用到了UART,就定义那个宏。我不太明白,蓝牙通信不是用的串口吗?难道还有可能不用串口?是不是CC2541实现蓝牙通信可以不用串口?谢谢!蓝牙遥控器串口的问题注意语境,串口在一般语境下特指UART,但有时又指所有采用串行数据传输的通迅接口,比如SPI、I2C等也被归入串口。单纯的蓝牙芯片一般都采用SPI等接口,这样操控更灵活、可靠,而CC254
- chenbingjy 无线连接
- 51单片机驱动电动机
- 本帖最后由paulhyde于2014-9-1509:39编辑51单片机控制四相步进电机作者:易劲松 QQ:371719025 Email:yijingsong@hotmail.com 接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。这几天给自己的任务就是搞定步进电机的单片机控制。以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线
- jinzhao 电子竞赛
设计资源 培训 开发板 精华推荐
- LTC3526LEDC-2 固定频率 1 节电池至 2.85V 低噪声升压转换器的典型应用电路
- 智能小车
- 用于开/关控制应用的 AM2G-1218DZ ±18V 2 瓦 DC-DC 转换器的典型应用
- w806+INA226功率计_small_v2.0
- Si7013USB-DONGLE,Si7013 温度和湿度传感器评估套件
- C917666_电子称专用A/D转换器芯片方案验证板
- TAR5SB44 点稳压器(低压降稳压器)的典型应用
- Sp34063A 1.5A 降压/升压/反相 DC-DC 开关稳压器的典型升压转换器电路
- LTC4090 演示板,具有 2A 高压降压稳压器的 USB 电源管理器
- 具有短路保护功能的 MC78M12CDTT5G 12V 电流提升的典型应用