单片机
返回首页

[初级教程]搭建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的逻辑开发环境,为接下来的全面裸机开发调试做准备。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 光控音效发生器电路

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 基于IC555的可变PWM振荡器电路

  • 分享一个电网倾角计电路

  • 电谐波图形均衡器示意图

    相关电子头条文章