瑞芯微Rockchip开发者社区
直播中

骨灰级发烧友

11年用户 673经验值
私信 关注
[问答]

RK3288系统的调试串口流程是怎样的

RK3288系统的调试串口流程是怎样的?如何对RK3288系统的串口进行初始化呢?

回帖(1)

冯超

2022-3-10 13:37:47
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    //最终输出到硬件串口.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分