lmosem-exynos4412:iTOP-4412裸机开发环境

实验手册上说了安装DNW驱动,这个软件我没有细查,不过根据它的功能,它用的是USB上传文件到开发板,所以比那种用串口上传文件要方便很多。

USB转串口支持驱动之前已经安装了,现在为了支持USB传输文件当然也要安装驱动,安装时有些文档里面没有说清楚,这里说下。

  1. 启动DNW,先在Configure里面设置一下,然后再点击Serial Port/connect,接着再打开开发板开关,输入dnw,会自动提示缺少驱动;
  2. 驱动文件先按照安装步骤先签名一下,然后再更新驱动;
  3. 安装完驱动,先回车输入dnw 40008000,然后再点击USB Por/Transmit/Transmit,添加文件到Transmit,添加完成后接着是传输文件,再次选择Transmit/led.bin,上传文件;
  4. 显示传输成功后,记得输入go 40008000把程序指针指向这个地址,CPU会到这个地方执行二进制机器代码,会看到灯闪烁,完成。

?
?

还是把例程代码写一遍吧,led裸板实验一共有三个文件

  1. start.S
  2. led.c
  3. Makefile

?
?

start.S需要完成的事情有

首先关看门狗(尽管IROM已经这样做了?),看门狗的作用还是不太清楚?

首先在手册中搜watchdog,找到watchdog这章,大概浏览下,然后找到这章

定位到26章看门狗定时器,大概浏览一下overview

对于硬件的操作无非是操作寄存器,寄存器就好比面向对象中的接口API,只不过这里封装的是硬件而已。通常而言,寄存器无非两大类:控制寄存器和数据寄存器,4412中的设备寄存器一般都是32位,然后具体的设备还有额外的寄存器。此处我们需要关闭看门狗,所以能够想到应该到控制寄存器里面找对应的位去设置一下。

这里呢,我们把控制器寄存器全部置零,也就是关闭所以可以控制的功能,反正暂时不要用,代码如下:

我们只要把Reset和Interrupt关闭就可以了,这样就无法产生复位信号或者中断信号,当然这里把所有位都置零也没问题:

关完了看门狗,接下来就是打开icache


这里插播一段广告,什么是icache?参考Tiny4412裸机程序之操作ICache


CPU访问内存取指顺序执行,但是访问寄存器还是太慢了,所以在CPU通用寄存器和内存之间插入了高速缓存cache,特点是高速但是容量小,CPU会把一部分常用的指令放到里面去,cache常见的分成两类:icache和dcache。

icache使用比较简单,系统刚上电的时候是无效的,并且它是关闭的,往CP15协处理器中的寄存器C1的bit[12]写1可以启动icache,写0可以关闭icache。icache关闭时,CPU每次取指都要读主存,性能非常低。因为icache可随时启动,越早开icache越好。

dcache刚上电的时候也是无效并且是关闭的,在CP15寄存器C1中的bit[2]中写1可以启动dcache,写0可以关闭dcache。因为dcache必须在启动mmu之后才能启动,而对于裸机而言,没必要开启mmu,mmu是什么?所以这里就不启动了。

启动了icache,这样取指令命令就快了,这次的裸机测试程序的电灯程序是C语言写的,所以要设置栈空间(也就是设置栈指针)


下面介绍一下为什么要设置栈?参考和拷贝了文章Tiny4412之C语言实现流水灯,Tiny4412裸机程序


在Linux系统编程中,我们写了一段C代码然后就直接执行了,也没有设置栈空间。其实是C库帮我们这些事情做了,至于具体怎么做的暂时还不太清楚。大概的情况是这样的:在编译C源码时,编译器通常会在我们的代码中加上几个被称为启动文件的代码(crtl.o crti.o crtend.o crtn.o等),它们是标准的库文件。这些代码就负责设置C程序的堆栈等等,然后设置好C程序执行的堆栈环境(怎么设置的暂时十分不清楚),然后调用main函数。要注意的是,这些函数和我们的裸板程序设置堆栈的方法不同,因为还要和操作系统打交道,所以这些代码是不能用在裸板上的。


栈:调用C语言之前必须设置栈,栈用于保存运行时环境,给局部变量分配空间。

??


具体把栈指针设置到哪里呢?先来看一下4412的启动流程吧,参考手册SEC_Android_Exynos4212_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf

参考代码上给的ldr sp, =0x02050000,我不知道为什么设置0x02050000这个地址作为栈顶指针,参考了Tiny4412之C语言实现流水灯,Tiny4412裸机程序

查手册发现内部的IRAM的地址是从0x02020000开始的,而根据IRAM的内部存储映射知道,还要划5K给IROM用,划8K给BL1用,划16K给BL2用(BL2实际14K),按道理说剩下的空间就没有用了,我们可以把剩下的空间0x02027400到0x02060000中划一段出来作为栈空间,只不过我奇怪的是为什么不在内存空间(我还不知道内存地址映射到哪段上去了?)呢?

