Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92
RK的调试串口使用的是另外一套方法(后面再提), 这里的流程针对普通的串口.
相关文件:
rk_serial.c: rk uart驱动文件.
serial_core.c: 核心层文件, 通过它调用到具体的设备驱动文件.
tty_io.c: 字符设备操作相关,上层和它打交道.
tty_port.c: 每个串口设备用
proc_tty.c: proc文件系统下创建tty相关文件.
n_tty.c: 上层read/write需要经过line discipline, 通俗理解就是读写要经过解析,比如n,r,t这些特殊字符.
借用别人画的图,方便理解串口驱动的框架:
初始化:
serial_rk_init ->
uart_register_driver -> serial_core.c //注册uart driver到系统中,参数是serial_rk_reg
alloc_tty_driver tty_driver.h //分配一个tty driver
tty_set_operations tty_io.c //设置tyy driver的ops为struct tty_operations uart_ops 后面在使用的时候会看到.
tty_port_init //一个串口端口对应一个port,这里总共UART_NR,即8.
tty_register_driver -> tty_io.c //注册uart驱动为一个标准字符设备,设备名字serial_rk_reg中定义,即ttySx, x根据
alloc_chrdev_region
tty_cdev_add ->
cdev_init //说了这么多主要是看这里的字符设备对应的struct file_operations, 即tty_fops,后面操作会用到.
cdev_add
proc_tty_register_driver //proc文件系统下也注册相应文件,比如可以通过/proc/tty/driver查看driver信息.
platform_driver_register -> //根据驱动到设备模型中, platform driver是serial_rk_driver.
serial_rk_probe -> //获取io相关资源,irq信息,解析dts等.
of_rk_serial_parse_dt //解析dts中uart配置
uart_add_one_port
上层调用, 举例write()
write -> 用户空间发送字符串
SyS_write ->
vfs_write ->
tty_write -> tty_io.c
do_tty_write ->
write ->
ld->ops->write ->
n_tty_write -> n_tty.c
process_output ->
do_output_char ->
tty->ops->write ->
uart_write -> serial_core.c
uart_start ->
__uart_start ->
port->ops->start_tx //串口设备用端口表示,调用对应具体的驱动发送函数.
serial_rk_start_tx ->
serial_rk_enable_ier_thri ->
serial_out //最终输出到硬件串口.
Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92
RK的调试串口使用的是另外一套方法(后面再提), 这里的流程针对普通的串口.
相关文件:
rk_serial.c: rk uart驱动文件.
serial_core.c: 核心层文件, 通过它调用到具体的设备驱动文件.
tty_io.c: 字符设备操作相关,上层和它打交道.
tty_port.c: 每个串口设备用
proc_tty.c: proc文件系统下创建tty相关文件.
n_tty.c: 上层read/write需要经过line discipline, 通俗理解就是读写要经过解析,比如n,r,t这些特殊字符.
借用别人画的图,方便理解串口驱动的框架:
初始化:
serial_rk_init ->
uart_register_driver -> serial_core.c //注册uart driver到系统中,参数是serial_rk_reg
alloc_tty_driver tty_driver.h //分配一个tty driver
tty_set_operations tty_io.c //设置tyy driver的ops为struct tty_operations uart_ops 后面在使用的时候会看到.
tty_port_init //一个串口端口对应一个port,这里总共UART_NR,即8.
tty_register_driver -> tty_io.c //注册uart驱动为一个标准字符设备,设备名字serial_rk_reg中定义,即ttySx, x根据
alloc_chrdev_region
tty_cdev_add ->
cdev_init //说了这么多主要是看这里的字符设备对应的struct file_operations, 即tty_fops,后面操作会用到.
cdev_add
proc_tty_register_driver //proc文件系统下也注册相应文件,比如可以通过/proc/tty/driver查看driver信息.
platform_driver_register -> //根据驱动到设备模型中, platform driver是serial_rk_driver.
serial_rk_probe -> //获取io相关资源,irq信息,解析dts等.
of_rk_serial_parse_dt //解析dts中uart配置
uart_add_one_port
上层调用, 举例write()
write -> 用户空间发送字符串
SyS_write ->
vfs_write ->
tty_write -> tty_io.c
do_tty_write ->
write ->
ld->ops->write ->
n_tty_write -> n_tty.c
process_output ->
do_output_char ->
tty->ops->write ->
uart_write -> serial_core.c
uart_start ->
__uart_start ->
port->ops->start_tx //串口设备用端口表示,调用对应具体的驱动发送函数.
serial_rk_start_tx ->
serial_rk_enable_ier_thri ->
serial_out //最终输出到硬件串口.
举报