tiny4412裸板程序之点灯(一)

最近折腾tiny4412开发板,先用裸板点个灯,玩一下裸板程序,后面打算移植最新的uboot和内核到tiny4412开发板上去。

原理图中,4个led用到的是GPM4_0 - GPM4_4.

看芯片手册:GPM4CON地址为0x110002E0

 

GPM4DAT寄存器地址为:0x110002E4

led.s

.text
.globl _start
_start:
 
/*
* set GPM4 as output
*/
ldr r0, =0x110002E0 // GPM4CON的地址是0x110002E0
ldr r1, [r0] // 先读出原值
bic r1, r1, #0xff00 // 清除bit[15:8]  //bic为bit clear 位清除指令
bic r1, r1, #0xff // 清除bit[7:0]
orr r1, r1, #0x1100 // 设置bit[15:8]为0b00010001  //orr为 按位或指令
orr r1, r1, #0x11 // 设置bit[7:0]为0b00010001
str r1, [r0] // 写入GPM4CON    将r1寄存器中的值传送到 地址值为r0的寄存器中
/*
* set GPM4DAT as Low For leds
*/
ldr r0, =0x110002E4 // GPM4DAT的地址是0x110002E0  
ldr r1, [r0] // 读出原值  
 
leds_loop:
 
bic r1, r1, #0xf // 清除bit[0-3]为0 全亮
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
 
orr r1, r1, #0xe // 设置bit[0]为0 LED1亮
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
 
bic r1, r1, #0x3 // 设置bit[1]为0 LED2亮
orr r1, r1, #1
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
 
bic r1, r1, #0x6 // 设置bit[2]为0 LED3亮
orr r1, r1, #2
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
 
bic r1, r1, #0xc // 设置bit[3]为0 LED4亮
orr r1, r1, #4
str r1, [r0] // 写入GPM4DAT
ldr r2,=0xffffff
bl delay
 
orr r1, r1, #0xf
str r1, [r0] // 写入GPM4DAT 全灭
ldr r2,=0xffffff
bl delay
 
b leds_loop
halt_loop:
b halt_loop
 
delay:
//跑马灯延时程序
sub r2,r2,#1 //sub 减法
cmp r2,#0x0 //将r0 与0比较
bne delay //b是跳 ne 是不相等 ,不相等就跳到delay
mov pc,lr //lr 里存的是调用函数时的下一条指令,让Pc指针指向lr就可以完成函数的返回

Makefile

led.bin : led.S
    arm-linux-gcc -c -o led.o led.S   
    arm-linux-ld -Tled.lds -N led.o -o led.elf
    arm-linux-objcopy -O binary -S led.elf led.bin
    arm-linux-objdump -D -m arm led.elf > led.dis
clean:
    rm -f *.dis *.bin *.elf *.o

第一步 执行arm-linux-gcc -c -o led.o led.S命令将当前目录下存在的汇编文件led.S编译成led.o文件;

第二步 执行arm-linux-ld -Tled.lds -N led.o -o led.elf将.o文件链接成elf文件,-Tled.lds 其中led.lds位链接脚本,告诉连接器如何对程序进行链接,以及链接地址等等(下面会有讲解);

第三步 执行arm-linux-objcopy -O binary -S led.elf led.bin将elf文件抽取为可在开发板上运行的bin文件;

第四步 执行arm-linux-objdump -D -m arm led.elf > led.dis将elf文件反汇编,便于我们对程序的分析,查找错误等等;

led.lds

SECTIONS {
    . = 0x02023400;
    .text : { *(.text) }
    .rodata ALIGN(4) : {*(.rodata*)}
    .data ALIGN(4) : { *(.data*) }
    .bss ALIGN(4) : { *(.bss) *(COMMON) }
}

第2行表示程序的连接地址从0x02023400开始,这表示我们的程序运行之前应该位于内存地址0x02023400字节处,

BL1会把 BL2复制到0x02023400地址处,再启动它。

第 3~6行,表示从 0x02023400 开始,依次排放程序的代码段、 只读数据段、数据段、BSS段。

 

编译:在服务器上make之后会得到led.bin 文件

烧写:需要制作卡启动,较为麻烦。下面是友善之臂提供的烧写uboot SD卡驱动方法:

参照此方法,将u-boot替换给我们的led.bin 应该是可以的,再烧写过程中遇到了几个坑,找了一些资料才解决,下一篇博文中会写出来给大家参考。

 

