아래글 init_IRQ()에서 또 궁금한 점이....
글쓴이: darma3069 / 작성시간: 화, 2003/03/18 - 1:43오후
님께서 링크해주신 자료도 뒤지고 8254 데이터쉬트를 찾아서 보았습니다.
그래서 제가 알아낸 결과는
outb_p(0x34, 0x40)
0x34값으로 0x40 port의 모드(?)를 binary, mode2, counter0, R/W, binary counter 16-bit라는 것을 알게 되었습니다...
그런데 제가 리눅스 초보라서
outb_p(LATCH&0xff, 0x40) outb_p(LATCH<<8, 0x40)
부분이 그래도 이해가 안되는군요 ㅜㅜ
0x40은 channel 0 counter(r/w)라는 설명만 되어 있고
무엇을 의미하는지 잘 모르겠습니다. datasheet에는 그냥 counter0-2까지의
블럭 다이어그램만 떨렁 있어서...
님께서 링크해주신 자료에서 제가 궁금한 것은
1. #define LATCH ((CLOCK_TICK_RATE+HZ/2)/HZ)
님께서 제공하신 자료상에는 LATCH값이 11931.8(0x2e9b)이라고 되어
있는데 define상의 LATCH를 계산해보면 11932.3(0x2e9c)가 아닌지
2. 왜 굳이 40 port를 쓰는지
3. 왜 LATCH의 하위 8bit와 & 연산을 해주는지
4. 왜 LATCH의 shift right 8을 하는지 궁금합니다.(이것은 나누기하고 관련이있는것 같은데)
2,3번을 거치면 자료대로라면 1193180/11931.8 = 100Hz가 나오는 것
같은데 잘 이해가 안되네요...ㅜㅜ
Forums:
포트 번호는 다음과 같습니다. 0x40 8254 channel
포트 번호는 다음과 같습니다.
0x40 8254 channel 0 counter (r/w)
0x41 8254 channel 1 counter (r/w)
0x41 8254 channel 2 counter (r/w)
0x43 8254 control word(w)
이 부분은 PC 호환성 부분이라... 뭐라고 말씀드리기가...
그냥 보드에 붙어있는 8254(Programmable Interval Timer)를 제어하기
위한 포트 번호가 저렇다 정도로 이해하시면...
계산해보면 그렇게 나오는 군요. 이렇게 LATCH를 define하는 이유는
반올림을 위한 것이라고 봅니다(정확하지는 않고... 저의 의견입니다).
위의 포트번호와 8254 데이터 시트를 보시면 아시겠지만 0x40 포트는
channel0의 값을 설정하는 포트입니다. 그런데... 문제는 무조건 바이트 단위로
써야 한다는 것입니다. 왜 냐고요? 하드웨어가 그렇게 설계되어 있습니다.
쓰는 순서는 0x43번 포트 설정할 때 LSB, MSB 순으로 쓴다고 설정해 놓았죠?
따라서 LATCH 값의 하위 바이트, 상위 바이트 순으로 포트에 값을 날리는 것입니다.
하위 바이트 값은 (LATCH&0xff), 상위 바이트 값은 (LATCH>>8 )가
맞죠?
워낙 허접이라... 설명이 이해가 되시는 지?
그럼... ^^;
고맙습니다. 많은 도움이 되었습니다. (냉무)
앞으로도 많은 조언 부탁 드립니다.
댓글 달기