From: Derya Sezen (funky@gsu.linux.org.tr)
Date: Wed 17 Sep 2003 - 12:10:57 EDT
Selam,
General Purpose I/O 'larimi user space'den /dev/mem'e memory map ile
ulasip istedigim flag'lari set edebiliyorum. Bunu kernel video.S veya
xx.S dosyalarindan birine gommek icin assembly seviyesinde /dev/mem '
nasil ulasabilirim? Yapilacak islemin mantigi :
ldr r1,=0x90040000
ldr r2,=0x00004000
str r2,[r1,#0x00]
ldr r1,=0x9004000C
ldr r2,=0x00004000
str r2,[r1,#0x00]
tarzinda bisi olmasi gerek ama /dev/mem 'e ulasmam gerek bundan once.
Istedigim islemi C'de asagidaki kodum ile yapabiliyorum:
#define GPIO_BASE_OFFSET 0x90040000
#define GPIO_GPLR_OFFSET 0x00000000
#define GPIO_GPDR_OFFSET 0x00000004
#define GPIO_GPSR_OFFSET 0x00000008
#define GPIO_GPCR_OFFSET 0x0000000C
#define GPIO_MAP_SIZE (GPIO_BASE_OFFSET)
int gpio_fd;
static void * gpio_map=NULL;
int main(int argc, char *argv[])
{
gpio_fd = open("/dev/mem", O_RDWR | O_SYNC);
if(gpio_fd < 0)
{
printf("Memory device acilamiyor /dev/mem");
exit(0);
}
gpio_map = mmap(NULL,PAGE_SIZE,PROT_WRITE, MAP_SHARED, gpio_fd,
GPIO_BASE_OFFSET); //gpio'nu mem alanini map et
*((unsigned int *)(gpio_map + GPIO_GPDR_OFFSET)) &=
0xFFFF7FFF; //gpio(15)'i input olarak sec - Power status
*((unsigned int *)(gpio_map + GPIO_GPDR_OFFSET)) |=
0x00004000; //gpio(14)'u output olarak sec
*((unsigned int *)(gpio_map+GPIO_GPSR_OFFSET)) &=
0xFFFFBFFF;
*((unsigned int *)(gpio_map+GPIO_GPCR_OFFSET)) |= 0x00004000;
return 1;
}
fikri olan var mi?
P.S. : kod arm offset'leri baz alinarak yazilmishtir. i386 'da
calismayabilir.
funky