00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include <sys/mman.h>
00012
#include "korebot.h"
00013
#include "kb_pxa_register.h"
00014
00029 #define MAP_SIZE 4096UL
00030 #define MAP_MASK (MAP_SIZE - 1)
00031
00032 #define MEMDEV "/dev/mem"
00033 #define MAXIO 84
00034
00035 #define reg_val(reg) *((unsigned long *)reg)
00036
00037 static void*
map_base;
00038 static int fd;
00039
00040 static void bit_set(
unsigned long addr,
unsigned gpio)
00041 {
00042
void * virt_addr;
00043
unsigned long mask;
00044
00045 virt_addr =
map_base + ((addr+(gpio/32)*4) &
MAP_MASK);
00046 mask = 1 << (gpio%32);
00047
00048
reg_val(virt_addr) =
reg_val(virt_addr) | mask;
00049 }
00050
00051 static void bit_clear(
unsigned long addr,
unsigned gpio)
00052 {
00053
void * virt_addr;
00054
unsigned long mask;
00055
00056 virt_addr =
map_base + ((addr+(gpio/32)*4) &
MAP_MASK);
00057 mask = 1 << (gpio%32);
00058
00059
reg_val(virt_addr) =
reg_val(virt_addr) & ~mask;
00060 }
00061
00062 static int bit_test(
unsigned long addr,
unsigned gpio)
00063 {
00064
void * virt_addr;
00065
unsigned long mask;
00066
00067 virt_addr =
map_base + ((addr+(gpio/32)*4) &
MAP_MASK);
00068 mask = 1 << (gpio%32);
00069
00070
if(
reg_val(virt_addr) & mask)
00071
return 1;
00072
else
00073
return 0;
00074 }
00075
00084 int kb_gpio_init()
00085 {
00086
00087
00088
if((
fd = open(
MEMDEV, O_RDWR | O_SYNC)) == -1)
00089 {
00090
KB_ERROR(
"kb_gpio_init",
KB_ERROR_FILEOPEN,
MEMDEV);
00091
return -
KB_ERROR_FILEOPEN;
00092 }
00093
00094
00095
map_base = mmap(0,
MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
fd,
GPIO_BASE & ~
MAP_MASK);
00096
if(
map_base == (
void *) -1)
00097 {
00098
KB_ERROR(
"kb_gpio_init",
KB_ERROR_MMAP,
GPIO_BASE & ~
MAP_MASK);
00099
return -
KB_ERROR_MMAP;
00100 }
00101
00102
return 0;
00103 }
00104
00108 int kb_gpio_cleanup()
00109 {
00110
if(munmap(
map_base,
MAP_SIZE) == -1)
KB_ERROR(
"kb_gpio_cleanup",
KB_ERROR_MMAP,
map_base);
00111 close(
fd);
00112 }
00113
00114 int kb_gpio_mode()
00115 {
00116 }
00117
00128 void kb_gpio_function(
unsigned gpio,
unsigned function)
00129 {
00130
if(gpio >
MAXIO || function > 3)
00131
KB_ERROR(
"kb_gpio_get",
KB_ERROR_INVALID);
00132
00133
if((function & 0x1))
00134
bit_set(
GAFR,2*gpio);
00135
else
00136
bit_clear(
GAFR,2*gpio);
00137
00138
if((function & 0x2))
00139
bit_set(
GAFR,(2*gpio)+1);
00140
else
00141
bit_clear(
GAFR,(2*gpio)+1);
00142 }
00143
00151 void kb_gpio_dir(
unsigned gpio,
unsigned dir)
00152 {
00153
if(gpio >
MAXIO)
00154
KB_ERROR(
"kb_gpio_get",
KB_ERROR_INVALID);
00155
00156
if(dir)
00157
bit_clear(
GPDR,gpio);
00158
else
00159
bit_set(
GPDR,gpio);
00160 }
00161
00169 void kb_gpio_set(
unsigned gpio)
00170 {
00171
if(gpio >
MAXIO)
00172
KB_ERROR(
"kb_gpio_get",
KB_ERROR_INVALID);
00173
00174
bit_set(
GPSR,gpio);
00175 }
00176
00184 void kb_gpio_clear(
unsigned gpio)
00185 {
00186
if(gpio >
MAXIO)
00187
KB_ERROR(
"kb_gpio_get",
KB_ERROR_INVALID);
00188
00189
bit_set(
GPCR,gpio);
00190 }
00191
00203 int kb_gpio_get(
unsigned gpio)
00204 {
00205
if(gpio >
MAXIO)
00206 {
00207
KB_ERROR(
"kb_gpio_get",
KB_ERROR_INVALID);
00208
return -
KB_ERROR_INVALID;
00209 }
00210
00211
return bit_test(
GPLR, gpio);
00212 }