2007년 6월 7일 목요일

jp.c 분석

최종 소스는 ftp://ftp.embeddedarm.com/ts-arm-linux-cd/samples/ 에 위치합니다.

jp.c는 보드의 좌측 하단에 위치한 6개의 점퍼 상태를 읽는 기능을 합니다.
TS-7200 Hardware Manual(ts-7200-manual-rev2.2.pdf) 의 7.2 Jumpers를 보면 각 점퍼에 대한 memory map 정보가 나옵니다. 그런데 JP1에 대한 map 정보는 없습니다.(이상하죠?) JP2~JP5는 0x1080_0000 에 위치하고 JP6는 0x2280_0000 에 위치합니다. 각 데이터는 1bit에 해당을 하네요. 참고로 DR, DDR이란 말이 나오는데 DR(Data Register)는 말그대로 Data가 위치하는 resister이고 DDR(Data Direction Resister)는 읽기/쓰기는 결정하는 resister입니다. 제가 처음 접했을때 resister는 CPU내에 위치한 resister만 생각했는데 여기서는 resister란 용어를 이렇게도 쓰더군요. 결론은 여기서는 DR만 잘 읽어서 처리하면 끝입니다.

8, 9 line:
#define TSSTATUS 0x10800000
#define TSJP6 0x22800000
이렇게 정의를 해두었습니다. 다른 소스도 마찬가지이겠지만 resister의 번지는 다 이런식으로 정의하고 시작합니다.

20 line:
int fd = open("/dev/mem", O_RDWRO_SYNC);
O_SYNC flag는 앞선 글에서 언급한바와 같이 cash에 따른 부작용을 없애기 위해 필요하고 O_RDWR는 read/write 모드로 파일을 open 하겠다는 뜻이겠죠. 굳이 여기서는 write 모드로 열 필요는 없습니다.

40, 41, 42 line:
page = TSSTATUS & 0xfffff000;
start = mmap(0, getpagesize(), PROT_READPROT_WRITE, MAP_SHARED, fd, page);

사실 여기서는 단순하게 다음처럼 하는것이 더 보기 좋을 것 같네요.
start = mmap(0, getpagesize(), PROT_READPROT_WRITE, MAP_SHARED, fd, TSSTATUS);
여기서 한가지 중요한 것은 우리가 bit단위의 data를 read할 예정이므로 start는 unsigned char* 로 선언되어야 한다는 것입니다. 즉, 읽고자 하는 데이터의 길이를 잘 판단해서 선언해야하는 것이죠. 여기서는 read만 하기 때문에 크게 문제가 되질 않지만 write를 할때에는 자칫 큰 문제가 생길수가 있습니다.

43 line:
dat = (unsigned char *)(start + (TSSTATUS & 0xfff));
이것 역시 다음처럼 하는게 더 보기 좋습니다.
dat = start;

이후 소스는 & 연산자를 이용해서 해당 비트를 읽어서 표시하는 것이니깐 그리 어렵지 않게 이해가 될겁니다.

컴파일해서 TS7200 보드에 실행해보면 점퍼가 꽂아져 있는 곳에는 ON이라는 결과가 나올겁니다. 무지 간단하죠.
그렇다면 NetBSD에서는 어떻게 확인할까요?
sysctl 명령으로 알수 있습니다~ 다음 처럼요.
% sysctl -a
...
hw.tspld.jp1 = 0
hw.tspld.jp2 = 1
hw.tspld.jp3 = 1
hw.tspld.jp4 = 0
hw.tspld.jp5 = 0
hw.tspld.jp6 = 0
...

여기서는 jp1의 상태를 알수가 있네요^^ 소스를 PC의 /usr/src에 받아두었다면 /usr/src/sys/arch/evbarm/tsarm/tspld.c 에 점퍼설정에 대한 내용이 있습니다. linux의 jp.c에 비해서 조금 복잡해 보일지도 모르지만 사용하는 입장에서는 너무나 편리합니다.

댓글 없음: