Linux串口大致过程

drivers\tty\serial\imx.c

#define SERIAL_IMX_MAJOR 207
#define MINOR_START  16
#define DEV_NAME  "ttymxc"

/*
 * This determines how often we check the modem status signals
 * for any change.  They generally aren't connected to an IRQ
 * so we have to poll them.  We also check immediately before
 * filling the TX fifo incase CTS has been dropped.
 */
#define MCTRL_TIMEOUT (250*HZ/1000)

#define DRIVER_NAME "IMX-uart"

#define UART_NR 8

static struct imx_port *imx_ports[UART_NR];

static struct uart_driver imx_reg = {
 .owner          = THIS_MODULE,
 .driver_name    = DRIVER_NAME,
 .dev_name       = DEV_NAME,
 .major          = SERIAL_IMX_MAJOR,
 .minor          = MINOR_START,
 .nr             = ARRAY_SIZE(imx_ports),
 .cons           = IMX_CONSOLE,
};

static struct platform_driver serial_imx_driver = {
 .probe  = serial_imx_probe,
 .remove  = serial_imx_remove,

 .suspend = serial_imx_suspend,
 .resume  = serial_imx_resume,
 .id_table = imx_uart_devtype,
 .driver  = {
  .name = "imx-uart",
  .of_match_table = imx_uart_dt_ids,
 },
};

static struct uart_ops imx_pops = {
 .tx_empty = imx_tx_empty,
 .set_mctrl = imx_set_mctrl,//设置串口modem控制模式
 .get_mctrl = imx_get_mctrl,//获取串口modem控制模式
 .stop_tx = imx_stop_tx,//停止发送
 .start_tx = imx_start_tx,//开始发送
 .stop_rx = imx_stop_rx,//停止接收
 .enable_ms = imx_enable_ms,//使能modem状态信息
 .break_ctl = imx_break_ctl,
 .startup = imx_startup,//打开串口
 .shutdown = imx_shutdown,//关闭串口
 .flush_buffer = imx_flush_buffer,
 .set_termios = imx_set_termios,//设置串口参数
 .type  = imx_type,//io访问类型
 .config_port = imx_config_port,//配置端口
 .verify_port = imx_verify_port,//校验端口
#if defined(CONFIG_CONSOLE_POLL)
 .poll_init      = imx_poll_init,
 .poll_get_char  = imx_poll_get_char,
 .poll_put_char  = imx_poll_put_char,
#endif
};

imx_serial_init
 uart_register_driver(&imx_reg);-------------------------------> uart_register_driver
 platform_driver_register(&serial_imx_driver);


///
struct uart_state {
 struct tty_port  port;

 enum uart_pm_state pm_state;
 struct circ_buf  xmit;

 struct uart_port *uart_port;
};

///
struct ktermios tty_std_termios = { /* for the benefit of tty drivers  */
 .c_iflag = ICRNL | IXON,
 .c_oflag = OPOST | ONLCR,
 .c_cflag = B38400 | CS8 | CREAD | HUPCL,
 .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
     ECHOCTL | ECHOKE | IEXTEN,
 .c_cc = INIT_C_CC,
 .c_ispeed = 38400,
 .c_ospeed = 38400
};


// drivers\tty\serial\serial_core.c
int uart_register_driver(struct uart_driver *drv)
 struct tty_driver *normal;
 drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);// 分配8个struct uart_state
 normal = alloc_tty_driver(drv->nr);// drv->nr = 8
    struct tty_driver *ret = tty_alloc_driver(lines, 0);// struct tty_driver,分配lines = 8
           __tty_alloc_driver(lines, THIS_MODULE, flags)// lines = 8 flags=0
            struct tty_driver *driver;
             driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL);
             if (!(flags & TTY_DRIVER_DEVPTS_MEM)) {
              driver->ttys = kcalloc(lines, sizeof(*driver->ttys), GFP_KERNEL);// 分配struct tty_struct **ttys;
              driver->termios = kcalloc(lines, sizeof(*driver->termios), GFP_KERNEL);// 分配struct ktermios **termios;
             }
             if (!(flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
              driver-

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值