第三十三天:Tiny4412驱动开发之LED驱动和按键驱动编写

  从今天开始进入驱动开发的课程的学习,共完成四件事情。一:u-boot的简单移植,二:uboot中编写helloword程序 三:开发板中led灯的驱动编写,包括led点亮,闪烁,跑马,流水。四:开发板中按键的驱动编写,按下按键后在屏幕中显示字符。

  一:u-boot的简单移植

  1.进入开发板提供的源码文件包,解压uboot源码包。

  cd /home/bunfly/source_code/

  tar xf uboot_tiny4412-20130729.tgz

  2.进入uboot文件夹,更改uboot中tiny4412的配置文件。将225 中的Tiny4412更改为bunfly。

  cd uboot_tiny4412

  vim include/configs/tiny4412.h

  更改225行为#define CONFIG_SYS_PROMPT               "bunfly # "
  3.进入sd_fuse 文件夹,编译u-boot

  cd sd_fuse

  make

  4.编译结束后生成tiny4412文件夹,进入文件夹。插入sd卡到电脑。烧写u-boot到sd卡中

  cd tiny4412/

  sd卡会自动加载,所以先卸载sd卡 umount /media/aaa

  参看sd卡挂载点:fdisk -l 发现sd卡挂载在/dev/sdb中

  烧写: ./sd_fusing.sh /dev/sdb

  5.显示烧写成功后将sd插入开发板,开发板设置从sd卡启动。显示下图表示烧写成功。

  

     二:u-boot中编写hello world 程序

  U-Boot作为嵌入式Linux系统的引导,不具有标准C库中的内容。要使用printf函数,就需要u-boot中提供的。u-boot函数内容在u-boot源码文件中

的System.map文件中。System.map文件是被内核所使用的符号表。符号表是一个在符号名称与它们的存储器位置间的查询表格。符号名称可能是变量的名称或是函数名称。当要查询符号名称的位置或是特定位置的符号名称时,就会需要System.map。

   查找System.map中printf中的位置 在538行, c3e114d8 T printf,使用c3e114d8就表示使用printf函数,下面是helloword函数的汇编代码实现: 

 1 .global main
 2 main:
 3     mov ip,sp
 4     stmfd sp!,{fp,ip,lr}
 5     sub fp,ip,#4
 6
 7     ldr r0, =string
 8     ldr r2, haha
 9     blx r2
10
11     sub sp,fp,#8
12     ldmfd sp,{fp,sp,pc}
13
14 haha:
15     .word 0xc3e114d8
16 string:
17     .asciz "hello world\n"
18     .align 2

  注意:blx表示跳转到寄存器。

 编译时候有三个步骤:

  1.arm-none-linux-gnueabi-gcc -c hello.s -o hello.o
    2.arm-none-linux-gnueabi-ld -Ttext=0x40008000 hello.o -o hello

    3.arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -Obinary hello hello.bin
    第一步:只编译,不链接标准C库的内容,因为不需要。 
  第二步:链接时指定程序分配地址从40008000开始分配

  第三步:去文件头,将linux文件头lelf32装换成ARM的文件头。

 完成三个步骤后,通过dnw将hello.bin文件传到开发板40008000地址中。通过 go 执行代码。

  开发板:dnw 40008000

  宿主机:dnw hello.bin

  开发板:go 40008000

  结果如下图:

  

接下来是输出hellowrold字符用C代码实现:

1 int (*printf)(char *,...) = 0xc3e114d8;
2 int main()
3 {
4     printf("hello world\n");
5
6 }

 C语言编写相当简洁有木有。第一行定义函数指针指向u-boot中的printf函数。编译,运行过程和上面相同。

为了以后方便,编写Makefile文件,实现编译过程:

 1 name=hello
 2 bin=${name}.bin
 3 o=${name}.o
 4 tar=${name}.c
 5 ${bin}:${name}
 6     arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -Obinary $^ [email protected]
 7 ${name}:${o}
 8     arm-none-linux-gnueabi-ld -Ttext=0x50005000 $^ -o [email protected]
 9 ${o}:${tar}
10     arm-none-linux-gnueabi-gcc -c $^ -o [email protected]
11 clean:
12     rm -f ${bin} ${o} ${name}

  

时间: 2024-10-08 13:06:43

第三十三天:Tiny4412驱动开发之LED驱动和按键驱动编写的相关文章

linux驱动开发之misc设备与蜂鸣器驱动(一)

