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 #define MAXPWM 2
00035
00036 #define reg_val(reg) *((unsigned long *)reg)
00037
00038 static void* map_base;
00039 static int fd;
00040
00041 static void bit_set(unsigned long addr,unsigned gpio)
00042 {
00043 void * virt_addr;
00044 unsigned long mask;
00045
00046 virt_addr = map_base + ((addr+(gpio/32)*4) & MAP_MASK);
00047
00048 mask = 1 << (gpio%32);
00049
00050 reg_val(virt_addr) = reg_val(virt_addr) | mask;
00051 }
00052
00053 static void bit_clear(unsigned long addr,unsigned gpio)
00054 {
00055 void * virt_addr;
00056 unsigned long mask;
00057
00058 virt_addr = map_base + ((addr+(gpio/32)*4) & MAP_MASK);
00059 mask = 1 << (gpio%32);
00060
00061 reg_val(virt_addr) = reg_val(virt_addr) & ~mask;
00062 }
00063
00064 static int bit_test(unsigned long addr,unsigned gpio)
00065 {
00066 void * virt_addr;
00067 unsigned long mask;
00068
00069 virt_addr = map_base + ((addr+(gpio/32)*4) & MAP_MASK);
00070 mask = 1 << (gpio%32);
00071
00072 if(reg_val(virt_addr) & mask)
00073 return 1;
00074 else
00075 return 0;
00076 }
00077
00078 static void reg_set(unsigned long addr,unsigned long value)
00079 {
00080 void * virt_addr;
00081
00082 virt_addr = map_base + (addr & MAP_MASK);
00083
00084 reg_val(virt_addr) = value;
00085 }
00086
00087 static long int get_reg(unsigned long addr)
00088 {
00089 void * virt_addr;
00090
00091 virt_addr = map_base + (addr & MAP_MASK);
00092
00093 return reg_val(virt_addr);
00094 }
00095
00104 int kb_gpio_init()
00105 {
00106
00107
00108 if((fd = open(MEMDEV, O_RDWR | O_SYNC)) == -1)
00109 {
00110 KB_ERROR("kb_gpio_init",KB_ERROR_FILEOPEN,MEMDEV);
00111 return -KB_ERROR_FILEOPEN;
00112 }
00113
00114
00115 map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_BASE & ~MAP_MASK);
00116 if(map_base == (void *) -1)
00117 {
00118 KB_ERROR("kb_gpio_init",KB_ERROR_MMAP,GPIO_BASE & ~MAP_MASK);
00119 return -KB_ERROR_MMAP;
00120 }
00121
00122 return 0;
00123 }
00124
00128 int kb_gpio_cleanup()
00129 {
00130 if(munmap(map_base, MAP_SIZE) == -1) KB_ERROR("kb_gpio_cleanup",KB_ERROR_MMAP,map_base);
00131 close(fd);
00132 }
00133
00134 int kb_gpio_mode()
00135 {
00136 }
00137
00148 void kb_gpio_function(unsigned gpio, unsigned function)
00149 {
00150 if(gpio > MAXIO || function > 3)
00151 KB_ERROR("kb_gpio_function",KB_ERROR_INVALID);
00152
00153 if((function & 0x1))
00154 bit_set(GAFR,2*gpio);
00155 else
00156 bit_clear(GAFR,2*gpio);
00157
00158 if((function & 0x2))
00159 bit_set(GAFR,(2*gpio)+1);
00160 else
00161 bit_clear(GAFR,(2*gpio)+1);
00162 }
00163
00171 void kb_gpio_dir(unsigned gpio, unsigned dir)
00172 {
00173 if(gpio > MAXIO)
00174 KB_ERROR("kb_gpio_dir",KB_ERROR_INVALID);
00175
00176 if(dir)
00177 bit_clear(GPDR,gpio);
00178 else
00179 bit_set(GPDR,gpio);
00180 }
00181
00189 void kb_gpio_set(unsigned gpio)
00190 {
00191 if(gpio > MAXIO)
00192 KB_ERROR("kb_gpio_set",KB_ERROR_INVALID);
00193
00194 bit_set(GPSR,gpio);
00195 }
00196
00204 void kb_gpio_clear(unsigned gpio)
00205 {
00206 if(gpio > MAXIO)
00207 KB_ERROR("kb_gpio_clear",KB_ERROR_INVALID);
00208
00209 bit_set(GPCR,gpio);
00210 }
00211
00223 int kb_gpio_get(unsigned gpio)
00224 {
00225 if(gpio > MAXIO)
00226 {
00227 KB_ERROR("kb_gpio_get",KB_ERROR_INVALID);
00228 return -KB_ERROR_INVALID;
00229 }
00230
00231 return bit_test(GPLR, gpio);
00232 }