Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

kb_gpio.c

Go to the documentation of this file.
00001 /*------------------------------------------------------------------------------- 00002 * Project: KoreBot Library 00003 * $Author: pbureau $ 00004 * $Date: 2005/01/20 08:41:54 $ 00005 * $Revision: 1.1 $ 00006 * 00007 * 00008 * $Header: /home/cvs/libkorebot/src/kb_gpio.c,v 1.1 2005/01/20 08:41:54 pbureau Exp $ 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 /* Open the memory device */ 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 /* map registers to user space */ 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 }

Generated on Thu Nov 17 15:28:56 2005 for KoreBot Library by doxygen 1.3.7