![](/zbxe/layouts/mr_layouts_1st/images/default/blank.gif)
도와주세요!!
H1, H2 커넥터에 연결되어있는 BD[0:31], nCS3, nWE, nOE 신호를 제어하는 방법에 대해 문의를 드립니다.
OS가 없다면 바로 해당하는 주소를 접근하면 될텐데요.
EZ-S3C2400에 올라간 리눅스에서 어플리케이션 코드로 접근이 가능한지요?
예를 들어, 아래와 같은 코드를 Host PC에서 test.c로 만든후 컴파일하여
EZ 보드에서 실행하려고 합니다.
#defien EXT_PORT_CS3 *(volatile unsigned int *)(nCS3_BASE_ADDR + 0x0000)
void main(void)
{
EXT_PORT_CS3 = 0x12345678;
}
이 때,
위 처럼 바로 주소 접근이 가능한지, 가능하지 않다면 다른 방법이 존재하는지와
nCS3_BASE_ADDR에 해당하는 주소가 어떻게 되는지 알고 싶습니다.
:) OS 없이 코드만 작성하다 첨 접하는 리눅스에서 코딩하려니 어렵네요.
답변 감사드립니다. ^^;
자답입니다만, 다른 분들중에 저같은 경우가 있을지 몰라 제가 테스트 한 방법을 적습니다.
검색을 하다보니 mmap 함수를 사용하는 방법이 있어 사용을 해보니 GPIO와 CS 컨트롤 제어가 되는 것 같네요.
아래는 테스트 코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
#define GPIO_ADDR 0x56000000
#define CS3_ADDR 0x18000000
int main(void)
{
int fd, fd_cs3;
volatile void *gpio_base;
volatile void *cs3_base;
fd = open("/dev/mem", O_RDWR|O_SYNC);
if(fd == -1) {
printf("/dev/mem open error");
exit(1);
}
fd_cs3 = open("/dev/mem", O_RDWR|O_SYNC);
gpio_base = mmap(0, 0x100, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_ADDR);
cs3_base = mmap(0, 0x100, PROT_READ|PROT_WRITE, MAP_SHARED, fd_cs3, CS3_ADDR);
printf("gpio address : %x\n", gpio_base);
printf("cs3 address : %x\n", cs3_base);
while(1) {
*(volatile unsigned *)(gpio_base + 0x54) = 0x00; // led on
*(volatile unsigned short*)(cs3_base + 0x00) = 0xffff;
sleep(1);
*(volatile unsigned *)(gpio_base + 0x54) = 0xff; // led off
*(volatile unsigned short*)(cs3_base + 0x04) = 0x0000;
sleep(1);
}
return 0;
}
위 코드중에 주의할 점은 보드 구매시 기본으로 들어있는 코드에서는
CS 쪽 data bus가 8bit로 설정이 되어있는 것 같습니다.
short 로 억세스하면 CS가 두 번떨어지고 char로 하면 한번만 떨어집니다.
이 부분은 MCU 문서보고 설정하면 될 듯 하네요.
=> 문서와 코드를 확인해보니 16bit로 설정이 되어있네요.
좀 더 디버깅해봐야 알 수 있겠습니다 --;
OS 가 올라간 상태에서는 어플리케이션에서 위와 같은 방법으로 접근할수 없습니다.
디바이스 드라이버를 통해서 접근하셔야 하고 필요하다면 직접 작성하셔야 합니다.
쉬운 편에 속하는 드라이버이니 직접 만들어 보는것에 도전하셔도 어렵지 않습니다..