四大驱动之-触摸屏(小例子-裸版2)
来源:互联网 发布:foxpro是什么软件 编辑:程序博客网 时间:2024/06/06 03:56
将一封装成函数;并实现按一下,打印按下点的x,y坐标。
up.h:
#define VIC0IRQSTATUS (*(volatile unsigned long *)0x71200000)
#define VIC0RAWINTR (*(volatile unsigned long *)0x71200008)
#define VIC0INTSELECT (*(volatile unsigned long *)0x7120000C)
#define VIC0INTENABLE (*(volatile unsigned long *)0x71200010)
#define VIC0SOFTINT (*(volatile unsigned long *)0x71200018)
#define VIC1IRQSTATUS (*(volatile unsigned long *)0x71300000)
#define VIC1RAWINTR (*(volatile unsigned long *)0x71300008)
#define VIC1INTSELECT (*(volatile unsigned long *)0x7130000C)
#define VIC1INTENABLE (*(volatile unsigned long *)0x71300010)
#define VIC1SOFTINT (*(volatile unsigned long *)0x71300018)
#define WTCON (*(volatile unsigned long *)0x7E004000)
#define WTDAT (*(volatile unsigned long *)0x7E004004)
#define WTCNT (*(volatile unsigned long *)0x7E004008)
#define WTCLRINT (*(volatile unsigned long *)0x7E00400C)
#define ADCCON (*(volatile unsigned long *)0x7E00B000)
#define ADCTSC (*(volatile unsigned long *)0x7E00B004)
#define ADCDLY (*(volatile unsigned long *)0x7E00B008)
#define ADCDAT0 (*(volatile unsigned long *)0x7E00B00C)
#define ADCDAT1 (*(volatile unsigned long *)0x7E00B010)
#define ADCUPDN (*(volatile unsigned long *)0x7E00B014)
#define ADCCLRINT (*(volatile unsigned long *)0x7E00B018)
#define ADCCLRINTPNDNUP (*(volatile unsigned long *)0x7E00B020)
test.c:
#include "up.h"
int (*printf)(char *,...) = 0x57e11d4c;
void do_irq();
void auto_cvt();
void get_lct();
void wdt_on();
void wdt_off();
void wait_for_up();
void wait_for_down();
int main()
{
*(unsigned long *)0x56000000 = do_irq;
__asm__ __volatile__(
"mrs r0,cpsr\n"
"bic r0,r0,#0x80\n"
"msr cpsr,r0\n"
);
VIC1INTSELECT &= ~(1<<30);//VIC1INTSELECT = 0<<30;第62号中断:62-32=30
VIC1INTSELECT &= ~(1<<31);//VIC1INTSELECT = 0<<30;第62号中断:62-32=30
VIC0INTSELECT &= ~(1<<26);
VIC1INTENABLE |= (1<<30);//中断使能
VIC1INTENABLE |= (1<<31);//中断使能
VIC0INTENABLE |= (1<<26);//中断使能
ADCTSC=0xd3;
return 0;
}
void do_irq()
{
if(VIC1RAWINTR&(1<<30))
{
ADCCLRINTPNDNUP =1;
if(ADCUPDN &1)//up
{
printf("down\n");
auto_cvt();
wdt_on();
wait_for_up();
}
else if(ADCUPDN & (1<<1))//up
{
printf("up\n");
wdt_off();
wait_for_down();
}
ADCUPDN =0;
}
if(VIC1RAWINTR & (1<<31))
{
ADCCLRINT = 1;
get_lct();
wait_for_up();
}
if(VIC0RAWINTR & (1<<26))
{
WTCLRINT = 0;
auto_cvt();
wait_for_up();
}
}
void auto_cvt()
{
ADCCON = 1 | (30<<6)|(1<<14)|(1<<16);
ADCTSC |= 4;
}
void get_lct()
{
printf("x is %d\n",ADCDAT0 & 0xfff);
printf("y is %d\n",ADCDAT1 & 0xfff);
}
void wdt_on()
{
WTCON = (1<<2)|(2<<3)|(1<<5) |(47<<8);
WTCNT = 0x800;
WTDAT = 0x800;
}
void wdt_off()
{
WTCON =0;
}
void wait_for_up()
{
ADCTSC = (1<<8)|0xd3;
}
void wait_for_down()
{
ADCTSC=0xd3;
}
vector.S:
b reset
b und
b swi
b pre_abt
b data_abt
.word 0x0
b irq
b fiq
reset:
und:
mov sp, #0x56000000
stmfd sp!, {r0-r12, lr}
ldr r2, printf
ldr r0, =string_und
blx r2
mov sp, #0x56000000
ldmea sp, {r0-r12, pc}^
string_und:
.asciz "undefined\n"
.align 2
swi:
mov sp, #0x56000000
stmfd sp!, {r0-r12, lr}
ldr r1, [lr, #-4]
and r1, r1, #0xffffff
ldr r0, =string
ldr r2, printf
blx r2
mov sp, #0x56000000
ldmea sp, {r0-r12, pc}^
pre_abt:
mov sp, #0x56000000
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
mov sp, #0x56000000
ldmea sp, {r0-r12, pc}^
data_abt:
mov sp, #0x56000000
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
ldr r0, =string_data
ldr r2, printf
blx r2
mov sp, #0x56000000
ldmea sp, {r0-r12, pc}^
string_data:
.asciz "data\n"
.align 2
irq:
mov sp, #0x56000000
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
mov r1, #0x56000000
ldr r0, [r1]
blx r0
//ldr r0, =0x7E00400C
//mov r1, #100
//str r1, [r0]
//
//ldr r0, =wdt_string
//ldr r2, printf
//blx r2
mov sp, #0x56000000
ldmea sp, {r0-r12, pc}^
wdt_string:
.asciz "wang wang wang\n"
.align 2
fiq:
mov sp, #0x56000000
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
mov sp, #0x56000000
ldmea sp, {r0-r12, pc}^
printf:
.word 0x57e11d4c
string:
.asciz "swi %x\n"
.align 2
Makefile:
all:
arm-none-linux-gnueabi-gcc test.c -c -o test.o
arm-none-linux-gnueabi-ld -Ttext=0x50000000 test.o -o test
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -Obinary test /var/lib/tftpboot/test.bin
arm-none-linux-gnueabi-gcc -c vector.S -o vector.o
arm-none-linux-gnueabi-ld -Ttext=0x0 vector.o -o vector
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -Obinary vector /var/lib/tftpboot/vector.bin
clean:
rm -rf test.o test /var/lib/tftpboot/test.bin
rm -rf vector.o vector /var/lib/tftpboot/vector.bin
- 四大驱动之-触摸屏(小例子-裸版2)
- 四大驱动之-触摸屏(小例子-裸版)
- 四大驱动之-触摸屏
- 四大驱动—触模屏(内核模块小例子2)
- 四大驱动—触模屏(内核模块小例子)
- Linux驱动之触摸屏(2)
- 四大驱动—触模屏(内核模块小例子3封装成函数)
- Linux输入子系统之触摸屏驱动2
- 触摸屏驱动 之 校正(一)
- 触摸屏驱动 之 校正(二)
- mini2440之触摸屏驱动
- Linux驱动之触摸屏
- 触摸屏驱动程序设计 之 触摸屏驱动分析
- Linux驱动之触摸屏(1)
- Linux驱动之触摸屏(3)
- 触摸屏驱动之滤波函数
- mini2440驱动分析之触摸屏
- 触摸屏驱动之概念介绍
- Django添加方法__unicode__()无效 的解决办法
- Android NDK 开发环境搭建
- JavaScript面向对象学习小结
- OCP-1Z0-052-V8.02-115题
- java一个通用的 map排序函数
- 四大驱动之-触摸屏(小例子-裸版2)
- php header Content-Type类型小结
- QTableWidget设置网格线粗细 单元格中添加控件并居中
- 二叉树前序、中序、后序遍历相互求法及有关代码实现
- 搜索神器
- Ext4 健盘导航
- jquerymobile知识点二:动态ListView
- 内核模块的定时器--来做中断源
- [php]应用控制器(二)