[初级教程]搭建arm-linux裸机开发的环境
2022-03-08 来源:eefocus
1.前言
在上一遍的文章中,我介绍了如何设置芯片的启动模式,根据三星的官方主推的IROM模式,介绍了如何从IROM模式启动,并从Nand中加载我们的引导程序,有了一些前面的知识铺垫后,这一篇文章,我将进一步深入,教你如何实现你的引导程序,并搭建一个调试引导程序的实验环境。这里我介绍两种方式,这两种方式各有前提条件,具体如下:
2.开发环境的搭建
开发环境其实大同小异,总结一下用到的几个:
windows主机
vmware虚拟机
在vmware虚拟机中安装ubuntu桌面操作系统或者redhat或者debain或者centOS均可,看你自己习惯
调试工具(H-JTAG或者J-link)
H-JTAG和J-link的调试搭建环境不太一样,有区别,详细见下面
使用H-JTAG作为开发工具的
有H-jtag调试器,USB接口的那种
准备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的逻辑开发环境,为接下来的全面裸机开发调试做准备。
- [初级教程]arm-linux裸机开发之-bootstrap.bin的实现
- [初级教程]samsung s3c2416x 的启动方式
- makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解
- ARM-Linux使用SD卡根文件系统
- Linux 蓝牙系列 -- ARM-Linux蓝牙工具的移植
- gsm库(libgsm)在ARM-Linux下的移植
- ARM-Linux S5PV210 UART驱动(3)----串口核心层、关键结构体、接口关系
- ARM-Linux移植之(一)——内核启动流程分析
- ARM-Linux移植之(二)——Linux2.6.22内核移植
- ARM-Linux移植之(三)——init进程启动流程分析