四大驱动之-触摸屏(小例子-裸版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





















原创粉丝点击