-----------------------------------------------------
1. Build uboot

a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好
   环境变量PATH,保证可以正常使用。

b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的目录
   tar xzf uboot_tiny4412-20130729.tgz

c) 配置 uboot 并编译
   cd uboot_tiny4412
   make tiny4412_config
   make

d) 编译 用于生成bl2 的工具
   make -C sd_fuse
   或者
   cd sd_fuse; make


-----------------------------------------------------
2. 制作启动 Tiny4412 的SD卡

a) 先准备一张4G或以上的SDHC卡
   注意:该卡的已有数据将会被破坏,因此请先对SD卡上的数据进行备份。

b) fusing SD card
   假设SD卡已被PC Linux识别为/dev/sdb, 以root用户运行以下命令即可:
   cd sd_fuse/tiny4412
   ./sd_fusing.sh /dev/sdb


-----------------------------------------------------
3. 使用SD卡启动 Tiny4412 并烧写Android

a) 将已经制作好的SD卡插到 Tiny4412 板上,拨动S2切换到SDBOOT,同时连接
   串口线到PC且假设已经准备好。

b) 开发板加电,然后在串口控制台(如minicom),按任意键进入uboot 命令行模式

c) 对SD卡进行分区
   输入以下uboot命令即可对SD卡进行分区:
   fdisk -c 0 320 806 518
   重新分区后,可重新格式化FAT分区
   fatformat mmc 0:1

d) 进入fastboot模式以烧写Android
   使用USB线连接Tiny4412的MICRO_USB口到PC,然后输入以下uboot命令:
   fastboot

e) 烧写 Android 到SD卡
   首先请准备好Android image,包括: zImage, ramdisk-u.img, system.img
   在PC端输入以下命令进行烧写:
   fastboot flash kernel zImage              (烧写kernel)
   
fastboot -w                               (格式化userdata和cache)
   
fastboot flash ramdisk ramdisk-u.img      (烧写ramdisk)
   
fastboot flash system system.img          (烧写system)

f) 也可以在PC端通过fastboot烧写uboot到SD卡
   先手动生成bl2.bin
   cd sd_fuse/tiny4412
   ../mkbl2 ../../u-boot.bin bl2.bin 14336

   然后输入以下命令:  
   fastboot flash fwbl1 E4412_N.bl1.bin
   
fastboot flash bl2 bl2.bin
   
fastboot flash bootloader ../../u-boot.bin

   fastboot flash tzsw E4412_tzsw.bin 


-----------------------------------------------------
4. 使用SD卡启动 Android

a) 如果是使用HD700,则烧写完成后直接重启Tiny4412 即可自动启动 Android

b) 如果是使用S700,则需要在uboot上设置kernel命令行参数:
   setenv bootargs console=ttySAC0,115200n8 androidboot.console=ttySAC0 lcd=S700
   saveenv
   然后重启Tiny4412即可。

参考:http://www.techbulo.com/1313.html

 

 

