ARM - Linux s3c 2440 의 UART 분석 (2)
본문 은 itspy 오리지널, 복사 / 전재 가능 한 한 원 출처 를 표시 해 주 십시오.http://blog.csdn.net/yyplc/article/details/7196290감사합니다!
소프트웨어 편 (linux - 2.6.30.4):
Linux 시스템 의 직렬 구동 은 일반 문자 장치 와 마찬가지 로 차원 화 된 구 조 를 사용 하여 직렬 시스템 으로 간주 된다.
(1) UART 나 다른 바 텀 직렬 하드웨어 특징 을 주목 하 는 바 텀 드라이버.
(2) 바 텀 드라이버 인터페이스 와 의 TTY 드라이버.
(3) TTY 드라이버 와 데 이 터 를 교환 하 는 데 사용 되 는 선로 규정 을 가공 합 니 다.
다음 그림 은 직렬 시스템 간 의 차원 구조 관계 (s3c 2440 직렬 구현 예) 를 묘 사 했 는데 다음 과 같이 요약 할 수 있다. 사용자 응용 층 - > 라인 계획 층 - > TTY 층 -- > 하부 구동 층 -- > 물리 하드웨어 계층
선로 규정 과 TTY 드라이버 는 하드웨어 플랫폼 과 무관 하 다. Linux 소스 코드 에서 이미 실현 을 제 공 했 기 때문에 구체 적 인 플랫폼 에 대해 우 리 는 바 텀 드라이버 만 실현 하면 된다. 이것 도 우리 가 가장 관심 을 가 지 는 것 이다.s3c2440a 에 서 는 주로 dirivers / serial / 하의 s3c2440. c 와 samsung. c 로 이 루어 집 니 다.
Uart 드라이버 는 주로 세 가지 관건 적 인 데이터 구 조 를 중심 으로 전개 된다 (include / linux / serial core. h 에서 정의).
UART 특정한 드라이버 구조 정의: struct urtdriver s3c24xx_uart_drv;
UART 포트 구조 정의: struct uartport s3c24xx_serial_ops;
UART 관련 조작 함수 구조 정의: struct uartops s3c24xx_serial_ops;
상기 세 개의 구조 체 를 바탕 으로 s3c 2440 이 Linux 의 직렬 구 조 를 어떻게 연결 하 는 지 살 펴 보 겠 습 니 다.
S3c 2440 직렬 관련 조작 함수 정의 s3c24xxserial_ops 에서 이것 은 structuart 입 니 다.ops 구조
static struct uart_ops s3c24xx_serial_ops ={
.pm =s3c24xx_serial_pm, //
.tx_empty = s3c24xx_serial_tx_empty, // FIFO
.get_mctrl = s3c24xx_serial_get_mctrl, //
.set_mctrl = s3c24xx_serial_set_mctrl, // cts
.stop_tx =s3c24xx_serial_stop_tx, //
.start_tx =s3c24xx_serial_start_tx, //
.stop_rx =s3c24xx_serial_stop_rx, //
.enable_ms = s3c24xx_serial_enable_ms, //
.break_ctl = s3c24xx_serial_break_ctl, // break
.startup =s3c24xx_serial_startup, // / ,
.shutdown = s3c24xx_serial_shutdown, //
.set_termios = s3c24xx_serial_set_termios,// clk, ,
.type = s3c24xx_serial_type, // CPU
.release_port =s3c24xx_serial_release_port, //
.request_port =s3c24xx_serial_request_port, //
.config_port = s3c24xx_serial_config_port, // info
.verify_port = s3c24xx_serial_verify_port, //
};
드라이버 구조 정의:
static struct uart_driver s3c24xx_uart_drv= {
.owner =THIS_MODULE,
.dev_name = "s3c2440_serial", //
.nr =CONFIG_SERIAL_SAMSUNG_UARTS, //
.cons = S3C24XX_SERIAL_CONSOLE, //console
.driver_name =S3C24XX_SERIAL_NAME, // :ttySAC
.major =S3C24XX_SERIAL_MAJOR, //
.minor =S3C24XX_SERIAL_MINOR, //
};
포트 구성 구조 정의, structuart 포함ports 구조:
struct s3c24xx_uart_port {
unsignedchar rx_claimed;
unsignedchar tx_claimed;
unsignedint pm_level;
unsignedlong baudclk_rate;
unsignedint rx_irq;
unsignedint tx_irq;
structs3c24xx_uart_info *info;
structs3c24xx_uart_clksrc *clksrc;
structclk *clk;
structclk *baudclk;
structuart_port port;
#ifdef CONFIG_CPU_FREQ
structnotifier_block freq_transition;
#endif
};
static structs3c24xx_uart_ports3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS] = {
[0]= { // 0
.port= {
.lock =__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[0].port.lock),
.iotype =UPIO_MEM, //
.irq =IRQ_S3CUART_RX0, //
.uartclk = 0, //
.fifosize = 16, // FIFO
.ops = &s3c24xx_serial_ops, //
.flags = UPF_BOOT_AUTOCONF,
.line = 0, // 1
}
},
[1]= {// 1
.port= {
.lock =__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[1].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_S3CUART_RX1,
.uartclk = 0,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.flags = UPF_BOOT_AUTOCONF,
.line = 1,
}
},
#if CONFIG_SERIAL_SAMSUNG_UARTS > 2
[2]= {// 2
.port= {
.lock =__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[2].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_S3CUART_RX2,
.uartclk = 0,
.fifosize = 16,
.ops =&s3c24xx_serial_ops,
.flags = UPF_BOOT_AUTOCONF,
.line = 2,
}
},
#endif
};
다시 말하자면 s3c 2440 은 주로 이 세 가지 데이터 구 조 를 실현 하 는 것 이다.
s3c24xx_serial_ops, s3c24xx_uart_drv, s3c24xx_uart_ports3c24xx_serial_ports
다음은 소스 코드 와 결합 하여 ARM - Linuxs3c 2440 의 실현 을 논의 할 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.