시리얼 통신 관련 인터럽트 질문입니다.

cococo의 이미지

안녕하십니까. 여러 가지 삽질하다 글 올려 봅니다.

현재 요구사항이... 일종의 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
입니다.

그럼..좋은 밤 되세요....

tweedledum의 이미지

.

cococo의 이미지

결국 개념이 잘 못 되었던 거군요.
이리저리 알아보고는 있는데, 잘 안 되네요.
결국 커널 소스를 수정할 수 밖에 없는 것인지...

근데요. 답변을 읽어보면, 결국 디바이스 드라이버 끼리는 데이터 교환을 못 한다는 이야긴가요? 제가 글을 잘못 읽은 건지요?

App<->Driver 는 put_char이나 Get_char 등등으로 데이터 교환을 하겠죠? 헌데, 만들다 보면 Device Driver끼리도 데이터를 교환해야 할 일이 생길 것 같은데요. 그런 땐 어찌 하나요?
혹시 디바이스 드라이버에서 선언한 전역 변수는 다른 디바이스 드라이버 파일에서도 쓸 수 있는 건가요? 왜냐면 어짜피 전부 커널 영역이기 땜에?

쨌던, 답변 주신 tweedledum 님. 감사드립니다.

덧글 : 혹시 tweedledum님 쌍둥이신가요? 사전 찾아 보니
tweedledum and tweedledee -> 매우 닮은 두 사람[물건] 이라고 나오네요?

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

tweedledum의 이미지

.

mach의 이미지

디바이스 드라이버 수준에서 작업해야하는 특별한 이유가 있습니까?
사용자수준 응용으로도 해결할 수 있을 것 같은데요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

tweedledum의 이미지

.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.