1.板载蜂鸣器的驱动测试 我手里有一个BSP,九鼎的Bsp,里面有蜂鸣器的驱动,我们先测试一下好不好用.我们拿到一个BSP时,如果要做或移植蜂鸣器的驱动,首先要确定下这个内核 中究竟有没有蜂鸣器的驱动,我们可以用sourceInsight将内核放进去,搜索buzzer这个文件,看有没有,如果不行,也可以在内核中输入make menuconfig,利用这个配置界面来搜索buzzer英文,看不能找到相应的信息,从而也会知道这个设备在哪个路径下,通过对九鼎的内核进行make menuconfig后,搜

驱动开发之I2C总线

驱动开发之I2C总线: I2C:数据线和时钟线. 起始信号:时钟线为高电平,数据线由高到低跳变. 结束信号:时钟线为高电平,数据线由低到高跳变. 应答信号:第九个时钟周期,时钟线保持为高电平,数据线为低电平,此时为成功应答. 读写位:站在主机的角度考虑. 0代表主机给从机发送数据. 1代表主机接收从机的数据. 硬件原理: 数据帧的封装:主机给从机发送数据: 起始信号 + 7位从机地址 写位 + 从机给主机应答 + 主机给从机发送8位数据 + 从机给主机应答 ... + 主机给从机发送8位数据 +

Android驱动开发之Hello实例

Android驱动开发之Hello实例: 驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconfig modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p_defconfig modified:   kernel/drivers/input/misc/Kconfig modified:   kernel/drivers/input/

linux驱动开发之HelloWorld

最近实习,公司项目搞的是平板开发,而我分配的任务是将驱动加载到内核中. 准备工作,必要知识了解:加载有两种方式,一种是动态加载和卸载即模块加载,另一种是直接编译进入内核:Linux内核把驱动程序划分为3种类型:字符设备.块设备和网络设备.字符设备和块设备可以像文件一样被访问.它们的主要区别不在于能否seek,而是 在于系统对于这两种类型设备的管理方式.应用程序对于字符设备的每一个I/O操作,都会直接传递给系统内核对应的驱动程序:而应用程序对于块设备的操作, 要经过系统的缓冲区管理,间接传递给驱动

linux驱动开发之framebuffer驱动介绍

framebuffer是linux里面的显示设备.在驱动底下如何操作lcd实现图形的显示. 1.什么是framebuffer? (1)首先想一下在裸机中我们是怎么操作LCD的. Soc内部有lcd的控制器,Soc外面有lcd的驱动器,lcd的驱动器连接着lcd的屏幕,Soc的内部还有CPU,外部还有DDR内存.这些设备都参与到了lcd的显示中. 在裸机中我们是怎么搞的呢,lcd的驱动器和lcd的控制器之间通过排线进行链接,连接的接口就是lcd所特有的一个接口.lcd控制器里面是很多和lcd相关的

linux驱动开发之misc类设备介绍

1.什么是misc设备? misc是英文的简称,中文名一般叫做杂项设备/杂散设备. 我们知道大部分的设备都有一个明确的分类class,有一些设备进行分类时不太好分,我们不知道一些设备到底应该分到哪一类设备中去,所以最后将这些不知道分到哪类中的设备给分到misc设备中,也就是分到了杂散类中.像蜂鸣器还有ADC设备都被分到了misc设备杂散类设备中.杂散类设备对应的是一个类的概念.随意进到系统中的/sys/class目录中就会看到一个misc目录,这个misc就是杂散类设备,进入到misc目录中,我

linux驱动开发之GCC问题

最近正在学习驱动开发,进展到字符设备驱动开发阶段. 先不多说,首先把刚看的一篇学习驱动步骤的帖子记录如下: 1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出. 5. 写一完整驱动, 加上read, write, ioctl, p

(一)开启驱动开发之路

一.驱动开发的准备工作(1)正常运行linux系统的开发板.要求开发板中的linux的zImage必须是自己编译的,不能是别人编译的.(2)内核源码树,其实就是一个经过了配置编译之后的内核源码.(3)nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器. 二.驱动开发的步骤(1)驱动源码编写.Makefile编写.编译(2)insmod装载模块.测试.rmmod卸载模块 三.实践(1)copy原来提供的x210kernel.tar.bz2,找一个干净的目录(/root/drive

嵌入式驱动开发之sensor---"VIP0 PortA", "VIP0 PortB", "VIP1 PortA", "VIP1 PortB",dvo0(vout1) dvo1(vout0)

(1)vip 简介 (2)vip 电路图 (3)vip 更换采集相机输入 (4)vip 驱动 ---------------------author:pkf ---------------------------time:2015-01-07 -----------------------------------qq:1327706646 (1)vip 简介 这里vip 就是video in port 的缩写,"VIP0 PortA", "VIP0 PortB",