레지스터 설정을 통해 MT7620n의 GPIO에 액세스하려고합니다. 지금까지 나는/sys/class/gpio /를 사용하여 그것들에 접근 할 수 있었다. 그러나 그것은 나를 위해 충분히 빠르지 않다.devmemon에 mmap을 사용하는 방법 MT7620n
MT7620 페이지 84의 프로그래밍 안내서에서 GPIO 기본 주소가 0x10000600이고 단일 레지스터의 오프셋이 4 바이트임을 알 수 있습니다. 같은
뭔가 : 쉘에서 devmem 0x10000600 절대적으로 잘 작동하지만 난 C의 programm에 내부에서 액세스 할 수 없습니다.
#define GPIOCHIP_0_ADDDRESS 0x10000600 // base address
#define GPIO_BLOCK 4
volatile unsigned long *gpiochip_0_Address;
int gpioSetup()
{
int m_mfd;
if ((m_mfd = open("/dev/mem", O_RDWR)) < 0)
{
printf("ERROR open\n");
return -1;
}
gpiochip_0_Address = (unsigned long*)mmap(NULL, GPIO_BLOCK, PROT_READ|PROT_WRITE, MAP_SHARED, m_mfd, GPIOCHIP_0_ADDDRESS);
close(m_mfd);
if(gpiochip_0_Address == MAP_FAILED)
{
printf("mmap() failed at phsical address:%d %s\n", GPIOCHIP_0_ADDDRESS, strerror(errno));
return -2;
}
return 0;
}
내가 얻는 출력은 다음과 같습니다 :
mmap() failed at phsical address:268436992 Invalid argument
은 내가 알아서해야합니까 여기
내 코드? 전에 메모리에 액세스 할 수있게해야합니까? 나는 루트 권한으로 실행 중이다.감사
편집
피터 코르 맞아, 정말 감사합니다.
#define GPIOCHIP_0_ADDDRESS 0x10000600 // base address
volatile unsigned long *gpiochip_0_Address;
int gpioSetup()
{
const size_t pagesize = sysconf(_SC_PAGE_SIZE);
unsigned long gpiochip_pageAddress = GPIOCHIP_0_ADDDRESS & ~(pagesize-1); //get the closest page-sized-address
const unsigned long gpiochip_0_offset = GPIOCHIP_0_ADDDRESS - gpiochip_pageAddress; //calculate the offset between the physical address and the page-sized-address
int m_mfd;
if ((m_mfd = open("/dev/mem", O_RDWR)) < 0)
{
printf("ERROR open\n");
return -1;
}
page_virtual_start_Address = (unsigned long*)mmap(NULL, pagesize, PROT_READ|PROT_WRITE, MAP_SHARED, m_mfd, gpiochip_pageAddress);
close(m_mfd);
if(page_virtual_start_Address == MAP_FAILED)
{
printf("ERROR mmap\n");
printf("mmap() failed at phsical address:%d %d\n", GPIOCHIP_0_ADDDRESS, strerror(errno));
return -2;
}
gpiochip_0_Address = page_virtual_start_Address + (gpiochip_0_offset/sizeof(long));
return 0;
}
니스;) 감사합니다. – user3000289