### 回答1: 嵌入式Linux点灯实验通常涉及以下步骤: 1. 准备硬件:选择一个嵌入式开发,例如Tiny4412,连接电源和串口线,以便通过终端程序与开发进行交互。 2. 下载和编译内核:从开发制造商的网站上下载适用于该的内核源代码,并使用交叉编译工具链编译内核。在内核配置时,需要确保启用GPIO子系统以及相关的GPIO驱动程序。 3. 编写应用程序:使用C或Python等编程语言编写一个简单的应用程序,用于点亮或熄灭开发上的LED灯。该应用程序可以使用GPIO用户空间API来控制GPIO引脚。 4. 将应用程序复制到开发上:使用FTP或SCP等工具将编译好的应用程序复制到开发上,并在终端上运行该应用程序。 5. 调试:通过查看终端输出,可以检查应用程序是否正确地控制了LED灯。如果出现问题,可以使用GDB等调试工具进行排查。 需要注意的是,嵌入式开发需要具备一定的硬件和软件知识,建议在实验前先学习相关的嵌入式Linux开发知识。 ### 回答2: 嵌入式系统是指将计算机技术与其他领域相结合,设计出适应特定应用领域的硬件系统和软件系统。其中,Linux系统是嵌入式系统中使用最多的操作系统之一。本篇文章将介绍如何使用Linux系统进行嵌入式设备的点灯Tiny4412实验。 首先,需要先了解一下Tiny4412开发的一些基本信息。Tiny4412是一款基于ARM Cortex-A9的嵌入式开发,具有4核CPU,1GB内存和8GB扩展存储空间。该开发还集成了多种外设,如4.3英寸液晶屏、USB接口、以太网口等,可以满足各种嵌入式系统的应用需求。 接着,我们需要对Tiny4412开发进行连接和配置。首先将开发连接到计算机端,并使用串口线连接开发和计算机、通过串口终端对开发进行配置。启动开发后,进入系统终端,创建一个新的文件夹用来存放程序。cd ~ // 进入主目录,输入mkdir tiny4412_led // 创建新文件夹,输入cd tiny4412_led // 进入新文件夹,输入 接下来,下载并安装软件工具链。需要先下载安装arm-linux-gcc-4.4.3工具链,这个工具链是基于 ARM926EJ-S 架构的版本。输入以下命令下载并安装: sudo apt-get install zlib1g-dev libncurses5-dev libssl-dev sudo apt-get install gcc-arm-linux-gnueabi 安装完成后,我们就可以编写点灯程序了。首先,在tiny4412_led文件夹下新建一个C语言文件led.c,需要注意的是,由于Tiny4412采用了GPIO作为点灯的控制接口,因此需要引入头文件gpio.h、stdio.h、stdlib.h和unistd.h。代码如下: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "gpio.h" #define LED5 110 int main(void) { GPIO_Handle gpio; int led = LED5; gpio = GPIO_Init(); if (gpio == NULL) { fprintf(stderr, "GPIO_Init failed\n"); return 1; } GPIO_SetDir(gpio, led, GPIO_OUTPUT); while (1) { GPIO_SetValue(gpio, led, 1); sleep(1); GPIO_SetValue(gpio, led, 0); sleep(1); } GPIO_Fini(gpio); return 0; } 上面的代码定义了一个引脚(LED5)来控制灯的亮灭,通过GPIO_SetDir函数设置该引脚为输出模式,进入一个无限循环,每隔1秒钟,将LED5的输出电平设置为高电平和低电平,实现LED灯的闪烁。 编写完程序后,使用命令行编译该程序: arm-linux-gnueabi-gcc -o led led.c 然后,将编译生成的可执行文件(led)拷贝到Tiny4412开发上: cp led /mnt/nfs/root/tiny4412_led/ 最后,在Tiny4412的终端输入以下命令运行程序: ./led 由于程序是一个无限循环,因此,LED灯会一直闪烁,知道我们手动停止该程序。通过上述方式,我们成功实现了使用Linux系统进行嵌入式设备的点灯Tiny4412实验。 ### 回答3: 嵌入式系统是指在电子设备中嵌入的小型计算机系统,用于控制或监控设备的运行。Linux是一种自由、开放源代码的类Unix操作系统,广泛应用于服务器和嵌入式系统中。点灯实验是一项基础实验,通过控制LED点亮和熄灭,来了解嵌入式系统的基本操作和控制。 本文将介绍如何在嵌入式系统中运行Linux操作系统,并通过点灯实验控制LED灯的点亮和熄灭。 实验材料: - Tiny4412子 - USB转串口模块 - 文本编辑器 - Linux交叉编译工具链 - LED灯 步骤1. 安装Linux操作系统 首先需要在Tiny4412子中安装Linux操作系统。可以通过交叉编译工具链将Linux内核和根文件系统交叉编译到SD卡中,然后将SD卡插入到Tiny4412子中,并启动子。 步骤2. 连接USB转串口模块 接下来需要将USB转串口模块连接到Tiny4412子上,然后通过串口工具连接到子。 步骤3. 编写LED控制程序 使用文本编辑器编写LED控制的C程序。通过控制GPIO口实现控制LED点灯。LED灯连接到Tiny4412子上的GPIO口。 步骤4. 交叉编译程序 使用交叉编译工具链将程序交叉编译到Linux系统中。将编译生成的ELF文件拷贝到Tiny4412子中。 步骤5. 运行程序 使用命令行启动编译生成的ELF文件。此时就可以通过程序控制LED的点亮和熄灭了。 总结 通过上述步骤,我们就可以在Tiny4412嵌入式系统中实现Linux操作系统和点灯实验。这些步骤并不是非常困难,只需要一点编程基础和嵌入式系统相关的知识即可。嵌入式开发是一门非常有前景的技术,希望本文对你有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值