ARM - Linux s3c 2440 의 UART 분석 (2)

= = = = 본문 과 본 사이트 의 오리지널, 전재 환영 합 니 다! 전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/yyplc====
본문 은 itspy 오리지널, 복사 / 전재 가능 한 한 원 출처 를 표시 해 주 십시오.http://blog.csdn.net/yyplc/article/details/7196290감사합니다!
소프트웨어 편 (linux - 2.6.30.4):
Linux 시스템 의 직렬 구동 은 일반 문자 장치 와 마찬가지 로 차원 화 된 구 조 를 사용 하여 직렬 시스템 으로 간주 된다.
(1)      UART 나 다른 바 텀 직렬 하드웨어 특징 을 주목 하 는 바 텀 드라이버.
(2)      바 텀 드라이버 인터페이스 와 의 TTY 드라이버.
(3)      TTY 드라이버 와 데 이 터 를 교환 하 는 데 사용 되 는 선로 규정 을 가공 합 니 다.
다음 그림 은 직렬 시스템 간 의 차원 구조 관계 (s3c 2440 직렬 구현 예) 를 묘 사 했 는데 다음 과 같이 요약 할 수 있다. 사용자 응용 층 - > 라인 계획 층 - > TTY 층 -- > 하부 구동 층 -- > 물리 하드웨어 계층
  ARM-Linux s3c2440 之UART分析(二)_第1张图片
선로 규정 과 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 의 실현 을 논의 할 것 이다.

좋은 웹페이지 즐겨찾기