BCM_GPIO驱动测试
在写内核驱动的时候,最好先在uboot上,进行裸板测试,验证寄存器,再移植到内核中,这样可以熟悉寄存器,也排除内核中的一些干扰。
/***********************************************************
* led.c
* 53344中有16个GPIO,但是却不是在统一个GPIO寄存器中设置的,
* GPIO0-GPIO3是以CMIC开头的寄存器,
* GPIO4-GPIO16才是以GPIO开头的寄存器。
*********************************************************/
typedef volatile unsigned int U32; #define GPIO_INPUT *(U32 *)0x18000060
#define GPIO_OUT *(U32 *)0x18000064
#define GPIO_OUT_EN *(U32 *)0x18000068 #define CMIC_GP_DATA_IN *(U32 *)0x48002000
#define CMIC_GP_DATA_OUT *(U32 *)0x48002004
#define CMIC_GP_OUT_EN *(U32 *)0x48002008
#define CMIC_GP_INT_TYPE *(U32 *)0x4800200c void configure_output(int gpio);
void configure_input(int gpio);
void led_on(int gpio);
void led_off(int gpio);
void delay(void);
void delays(int count); int _start(void)
{
configure_output();
configure_output();
configure_output(); CMIC_GP_OUT_EN |= 0xf;
CMIC_GP_DATA_OUT &= ~0xf; while () {
led_on();
led_on();
led_on();
delay();
led_off();
led_off();
led_off();
delay();
} return ;
}
void configure_output(int gpio)
{
GPIO_OUT_EN |= ( << gpio);
} void configure_input(int gpio)
{
GPIO_OUT_EN &= ~( << gpio);
} void led_on(int gpio)
{
GPIO_OUT &= ~( << gpio);
} void led_off(int gpio)
{
GPIO_OUT |= ( << gpio);
} void delay(void)
{
__asm__ __volatile__ (
"ldr r0 , =0x4ffffff \n"
"delayloop: \n"
"subs r0 , r0 , #1 \n"
"bne delayloop \n"
:::"r0"
);
} void delays(int count)
{
__asm__ __volatile__ (
"mov r0 , %0 \n"
"delaysloop: \n"
"subs r0 , r0 , #1 \n"
"bne delaysloop \n"
::"r"(count)
:"r0"
);
Makefile, 链接脚本led.lds用于指定代码运行的位子
all:
arm-linux-gcc -c led.c -o led.o -fno-builtin
arm-linux-ld -T led.lds led.o -o led
arm-linux-objcopy -O binary led led.bin
clean:
rm -rf led led.bin *.o
链接脚本led.lds,用于指定代码运行的地址,以及编译的时候,如果有多个文件,每个文件存放在内存中的位置。
当一个文件的时候,上面中间一条,也可以直接写成如下的写法,用于指定起始地址。
arm-linux-ld -T0x61000000 led.o -o led
链接脚本,生成方法
arm-linux-ld --verbose > led.lds
再根据实际修改生成的文件。
/* Script for -z combreloc: combine and sort reloc sections */
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
"elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");
SECTIONS
{
. = 0x61000000 ; /* 程序的起始地址 */ .text :
{
led.o(.text) ;
*(.text) ;
}
align = ;
}
将生成的led.bin下载到板中,然后
go 0x61000000
BCM_GPIO驱动测试的更多相关文章
- Win8驱动测试模式
打开驱动测试模式(保存成bat文件,双击执行) bcdedit /set testsigning on pause 执行完成后,看见提示操作成功的提示,之后我们重启一下,再次进入系统,在桌面的右下角会 ...
- selenium+python(模块化驱动测试)
模块化驱动测试,就是借鉴编程语言中模块化的思想,把重复的操作独立成功公告模块,懂用例执行过程中需要用到这一模块操作时则被调用,这样可以极大的消除重复从而提高测试用例的可维护性 下面具体以126邮箱为例 ...
- linux驱动开发之九鼎板载蜂鸣器驱动测试【转】
本文转载自:http://whylinux.blog.51cto.com/10900429/1932491 字符设备驱动用的fileopretion结构体. 1.板载蜂鸣器的驱动测试 我手里有一个BS ...
- DevOps on DevCloud|如何实现应用接口的混合驱动测试
引言:在"DevOps能力之屋(Capabilities House of DevOps)"中,华为云DevCloud提出(工程方法+最佳实践+生态)×工具平台=DevOps能力. ...
- Selenium(十四):自动化测试模型介绍、模块化驱动测试案例、数据驱动测试案例
1. 自动化测试模型介绍 随着自动化测试技术的发展,演化为了集中模型:线性测试.模块化驱动测试.数据驱动测试和关键字驱动测试. 下面分别介绍这几种自动化测试模型的特点. 1.1 线性测试 通过录制或编 ...
- 流程及迭代驱动测试管理软件, itest 发布到开源中国
itest 源码已发布到码云 ,项目已被开源中国收录!详见 https://www.oschina.net/p/itest-cn 测试人自己开发,汇聚10年沉淀,独创流程驱动测试.度量展现测试人价值 ...
- web自动化测试-模块驱动测试实例和数据驱动测试实例
一.模块驱动测试实例 把登录和退出统一封装在login类中,若把login类单独放在一个文件中,就可以给任一测试脚本调用,这里就跟测试脚本放一起 from selenium import webdri ...
- 自动化测试架构设计 &&自动化持续集成测试任务实战[线性测试、模块驱动测试、数据驱动测试、关键字驱动测试]
1 为什么设计自动化测试架构 1.1 企业现状分析 压力大:产品需求不明确,上线时间确定,压力山大. 混乱:未立项,开发时间已过半,前期无控制,后期无保障. 疲于应付:开发人员交付的文件质量差,测试跟 ...
- Kiwi iOS驱动测试开发
Kiwi是iOS开发一个行为驱动开发库.目标是提供一个BDD库,精美的简单安装和使用. 安装 使用CocoaPods安装: pod 'Kiwi'如果使用Xcode5则使用: pod 'Kiwi/XCT ...
随机推荐
- SQL 语句递归查询 With AS 查找所有子节点
create table #EnterPrise ( Department nvarchar(50),--部门名称 ParentDept nvarchar(50),--上级部门 Depar ...
- 计算机通信协议之OSI参考模型
OSI参考模型 在OSI参考模型之前人类对计算机结构的研究就已经进行了太多的讨论,最终通过了作为通信协议设计指标的OSI参考模型.这个协议将通信协议中必要的功能分成了七个部分.通过这些分层使得那些比较 ...
- spineRunTime for cocos2dx v3 中动画播完删除animation
spineRunTime for cocos2dx v3 中删除animation,发现下面写法会崩溃: spine::SkeletonAnimation* animationNode = spi ...
- Redis(五):几个常用概念
1.Redis 默认有16384 solts(槽),每个槽可以存储多个hash值. 2.Redis 默认不需要密码: 2.1 注释去掉,设置自己的密码 3.设置密码后需要通过 3.1 -h 主机ip ...
- Java:集合,Collection接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- Android 权限表
String ACCESS_CHECKIN_PROPERTIES 同意在登入数据库的时候读写当中的属性表,并上传改变的值 String ACCESS_COARSE_LOCATION 同意应用訪问范围( ...
- QWidget子窗口中setStyleSheet无效,解决方法
继承 QWidget setStyleSheet无效,解决方法. 发现 继承自QWidget的自定义类 ,使用setStyleSheet无效, 如果删除头文件中的 Q_OBJECT,setStyleS ...
- paip.分布式应用系统java c#.net php的建设方案
paip.分布式应用系统java c#.net php的建设方案 1. 基础设施的建立 1 2. 本地的的调用API 1 3. 数据的传输 1 4. 代码的传输 1 5. 代码的自动热编译 2 6. ...
- 【Android】21.2 2D图形图像处理(Canvas和Paint)
分类:C#.Android.VS2015: 创建日期:2016-03-19 一.Canvas对象简介 画布(Canvas对象)是与System.Drawing或iOS核心图形等传统框架非常类似的另一种 ...
- (一)jQuery EasyUI 的EasyLoader载入原理
1.第一次看了官网的demo.引用的是EasyLoader.js文件,而不是引用jquery.easyui.min.js文件,我就有疑问了,百度一下. jQuery EasyUI是一款基于JQuery ...