[Q/A] Address decoding

QnA 2009. 6. 22. 10:55
보드에서 장치를 추가할때 궁금점

스트롱암의 Chip Select 가 몇개 안되잖아요?
그런데 주변장치가 많아질때 즉, 이러한 Chip Select를
초과하는 장치를 달게 될때 필요한 신호를 어떻게 마련하는지
궁금합니다.
우선 제가 알아본 바로는 어드레스 디코더를 사용해서
어드레스를 주게 되면 CPU가 알아서 해석을 해서 원하는 장치를
선택해준다고 들었습니다.

그러면 프로그램상에서는
1. chip select로 할당된 어드레스를 입력하고
2. 데이터를 보내고
3. 데이터를 받고
4. 프로그램 종료

이런식으로 하라고 들었는데요.

이러한 작업을 리눅스로 할려면 우선은 디바이스 드라이버가
있어야 할것이고, 디바이스 드라이버를 커널에 포함을
시키거나 모듈로 추가를 할시에 이 장치에 할당된 주소를
입력시켜주어서 살려놓고(사용가능하게 해놓고) 응용 어플에서
open, write, read와 같은 함수를 사용해서 접근하는 것이
맞는지요? 그리고 이 장치에 할당된 주소는 가상 메모리로
이미 맵핑이 되어 있어야 하고요?

저는 이렇게 생각하고 있습니다. 만일 위의 것이 맞다면요.
(맞지 않다면 설명좀 부탁드리겠습니다. 그럼 그 이후에
제가 생각한 것이 완전히 틀려진 것이 되거든요 -_-!)
스트롱암에서 주변장치를 추가할때에 이지보드와 같은 경우에는
어드레스 라인중 A23,A24,A25와 같은 선을 사용해서 어드레스
디코더 역할을 하는것 같은데요. 이때는 A23,24,25가 높은
위치에 있는 주소선에 해당하므로 주변장치 역시 이러한
상위영역으로 선택이 되는것이 맞는지요?

즉 다른것을 다 제외하고 단지 A23, A24, A25에 해당하는 비트를 1로
셋팅했을때 나타나는 주소를 사용하면 CPU가 알아서 그 장치를 선택하는
것인지요?

질문이 두서가 없더라도 이해해 주시길 바라겠습니다.

보드에서 장치를 추가할때 궁금점 | 답장: 3개(RSS) | 본문에 답장
정렬 :  

답장 holelee (2003년 03월 18일 오후 09:24)
질문의 요지가 무엇인지 정말 알 수가 없네요.
우선 소프트웨어적인 면은 잘 알고 있는 것으로 보입니다.

그런데 A23,A24,A25등의 내용은 도대체 알 수가 없습니다.
또한 분명 이야기의 시작은 CS의 갯수가 한정되어 있고 장치의 갯수가 그것보다 많으면 어떻게 하느냐로 시작했는데 맨 마지막에서 무슨말을 하는지는 잘 모르겠습니다.

ChipSelect에 대해서 간략히 말씀드리겠습니다.
SoftWare에서 사용하는 address는 32bit입니다.
그 32bit중에 상위 몇비트를 보고 이것이 SDRAM인지 CS0, CS1,.. 등에 달려 있는 address인지 검사를 합니다.(StrongARM내부에서 이루어 지고, address decoding이라고 할 수 있습니다.)
그래서 CS0라고 하면 CS0 핀에 신호가 인가 되고, 32bit 어드레스중에 하위 26비트는 Address 핀(A25~A0)에 신호가 인가되죠.(물론 read/write인지 해당하는 신호도 있죠.)
CS0를 어떤 장치의 CS에 연결하고 address(A0~A?? : 장치의 크기에 따라서)와 data를 연결하면 되죠.
그런데 CS0에 장치를 두개 달고 싶다면 두개의 장치에 각각 있는 CS를 어떻게 연결할 것인가가 문제가 됩니다.
그럴 경우는 일반적으로 "첫번째 장치의 CS = CS0 & A25"로 하고 "두번째 장치의 CS = CS0 & (~A25)"로 합니다.
무슨 이야기냐 하면 CS0에 신호가 인가되고 A25가 '1'이면 첫번째 장치의 CS로 신호가 인가되고 CS0가 인가되고 A25가 '0'이면 두번째 장치의 CS에 신호가 인가되도록 하는 겁니다.
이렇게 신호가 인가되도록 StrongARM외부에 논리회로를 만들어 달면 됩니다.
(물론 CS는 negative signal이므로 논리회로 구성할때 주의를 해야 하죠.)
이 논리회로를 또한 "address decoder"라고 할 수 있습니다.
소프트웨어에서 첫번째 장치에 접근할때는 aaaa0xxxx..xx라는 어드레스를 사용하면 되고 두번째 장치는 aaaa1xxxx...xx를 사용하면 되겠죠.(여기서 aaaa로는 CS0가 선택되고 그 뒤의 '0', '1'이 A25가 되도록 하면 되죠.)
좀더 확장해서 CS0에 4개를 붙일 수도 있겠죠.

쿨럭..
[ 이글에 답장 | 본문에 답장 ]

답장 새내기 (2003년 03월 21일 오전 08:57)
감사합니다. 도움이 많이 되었습니다.
꾸벅.. (--)(__)
[ 이글에 답장 | 본문에 답장 ]

답장 박영화 (2003년 03월 26일 오전 09:18)
디바이스 드라이버는 파일 오퍼레이션에 대한 핸들러 함수로 구성 됩니다.

/dev 디렉토리에 있는 파일은 실제 파일이 아니라 디바이스 드라이버의 엔트리 포인트라고 할수 있구요.
ls -l 해서 보시면 각각의 디바이스 파일의 major, minor 넘버를 확인 할 수 있습니다.
major, minor 넘버는 디바이스 드라이버와 디바이스 파일을 매핑시키는 키 값이 되구요

디바이스 파일에 대한 파일 오퍼레이션 (open, read, write,...)을 하게 되면
해당 디바이스 드라이버의 핸들러 함수가 작동 합니다.

디바이스 드라이버를 등록할 때는
핸들러 함수의 포인터를 구조체에 넣고 등록 함수를 호출 합니다.
이때 매이저 넘버를 지정하구요.
구조체는 커널 내부에서 링크트리스트로 관리 됩니다.

파일 오퍼레이션에 관한 시스템 콜이 이루어지면 커널 코드가
매이저 넘버를 검사해서 해당 드라이버의 핸들러 함수를 호출하게 됩니다.

자세한 내용은 LDD 책을 참조 하세요.


WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,