其实选取1K就足够了,其实对于led.bin来说,根本用不了这么大,而他这里选择了0x02050000,我不懂。

其实按道理说,设置

0x02020000 (iRAM基地址) + 5K(iROM代码用) + 8K(BL1用) + 16K(BL2用) + 1K(用作栈))也是可以的,这里设置的是0x02050000?

?
?

好了,设置完了栈空间,就可以调到C程序那里去执行了:

下面来实现led_blink函数,可见这里不需要main函数,原因是这是逻辑程序,而对mian函数的要求是C编译器的要求。

第一步首先找到led的原理图,因为有了原理图,才能知道led连接到了哪个引脚上,然后才能控制这个引脚,从而控制led。

下面是led的原理图:

从上图可以知道连接led的引脚网络标号,然后通过网络标号找到和连接器相连的引脚:

?
?

然后再通过连接器上的网络标号到核心板原理图pdf上去找对应的处理器的引脚:

?
?

?
?

好了现在知道了处理器引脚名称了,接着到4412手册pdf上搜到这两个引脚相关的寄存器,然后控制即可。

这里的话控制很简单,只要先设置为输出,然后输出高电平就点亮,输出低电平就熄灭即可:

?
?

?
?

?
?

?
?


led2


GPL2_0


??


led3


GPK1_1


??

?
?

?
?

?
?

?
?

?
?

下面写流水灯的C程序:

接下来是Makefile的编写:

接下来就是执行了,但是出现了如下错误:

不知道怎么回事,上次还有用的。不管了,既然没检测到,肯定是路径没添加,所以添加下:

添加:

使 .bashrc生效

再次运行make,OK! 执行成功:

?
?

接下来就是把led.bin下载到开发板上:

  1. 先把led.bin拖到桌面上,我习惯用Xmanager文件传输,十分方便;
  2. 接着打开dnw.exe,如果端口号变了,需要先重新Configuration/Options;
  3. 然后点击Serial Port/Connet;
  4. 接着按下iTOP-4412开发板的电源开关,dnw输出信息,及时按下回车;
  5. 输入dnw 40008000;
  6. 然后下载led.bin到开发板上:USB Port/Transmit/;
  7. 下载成功后,不要忘了输入 go 40008000 执行代码;
  8. 经测试,本次流水灯实验成功。

?
?

说明:

得到了led.bin,根据 裸机教程.pdf ,通过现成的uboot功能,把led.bin下载到了0x40008000这个地址,不是太清楚这个地址是干嘛用的。原以为程序当然是加载到内存中运行的,但是我不知道这里的意思是什么?是不是把程序搬到了这个地址0x40008000,然后还要搬到再搬到内存里面去执行?还是说0x4000800本来就是内存地址也就是下载到了DRAM上?不过按道理说,应该不是直接下载到内存上吧,应该是先下载到eMMC上吧。

?
?

我看了4412手册描述存储映射的那章:

但是不太清楚这个DMC到底是个什么地址,而且也没有找到DDR的映射区域,不知道怎么回事???

用折半法试了下,只有0x40000000到0x5FFFFF0A这段地址段可以通过dnw.exe把led.bin下载过去,led.bin占232字节(指的是教程提供的led.bin,自己的led.bin大小不是这个)。也就是大概511M的空间,我奇怪的是为什么其他区域不可以呢,毕竟这块板子的eMMC有4G的空间???不明所以。

?
?

0x5ffffe22+0xe8=0x5FFFFF0A

0x5FFFFF0A-0x4000000=0x1FFFFF0A=536870666(10)

536870666B/1024/1024=511.9998

512MB=536870912B

?
?

先把当下的事情干好,想一下是不是。

?
?

时间: 2024-10-05 02:54:51

lmosem-exynos4412:iTOP-4412裸机开发环境的相关文章

1.裸机开发环境的体验(Redhat 6.4 + vbox)

1.裸机开发环境的体验(Redhat 6.4 + vbox) 一.裸机开发的一般流程 注意:这是假定你已经搭建好了裸机开发环境 我们裸机的一般开发流程:图1-1: 图1-1 裸机开发流程 由于在这篇文章里是体验裸机程序,所以我们跳过了1.2步骤.直接从第三步开始: 二.交叉工具链的安装: 在这里,我们编写的程序是要在开发板运行的,不是在pc机,所以pc机的gcc等编译器不再适用了,我们必须按照交叉工具链.由于我们的程序是要在ARM架构运行的.所以安装的工具链是arm-linux-*的工具链. 我

ok6410[000] 搭建裸机开发环境

1.安装交叉工具链arm-linux-gcc-4.3.2 先把这个工具复制到rhat系统中[rhel-server-6.3-i386-dvd.iso] 解压arm-linux-gcc-4.3.2到一个目录中,然后,配置环境变量 2.编译示例程序 编译 arm-linux-gcc -g -c led.S 链接 arm-linux-ld -Tled.lds -o led.elf led.o 格式转换 arm-linux-objcopy -O binary led.elf led.bin 这样就做出了

在MDK V5.12.0环境下建立2440的裸机开发环境

在网上普遍的教程是使用ADS开发2440的裸机程序的,但是这东西十分的古老,在win7平台上面运行的并不是十分的流畅.在加上之前做stm32开发一直使用的是MDK的平台,所以还是打算使用MDK作为我开发2440的裸机程序的主要环境.网上关于如何使用MDK开发2440的教程还是挺多的,但是基本使用的都是老版本的MDK,但是我现在电脑上面安装的是最新的MDK 5.12的版本,其实新的版本最大的变换就是改变了器件的管理方式,原来是单片机的模型之类的随着安装包一起安装到我们的电脑上的.但是新的MDK做了

裸机开发环境配置

sudo yum install ncurses-devel sudo yum install openssh-clients sudo yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel sudo yum install svn sudo yum install dos2unix sudo yum insta

OK6410基于SD卡的裸机开发-LED灯控制

在上一篇文章中提到SD卡的裸机开发环境的搭建以及OK6410的启动设置,这章开始进入LED灯的闪烁控制. 1.首先打开OK6410的开发板原理图,找到LED等控制的原理图部分,如下图1所示. 图1 LED灯控制原理图 由图1可知,控制LED灯的CPU管脚为NLED1~NLED4,NLED1~NLED4对应的CPU管脚名称为GPM0~GPM3(CPU原理图未给出). 2.编写程序LED.s,下面直接给出LED.s的源码. .globl _start _start: /* 硬件相关的设置 */ ld

【转载】s3c2440裸机开发调试环境(MDK4.6,Jlink v8,mini2440)

用于arm裸机程序开发的IDE基本有 以下3个:MDK,IAR,还有ADS.具体它们的具体情况在这里我就不多说了,百度一下就明白了.由于之前开发c51,stm32时候都使用了MDK开发环境,而且MDK的界面确实看起来舒服多了,所以我选择了MDK作为我的s3c2440裸机开发的IDE.以下主要介绍一下如何使用MDK配合J-link来调试基于s3c2440的开发板. 首先,我们需要下载的有以下2样: MDK J-link 驱动 我的开发环境:windows 7 64位,J-linkv8,mini24

裸机实验预备(三)---在虚拟机中搭建嵌入式开发环境

搭建嵌入式开发环境的主要工作其实就是在虚拟机中安装好交叉编译工具链. 第一步就是选择合适版本的交叉编译工具链. 在选择交叉编译工具链版本的时候,应该考虑尽量减少开发过程中由于编译器所产生的一些莫名其妙的问题.针对不同的芯片,应该选择不同版本的编译交叉工具链. x210开发板是基于s5pv210芯片的,我选择的编译交叉工具链是arm-2009q3.tar.bz2,之所以选择这个交叉编译工具链,是因为Samsung公司当时开发s5pv210的时候就是使用的这个版本的工具链.所以可以尽量避免减少出错.

嵌入式Linux之旅——环境搭建篇之搭建基本开发环境

我们在学习开发Linux前,必须要搭建好编译开发环境.但由于环境与工具的选择,每个人的习惯和爱好不同,所以本篇我会贴出来一些必要的软件的安装,若个人还有些软件需要安装配置的,大家可以在需要用的时候上网搜索或者查找书本配置. 在安装具体的软件前,有必要介绍我使用的环境和工具.首先,我用两台电脑,一个是win7的系统,另一个是ubuntu 14.04的系统,当然主要的开发是在ubuntu下完成的.大家如果没有条件的话,可以安装虚拟机或者直接安装Linux系统也未尝不可.另外,我手里正好有一套2440

S3C6410基于SD卡的裸机开发

手里只有一块OK6410开发板,一张8G的SD卡,没有相关的JTAG调试器,也没有集成开发环境可用,那如何进行裸机开发呢?查询开发的手册可知,6410芯片支持从SD卡启动,因此裸机开发就从SD卡开始. 1.开发环境的搭建 首先搭建虚拟机平台,安装Linux开发环境centos6.5,安装过程这里不再赘述. 2.交叉编译环境的安装 进入centos6.5,在/home目录下新建gnutools目录,将arm-linux-gcc-4.3.2.tgz(开发板的所带的资料)文件拷贝到 centos的/h