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-17 13:20
推荐帖子
- 问大家一个打印机的问题
- 公司打印机只有连接打印机的那台计算机(简称CA)能打印,办公室里其它计算机在CA刚开机不久或是重启后才能打印,过一段时间便不能打印了,而且打印机状态显示无连接,也无法从运行里访问CA的IP地址,右键点击在弹出的菜单中选中任何一项,都会提示“打印后台程序没有运行”,请问怎么回事,如何解决?问题补充:每台计算机的services.msc里进去computerbrowser,printspooler服务也已启动,自动状态。请大家在回答中标明是CA计算机还是其它计算机。谢谢!问大家一个打印机
- tom_peng 嵌入式系统
- Mega32A 18b20的驱动
- 使用环境:单片机MEGA32A晶振频率8Mhz此内容由EEWORLD论坛网友xutong原创,如需转载或用于商业用途需征得作者同意并注明出处Mega32A18b20的驱动
- xutong Microchip MCU
- 全国电子设计竞赛A题交流群101126312
- 本帖最后由paulhyde于2014-9-1504:03编辑全国电子设计竞赛A题交流群101126312全国电子设计竞赛A题交流群101126312
- fl540274997 电子竞赛
- 【Beetle ESP32 C6 Mini 】外设之 i2c 驱动HMC3588L
- 从BeetleESP32C6Mini引脚分布可知,I2C的外设包括一组I2C和一组低功耗I2C,SPI包括除了片选之外的一组SPI;对于管脚如下:SDA-GPIO19SCL-GPIO20手上有一款I2C接口的HMC3588L的模块;实物图像如下:HMC5883是霍尼韦尔公司生产的一款地磁场检测芯片是一款表面贴装的集成了信号处理电路的三轴磁性传感器,应用场景主要包括罗盘、导航、无人机、机器人和手持设备等一些
- DavidZH RF/无线
- 请教GPIO设置问题
- 我现在用的是IXP420芯片,想对GPIO2进行读写操作,来控制LED灯。我向相应的寄存器设置了输出为1,并输出使能,但无法对LED灯进行操作。不知道遗漏了什么,GPIO模式要选择么,我在数据手册上没有找到,如何设置?请教GPIO设置问题你的无法对LED操作意思是LED不亮还是别的什么啊LED只要你把io口设置好,一般是低电平有效啊不知道这样说对你有帮助不我也是向他输入数据后,led不亮。我程序如下:GPOUTR|=0x00000004;/*设置输出值*/GPOER&=
- ryg7 嵌入式系统
- 淘宝上怎么找不到ISL1206IBZ
- 请问高手,淘宝上怎么找不到ISL1206IBZ,这是一个EEPROM芯片,谢谢!淘宝上怎么找不到ISL1206IBZ是ISL12026吧,,,你少打个2.。。 谢谢,我弄错了
- chenbingjy 51单片机
设计资源 培训 开发板 精华推荐
- LT1086CT-3.6 受保护大电流灯驱动器的典型应用
- BMI160三轴陀螺仪三轴重力加速度模块
- LT1086CM 1.2V 至 15V 可调稳压器的典型应用
- DC874A,用于具有 8 位 ADC 和 I2C 接口的 LTC4215 热插拔控制器的评估套件
- EB7755,用于示波器的 SPT7755、8 位、750 MSPS 模数转换器的评估板
- 使用 Analog Devices 的 ADR03AKSZ 的参考设计
- FPGA_Computer
- 使用基于 LTC4162IUFD-L42 USB PD (C 电缆) 的电池充电器和电源路径的典型应用
- MCP1826S 1000mA、低电压、低静态电流 LDO 固定输出稳压器的典型应用
- 使用 NXP Semiconductors 的 MMA7456L 的参考设计