시리얼 통신 관련 인터럽트 질문입니다.
안녕하십니까. 여러 가지 삽질하다 글 올려 봅니다.
현재 요구사항이... 일종의 RF CARD로 통신을 하는 겁니다.
com port로 들어오는 byte신호에 대해서,
특정 값에 대해서는 ACK로 정의된 1byte값을
2ms안에 같은 포트로 송신해야 하거든요.
그래서... 일단 request_irq()로 Serial Device의 IRQ 를 등록해서,
com port로 신호가 전송될 때 발생하는 interrupt를 이용, 송신된 데이터를 검사해서, 특정 값이 되면 Comport로 쏴 주는 Device driver를 만들어
볼라고 했습니다.
그런데... 몇가지 모르는 게 있어, 조언을 구합니다.
1. Device driver안에서 Com Port에 전송된 값을 어떻게 알 수가 있을까요?
ComPort에 무언가 값을 쓰던, 읽던, 값 자체가 발생한 건 인터럽트로 알 수 있겠는데, 정작 데이터를 받을라니, 그 방법을 모르겠네요.
Device Driver안에서
fd = open("/dev/ttyS0", O_RDWR)
할 수는 없을 테고요.
또한, 이게 된다고 해도, 시리얼 포트에 전송된 값을 저런 식으로 읽어 버리면, 2ms라는 제한 시간 안에 될 지도 의문이구요.
커널 소스를 뒤져야 할 것 같아서 조금 봤었는데, 비슷한 이름의 함수( receive_chars(), transmit_chars() 등 )는 찾았지만, 이걸 어디에 어떻게 써야 할 지 모르겠습니다. 죄다 static으로 선언(당연하다면 당연하지만요. -_-;)되어 있어서, 제가 만들 모듈에서 쓸 수 있을 것 같지도 않고요.
그래서.... 일단 생각해 낸 방법이,
inb(), outb()
를 이용해, serial port( = 0x2f8)의 값 자체를 직접 읽어오는 방법입니다.
일단, PC에서 테스트 해 보니까 되기는 됩니다만.... 뭔가 아니다 싶어서 질문 올립니다.
1. 이번 경우처럼, 하나의 디바이스 드라이버 파일에서 /drv/XXX 를 읽어야 할 경우, 보통 어떻게 처리하나요?
2. 1에 더해서, 다른 응용 프로그램(혹은 디바이스 드라이버가 될 수도 있겠죠?) 이 이미 /drv/XXX를 읽고 있을 경우에, /drv/xxx를 통해 발생한 데이터를 제가 만든 디바이스 드라이버 파일에서 조작하고 싶을 때, 어떻게 하면 될까요?
3. 1,2처럼 생각하는 것 자체가 개념없는 건가요? 즉, 일반적으로 디바이스 드라이버는 /drv/xxx 를 오픈한다는 개념이 아닌, 예를들어 메모리 주소값을 넘긴다던가... 뭐 그런식으로 다른 모듈 혹은 응용 프로그램과 데이터를 교환하나요?
4. 처음엔, 당연히 tx, rx 레지스터 값을 읽어서 조작하려 했는데요, 오히려 이렇게 해 버리면 제가 만든 모듈이 rx값을 읽는 순간 rx값이 없어지니까, os를 통해 응용프로그램에 데이터를 전달해 줄 수 없을것이라 생각해서(테스트 해 본건 아닙니다.) 커널의 serial관련 소스를 뒤져 본 겁니다. 근데 잘 모르겠더라구요.
혹시 응용프로그램 레벨에서 open("/dev/ttyS0", ) 하면 어떤 함수가 실행되는지 아시는 분 계신가요?
맨 처음 부분만 알면 어찌어찌 뒤져 나갈 수 있을 것 같은데, 이 맨 처음의 open()부분을 잘 모르겠네요.
질문이 좀 깁니다만... 참고할 만한 사이트나, 검색 키워드나, 아무거나 아시는 분 좀 조언 좀 해 주시면 대단히 감사하겠습니다.
아! 환경은요, 커널 2.6.9 - Host - PC
커널 2.6.12 - Target - ARM
입니다.
그럼..좋은 밤 되세요....
.
.
답변 감사합니다.
결국 개념이 잘 못 되었던 거군요.
이리저리 알아보고는 있는데, 잘 안 되네요.
결국 커널 소스를 수정할 수 밖에 없는 것인지...
근데요. 답변을 읽어보면, 결국 디바이스 드라이버 끼리는 데이터 교환을 못 한다는 이야긴가요? 제가 글을 잘못 읽은 건지요?
App<->Driver 는 put_char이나 Get_char 등등으로 데이터 교환을 하겠죠? 헌데, 만들다 보면 Device Driver끼리도 데이터를 교환해야 할 일이 생길 것 같은데요. 그런 땐 어찌 하나요?
혹시 디바이스 드라이버에서 선언한 전역 변수는 다른 디바이스 드라이버 파일에서도 쓸 수 있는 건가요? 왜냐면 어짜피 전부 커널 영역이기 땜에?
쨌던, 답변 주신 tweedledum 님. 감사드립니다.
덧글 : 혹시 tweedledum님 쌍둥이신가요? 사전 찾아 보니
tweedledum and tweedledee -> 매우 닮은 두 사람[물건] 이라고 나오네요?
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?
.
.
디바이스 드라이버
디바이스 드라이버 수준에서 작업해야하는 특별한 이유가 있습니까?
사용자수준 응용으로도 해결할 수 있을 것 같은데요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
.
.
댓글 달기