2011-05-09 4 views
2

RS232 시리얼을 통해 내 리눅스 박스에서 마이크로 컨트롤러와 인터페이스를 시도하고 있습니다.드라이버 내부에서 드라이버를 사용하는 리눅스

필자는 드라이버를 작성하고 모듈로 커널에 이미있는 tty (/ dev/ttyS0) 장치를 사용하는 프로토콜 b/n pc 및 마이크로 컨트롤러를 구현했습니다 (예 : 열기, 닫기 등을 통해).). 그러나 컴파일하려고하면 열기, 쓰기, 읽기 등의 참조를 찾을 수 없다고 말합니다.

드라이버 내에서 기존 장치 드라이버를 사용하려면 어떻게해야합니까? 내가 포함시켜야 할 다른 것이 있습니까?

그렇지 않은 경우 어떻게하면 드라이버에서 직렬 포트를 쉽게 사용할 수 있습니까?

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/fs.h> 
#include <linux/uaccess.h> 
#include <linux/init.h> 
#include <linux/slab.h> 
#include <linux/cdev.h> 
#include <linux/spinlock.h> 
#include <linux/termios.h> 
#include <linux/fcntl.h> 
#include <linux/unistd.h> 

답변

0

일반적으로 사용자 공간에서 이러한 작업을 수행해야합니다. 정상적인 사용자 공간 프로그램에서 장치의 프로토콜을 구현하십시오.

커널에서는 이러한 일을 할 수는 있지만 가능하지는 않습니다. 예를 들어, ppp 드라이버는 직렬 드라이버 위에 네트워크 드라이버를 구현합니다. 나는 그것이 어떻게 작동하는지 모르지만 사용자 공간 도우미 프로그램이 장치를 열고, 매개 변수 등을 초기화 한 다음, 일부 시스템 호출을 사용하여 커널에 파일 설명자를 전달합니다.

커널 또는 사실상 모든 라이브러리 함수 (실제로 커널의 일부로 제공되는 라이브러리 제외)에서 임의 라이브러리 함수를 호출 할 수 없습니다. 여기에는 커널 시스템 호출이 포함됩니다. 호출 할 수있는 기능이 있습니다 (예 : filp_open).

대부분의 경우 사용자 공간 데이터를 가리키는 포인터를 기대하기 때문에 커널에서 정상적인 시스템 호출 만 할 수는 없지만 커널 (kalloc 등을 통해 할당 됨)은 일반적으로 커널 공간 데이터를 가리 킵니다. 둘은 자유롭게 혼합 될 수 없다.

+0

PPP 드라이버는 특정 ttyS ... 특정 마술 인 소위 "직렬 회선 제어"를 사용하여이를 수행합니다. 기술적으로는 커널 컨텍스트에서 fds를 열고 syscall을 수행 할 수 있습니다. 그런데 왜 그런 짓을 한거야? – datenwolf

관련 문제