168 lines
3.1 KiB
C
168 lines
3.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <fcntl.h>
|
|
#include <sys/mman.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <sys/time.h> // gettimeofday
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/mman.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <netdb.h>
|
|
|
|
#include <fcntl.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
|
|
#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);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|