#include #include #include #include #include #include #include #include #include #include #include // gettimeofday #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULT_MD_LEN 4096 int fd=-1; static const char dev[]="/dev/mem"; #define PAGE_SIZE 0x1000 #define PAGE_SIZE_MASK 0xfffff000 typedef struct tag_MMAP_Node { unsigned int Start_P; unsigned int Start_V; unsigned int length; unsigned int refcount; struct tag_MMAP_Node * next; }TMMAP_Node_t; TMMAP_Node_t * pTMMAPNode = NULL; void * memmap(unsigned int phy_addr, unsigned int size) { //#ifndef OS_LINUX // return (void *)phy_addr; //#else unsigned int phy_addr_in_page; unsigned int page_diff; unsigned int size_in_page; TMMAP_Node_t * pTmp; TMMAP_Node_t * pNew; void *addr=NULL; if(size == 0) { printf("memmap():size can't be zero!\n"); return NULL; } /* check if the physical memory space have been mmaped */ pTmp = pTMMAPNode; while(pTmp != NULL) { if( (phy_addr >= pTmp->Start_P) && ( (phy_addr + size) <= (pTmp->Start_P + pTmp->length) ) ) { pTmp->refcount++; /* referrence count increase by 1 */ return (void *)(pTmp->Start_V + phy_addr - pTmp->Start_P); } pTmp = pTmp->next; } /* not mmaped yet */ if(fd < 0) { /* dev not opened yet, so open it */ fd = open (dev, O_RDWR | O_SYNC); if (fd < 0) { printf("memmap():open %s error!\n", dev); return NULL; } } /* addr align in page_size(4K) */ phy_addr_in_page = phy_addr & PAGE_SIZE_MASK; page_diff = phy_addr - phy_addr_in_page; /* size in page_size */ size_in_page =((size + page_diff - 1) & PAGE_SIZE_MASK) + PAGE_SIZE; addr = mmap ((void *)0, size_in_page, PROT_READ|PROT_WRITE, MAP_SHARED, fd, phy_addr_in_page); if (addr == MAP_FAILED) { printf("memmap():mmap @ 0x%x error!\n", phy_addr_in_page); return NULL; } /* add this mmap to MMAP Node */ pNew = (TMMAP_Node_t *)malloc(sizeof(TMMAP_Node_t)); if(NULL == pNew) { printf("memmap():malloc new node failed!\n"); return NULL; } pNew->Start_P = phy_addr_in_page; pNew->Start_V = (unsigned int)addr; pNew->length = size_in_page; pNew->refcount = 1; pNew->next = NULL; if(pTMMAPNode == NULL) { pTMMAPNode = pNew; } else { pTmp = pTMMAPNode; while(pTmp->next != NULL) { pTmp = pTmp->next; } pTmp->next = pNew; } return (void *)(addr+page_diff); //#endif } void key_read(){ uint32_t ulOld; uint32_t ulAddr; int key; void* pMem = NULL; while (1){ pMem = memmap(0x12150000, DEFAULT_MD_LEN); //gpio0 printf("+++%p\n\r",pMem); ulOld = *(uint32_t *)((char *)pMem + 0x3FC); printf("0x%08lX\n",ulOld); key = (ulOld &0x04)>>2; //get gpio0_2 printf("key: %d\n\r",key); sleep(1); } }