串口初始化及讀寫

kernel-4.4\drivers\misc\mediatek\uart\uart.c
module_init(mtk_uart_init);
module_exit(mtk_uart_exit);

一、註冊串口設備
mtk_uart_init
[UART0]
mtk_uart_probe
    err = clk_prepare(uart_setting->clk_uart_main);//[name:uart&][UART0][CCF]clk_uart_main:ffffffc01cf2f180
    err = clk_prepare(clk_uart0_dma);//[name:uart&][UART][CCF]clk_uart0_dma:ffffffc01cf2fd80
    set_uart_dma_clk(pdev->id, clk_uart0_dma);//[name:platform_uart&][UART0][CCF]enabled clk_uart_dma:ffffffc01cf2fd80
    set_uart_pinctrl(pdev->id, ppinctrl);//[name:platform_uart&][UART0][CCF]set_uart_pinctrl(0,ffffffc01cf2fc00), UART_NR:2
    pr_debug("[UART%d][PinC]set idx:%d, ppinctrl:%p\n", pdev->id, pdev->id, ppinctrl);//[name:uart&][UART0][PinC]set idx:0, ppinctrl:ffffffc01cf2fc00
    err = uart_add_one_port(&mtk_uart_drv, &uart->port);
        uart_configure_port(drv, state, uport);
            uart_report_port(drv, port);
                printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n",port->dev ? dev_name(port->dev) : "",port->dev ? ": " : "",drv->dev_name,drv->tty_driver->name_base + port->line,address, port->irq, port->uartclk / 16, uart_type(port));//11002000.apuart0: ttyMT0 at MMIO 0x0 (irq = 6, base_baud = 1625000) is a MTK UART

                
                
[    3.338429] -(2)[1:swapper/0]Call trace:
[    3.338443] -(2)[1:swapper/0][<ffffff800808acd0>] dump_backtrace+0x0/0x1d4
[    3.338469] -(2)[1:swapper/0][<ffffff800808affc>] show_stack+0x14/0x1c
[    3.338489] -(2)[1:swapper/0][<ffffff800838011c>] dump_stack+0xa8/0xe0
[    3.338508] -(2)[1:swapper/0][<ffffff8008497258>] mtk_uart_power_up+0xe0/0x220
[    3.338530] -(2)[1:swapper/0][<ffffff80084930ec>] mtk_uart_power_mgnt+0x78/0xd4
[    3.338550] -(2)[1:swapper/0][<ffffff80083e3ebc>] uart_change_pm+0x38/0x48
[    3.338570] -(2)[1:swapper/0][<ffffff80083e60f0>] uart_add_one_port+0x2c0/0x420
[    3.338589] -(2)[1:swapper/0][<ffffff800849410c>] mtk_uart_probe+0x454/0x4cc
[    3.338609] -(2)[1:swapper/0][<ffffff8008425ea0>] platform_drv_probe+0x58/0xa4
[    3.338630] -(2)[1:swapper/0][<ffffff8008423bb4>] driver_probe_device+0x1f0/0x45c
[    3.338649] -(2)[1:swapper/0][<ffffff8008423e8c>] __driver_attach+0x6c/0x98
[    3.338668] -(2)[1:swapper/0][<ffffff80084228f0>] bus_for_each_dev+0x80/0xb0
[    3.338687] -(2)[1:swapper/0][<ffffff8008423530>] driver_attach+0x20/0x28
[    3.338705] -(2)[1:swapper/0][<ffffff800842303c>] bus_add_driver+0x13c/0x24c
[    3.338722] -(2)[1:swapper/0][<ffffff8008424d68>] driver_register+0x94/0xe0
[    3.338740] -(2)[1:swapper/0][<ffffff8008425dbc>] __platform_driver_register+0x48/0x50
[    3.338759] -(2)[1:swapper/0][<ffffff8009466c98>] mtk_uart_init+0x98/0xec
[    3.338778] -(2)[1:swapper/0][<ffffff8008082b68>] do_one_initcall+0xf8/0x1dc
[    3.338797] -(2)[1:swapper/0][<ffffff8009431d74>] kernel_init_freeable+0x204/0x2ec
[    3.338818] -(2)[1:swapper/0][<ffffff8008d27934>] kernel_init+0x14/0x164
[    3.338840] -(2)[1:swapper/0][<ffffff8008085f90>] ret_from_fork+0x10/0x40

            /* Power up port for set_mctrl() */
            uart_change_pm(state, UART_PM_STATE_ON);
                uart_change_pm
                    port->ops->pm(port, pm_state, state->pm_state);//static const struct uart_ops mtk_uart_ops = {.pm = mtk_uart_power_mgnt,};
                        mtk_uart_power_mgnt
                            mtk_uart_power_up(uart);
                                pr_debug("[UART%d][CCF]enabled clk_uart_main:%p\n", uart->nport,
                                    setting->clk_uart_main);

    err = mtk_uart_vfifo_create(uart);//[name:uart&][UART 0] create 
    MSG_RAW("[%2d] %p (%04d) ;\n", idx, vfifo->addr, vfifo->size);//[name:uart&][ 0] ffffff800ae83000 (1024) ;//[name:uart&][ 1] ffffff800ae84000 (1024) ;
    

kernel-4.4\arch\arm64\boot\dts\mediatek\mt6739.dtsi    
    apuart0: apuart0@11002000 {
        cell-index = <0>;
        compatible = "mediatek,mtk-uart";
        reg = <0 0x11002000 0 0x1000>, /* UART0 base. */
            <0 0x11000600 0 0x80>, /* DMA Tx base. */
            <0 0x11000680 0 0x80>; /* DMA Rx base. */
        interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_LOW>;
        clock-frequency = <26000000>;
        clock-div = <1>;
        clocks = <&infracfg_ao CLK_INFRA_UART0>, <&infracfg_ao CLK_INFRA_AP_DMA>;
        clock-names = "uart0-main", "uart-apdma";
    };

    apuart1: apuart1@11003000 {
        cell-index = <1>;
        compatible = "mediatek,mtk-uart";
        reg = <0 0x11003000 0 0x1000>, /* UART1 base. */
            <0 0x11000700 0 0x80>, /* DMA Tx base. */
            <0 0x11000780 0 0x80>; /* DMA Rx base. */
        interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_LOW>;
        clock-frequency = <26000000>;
        clock-div = <1>;
        clocks = <&infracfg_ao CLK_INFRA_UART1>;
        clock-names = "uart1-main";
    };
    
[UART1]    
mtk_uart_probe
    err = clk_prepare(uart_setting->clk_uart_main);//[name:uart&][UART1][CCF]clk_uart_main:ffffffc01cf40900
    err = clk_prepare(clk_uart0_dma);//[name:uart&][UART][CCF]clk_uart0_dma:ffffffc01cf2fd80

[    3.343196]  (2)[1:swapper/0][name:uart&][UART1][CCF]clk_uart_main:ffffffc01cf40900
[    3.343314]  (2)[1:swapper/0][name:platform_uart&][UART1][CCF]set_uart_pinctrl(1,ffffffc01cf40480), UART_NR:2
[    3.343332]  (2)[1:swapper/0][name:uart&][UART1][PinC]set idx:1, ppinctrl:ffffffc01cf40480
[    3.343361]  (2)[1:swapper/0]11003000.apuart1: ttyMT1 at MMIO 0x0 (irq = 7, base_baud = 1625000) is a MTK UART
[    3.343411] -(2)[1:swapper/0]CPU: 2 PID: 1 Comm: swapper/0 Tainted: G        W       4.4.22 #10
[    3.343431] -(2)[1:swapper/0]Hardware name: MT6739CW (DT)
[    3.343447] -(2)[1:swapper/0]Call trace:
[    3.343461] -(2)[1:swapper/0][<ffffff800808acd0>] dump_backtrace+0x0/0x1d4
[    3.343487] -(2)[1:swapper/0][<ffffff800808affc>] show_stack+0x14/0x1c
[    3.343507] -(2)[1:swapper/0][<ffffff800838011c>] dump_stack+0xa8/0xe0
[    3.343526] -(2)[1:swapper/0][<ffffff8008497258>] mtk_uart_power_up+0xe0/0x220
[    3.343548] -(2)[1:swapper/0][<ffffff80084930ec>] mtk_uart_power_mgnt+0x78/0xd4
[    3.343567] -(2)[1:swapper/0][<ffffff80083e3ebc>] uart_change_pm+0x38/0x48
[    3.343589] -(2)[1:swapper/0][<ffffff80083e60f0>] uart_add_one_port+0x2c0/0x420
[    3.343606] -(2)[1:swapper/0][<ffffff800849410c>] mtk_uart_probe+0x454/0x4cc
[    3.343626] -(2)[1:swapper/0][<ffffff8008425ea0>] platform_drv_probe+0x58/0xa4
[    3.343647] -(2)[1:swapper/0][<ffffff8008423bb4>] driver_probe_device+0x1f0/0x45c
[    3.343666] -(2)[1:swapper/0][<ffffff8008423e8c>] __driver_attach+0x6c/0x98
[    3.343685] -(2)[1:swapper/0][<ffffff80084228f0>] bus_for_each_dev+0x80/0xb0
[    3.343703] -(2)[1:swapper/0][<ffffff8008423530>] driver_attach+0x20/0x28
[    3.343721] -(2)[1:swapper/0][<ffffff800842303c>] bus_add_driver+0x13c/0x24c
[    3.343739] -(2)[1:swapper/0][<ffffff8008424d68>] driver_register+0x94/0xe0
[    3.343757] -(2)[1:swapper/0][<ffffff8008425dbc>] __platform_driver_register+0x48/0x50
[    3.343776] -(2)[1:swapper/0][<ffffff8009466c98>] mtk_uart_init+0x98/0xec
[    3.343796] -(2)[1:swapper/0][<ffffff8008082b68>] do_one_initcall+0xf8/0x1dc
[    3.343814] -(2)[1:swapper/0][<ffffff8009431d74>] kernel_init_freeable+0x204/0x2ec
[    3.343835] -(2)[1:swapper/0][<ffffff8008d27934>] kernel_init+0x14/0x164
[    3.343857] -(2)[1:swapper/0][<ffffff8008085f90>] ret_from_fork+0x10/0x40
[    3.343877]  (2)[1:swapper/0][name:platform_uart&][UART1][CCF]enabled clk_uart_main:ffffffc01cf40900
[    3.343956]  (2)[1:swapper/0][name:platform_uart&][UART1][CCF]disable clk_uart_main:ffffffc01cf40900
[    3.346960]  (2)[1:swapper/0][name:uart&][UART 1] create
[    3.346980]  (2)[1:swapper/0][name:uart&][UART 1] idx= 2
[    3.347120]  (2)[1:swapper/0][name:uart&][ 2] ffffff800ae85000 (8192) ;
[    3.347138]  (2)[1:swapper/0][name:uart&][UART 1] idx= 3
[    3.347277]  (2)[1:swapper/0][name:uart&][ 3] ffffff800ae87000 (8192) ;
[    3.347295]  (2)[1:swapper/0][name:uart&]

            uart_configure_port
                /*
                 * Power down all ports by default, except the
                 * console if we have one.
                 */
                if (!uart_console(port))
                    uart_change_pm(state, UART_PM_STATE_OFF);//[name:platform_uart&][UART1][CCF]disable clk_uart_main:ffffffc01cf40900
                        port->ops->pm(port, pm_state, state->pm_state);//static const struct uart_ops mtk_uart_ops = {.pm = mtk_uart_power_mgnt,};
                            mtk_uart_power_mgnt
                                mtk_uart_power_down(uart);

二、打開串口0作爲控制檯輸出:    
初始化/dev/console (???dev/ttyMT0)--->(kernel-4.4\arch\arm64\boot\dts\mediatek\jmgo_c50.dts: bootargs = "console=tty0 console=ttyMT0,921600n1)

[    7.399655]  (2)[1:swapper/0][name:platform_uart&][UART0] mtk_uart_enable_sleep
[    7.399688] -(2)[1:swapper/0]CPU: 2 PID: 1 Comm: swapper/0 Tainted: G        W       4.4.22 #10
[    7.399711] -(2)[1:swapper/0]Hardware name: MT6739CW (DT)
[    7.399727] -(2)[1:swapper/0]Call trace:
[    7.399741] -(2)[1:swapper/0][<ffffff800808acd0>] dump_backtrace+0x0/0x1d4
[    7.399767] -(2)[1:swapper/0][<ffffff800808affc>] show_stack+0x14/0x1c
[    7.399786] -(2)[1:swapper/0][<ffffff800838011c>] dump_stack+0xa8/0xe0
[    7.399806] -(2)[1:swapper/0][<ffffff80084987e8>] mtk_uart_enable_sleep+0x40/0x7c
[    7.399826] -(2)[1:swapper/0][<ffffff8008495080>] mtk_uart_startup+0x3d4/0x3f4
[    7.399846] -(2)[1:swapper/0][<ffffff80083e6cc4>] uart_port_startup+0x78/0x140
[    7.399865] -(2)[1:swapper/0][<ffffff80083e7210>] uart_open+0x10c/0x16c
[    7.399883] -(2)[1:swapper/0][<ffffff80083d9de4>] tty_open+0x38c/0x4f0
[    7.399900] -(2)[1:swapper/0][<ffffff800820db74>] chrdev_open+0x148/0x170
[    7.399921] -(2)[1:swapper/0][<ffffff8008207228>] do_dentry_open+0x1dc/0x2e0
[    7.399941] -(2)[1:swapper/0][<ffffff8008208488>] vfs_open+0x6c/0x78
[    7.399959] -(2)[1:swapper/0][<ffffff8008217954>] path_openat+0xa28/0xd70
[    7.399978] -(2)[1:swapper/0][<ffffff8008218afc>] do_filp_open+0x4c/0xac
[    7.399996] -(2)[1:swapper/0][<ffffff8008208844>] do_sys_open+0x174/0x224
[    7.400013] -(2)[1:swapper/0][<ffffff8008208914>] SyS_open+0x20/0x28
[    7.400030] -(2)[1:swapper/0][<ffffff8009431da8>] kernel_init_freeable+0x238/0x2ec
[    7.400052] -(2)[1:swapper/0][<ffffff8008d27934>] kernel_init+0x14/0x164
[    7.400074] -(2)[1:swapper/0][<ffffff8008085f90>] ret_from_fork+0x10/0x40
[    7.400094]  (2)[1:swapper/0][name:platform_uart&]SLEEP_EN = 0x1
[    7.401003] -(2)[1:swapper/0][name:uart&]Linux default SW Flow Control
[    7.403735]  (2)[1:swapper/0][name:page_alloc&]Freeing unused kernel memory: 1420K (ffffff8009431000 - ffffff8009594000)
[    7.403852]  (2)[1:swapper/0][name:bootprof&]BOOTPROF:      7403.851017:Kernel_init_done    

kernel_init_freeable
/* Open the /dev/console on the rootfs, this should never fail */
    if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
    (void)sys_dup(0);    (void)sys_dup(0);//open了/dev/console,在open的時候,會去找進程沒使用的最小文件序號,而當前進程沒有打開任何文件,所以sys_open()的時候肯定會找到0,然後兩次調用sys_dup(0)來複制文件描述符0,複製後的文件描述符肯定是1、2,這樣0、1、2 就建立起來了
            chrdev_open //ret = filp->f_op->open(inode, filp);
                tty_open //retval = tty->ops->open(tty, filp);
                    uart_open ///** Start up the serial port.*/ //retval = uart_startup(tty, state, 0);
                        uart_startup //retval = uart_port_startup(tty, state, init_hw);
                            uart_port_startup//retval = uport->ops->startup(uport);
                                mtk_uart_startup//uart->read_byte = mtk_uart_read_byte; //uart->write_byte = mtk_uart_write_byte; //mtk_uart_enable_sleep(uart);
                                    mtk_uart_enable_sleep //reg_sync_writel(0x1, UART_SLEEP_EN);
                                        

kernel-4.4\drivers\tty\tty_io.c        
static const struct file_operations tty_fops = {
    .llseek        = no_llseek,
    .read        = tty_read,
    .write        = tty_write,
    .poll        = tty_poll,
    .unlocked_ioctl    = tty_ioctl,
    .compat_ioctl    = tty_compat_ioctl,
    .open        = tty_open,
    .release    = tty_release,
    .fasync        = tty_fasync,
};        
        
kernel-4.4\drivers\tty\serial\serial_core.c        
static const struct tty_operations uart_ops = {
    .open        = uart_open,
    .close        = uart_close,
    .write        = uart_write,
    .put_char    = uart_put_char,
    .flush_chars    = uart_flush_chars,
    .write_room    = uart_write_room,
    .chars_in_buffer= uart_chars_in_buffer,
    .flush_buffer    = uart_flush_buffer,
    .ioctl        = uart_ioctl,
    .throttle    = uart_throttle,
    .unthrottle    = uart_unthrottle,
    .send_xchar    = uart_send_xchar,
    .set_termios    = uart_set_termios,
    .set_ldisc    = uart_set_ldisc,
    .stop        = uart_stop,
    .start        = uart_start,
    .hangup        = uart_hangup,
    .break_ctl    = uart_break_ctl,
    .wait_until_sent= uart_wait_until_sent,
#ifdef CONFIG_PROC_FS
    .proc_fops    = &uart_proc_fops,
#endif
    .tiocmget    = uart_tiocmget,
    .tiocmset    = uart_tiocmset,
    .get_icount    = uart_get_icount,
#ifdef CONFIG_CONSOLE_POLL
    .poll_init    = uart_poll_init,
    .poll_get_char    = uart_poll_get_char,
    .poll_put_char    = uart_poll_put_char,
#endif
};
kernel-4.4\drivers\misc\mediatek\uart\uart.c
static const struct uart_ops mtk_uart_ops = {
    .tx_empty = mtk_uart_tx_empty,
    .set_mctrl = mtk_uart_set_mctrl,
    .get_mctrl = mtk_uart_get_mctrl,
    .stop_tx = mtk_uart_stop_tx,
    .start_tx = mtk_uart_start_tx,
    .stop_rx = mtk_uart_stop_rx,
    .send_xchar = mtk_uart_send_xchar,
    .enable_ms = mtk_uart_enable_ms,
    .break_ctl = mtk_uart_break_ctl,
    .startup = mtk_uart_startup,
    .shutdown = mtk_uart_shutdown,
    .flush_buffer = mtk_uart_flush_buffer,
    .set_termios = mtk_uart_set_termios,
    .pm = mtk_uart_power_mgnt,
    .type = mtk_uart_type,
    .release_port = mtk_uart_release_port,
    .request_port = mtk_uart_request_port,
    .config_port = mtk_uart_config_port,
    .verify_port = mtk_uart_verify_port,
    .ioctl = mtk_uart_ioctl,
#ifdef CONFIG_CONSOLE_POLL
    .poll_get_char = mtk_uart_get_poll_char,
    .poll_put_char = mtk_uart_put_poll_char,
#endif
};

三、啓動文件系統init進程(在kernel中通過run_init_process來執行init進程,之後就會進入system/core/init/init.cpp的main函數,這才真正的進入用戶空間)
kernel_init
    ret = run_init_process(ramdisk_execute_command);//log_boot("Kernel_init_done");//[name:bootprof&]BOOTPROF:      7403.851017:Kernel_init_done
        //system\core\init\init.cpp
        //如果現在爲系統啓動的第一階段, 就開始獲取基本的文件系統,我們需要將他們放在一起處理。掛載文件系統到相應的目錄。
        mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
        
        //klog_init();//對klog進行初始化
        selinux_initialize(is_first_stage); //init: init first stage started!//// Set up SELinux, including loading the SELinux policy if we're in the kernel domain.
            ////重新執行init,從kernel domain轉變爲init domain(從內核空間轉換爲用戶空間)
            char* args[] = { path, const_cast<char*>("--second-stage"), nullptr };
            if (execv(path, args) == -1)
            
        restorecon("/dev");//對相關/dev進行重置上下文//init: Running restorecon...
        
        //開始init進程的重頭戲,解析init.rc文件
        parser.ParseConfig("/init.rc");

        //init執行命令觸發器主要分爲early-init,init,late-init,boot等
        am.QueueEventTrigger("early-init");//[name:bootprof&]BOOTPROF:      9544.281176:INIT:early-init //[name:bootprof&]BOOTPROF:     10723.758871:INIT:late-init //[name:bootprof&]BOOTPROF:     10725.625179:INIT:Mount_START
        
        am.QueueBuiltinAction(console_init_action, "console_init");//執行console初始化
                int fd = open(console_name.c_str(), O_RDWR | O_CLOEXEC);//console_name = "/dev/console";
        
        
        
[   10.561786]  (0)[1:init][name:platform_uart&][UART0] mtk_uart_enable_sleep
[   10.561809] -(0)[1:init]CPU: 0 PID: 1 Comm: init Tainted: G        W       4.4.22 #10
[   10.561824] -(0)[1:init]Hardware name: MT6739CW (DT)
[   10.561835] -(0)[1:init]Call trace:
[   10.561844] -(0)[1:init][<ffffff800808acd0>] dump_backtrace+0x0/0x1d4
[   10.561863] -(0)[1:init][<ffffff800808affc>] show_stack+0x14/0x1c
[   10.561876] -(0)[1:init][<ffffff800838011c>] dump_stack+0xa8/0xe0
[   10.561889] -(0)[1:init][<ffffff80084987e8>] mtk_uart_enable_sleep+0x40/0x7c
[   10.561903] -(0)[1:init][<ffffff8008495080>] mtk_uart_startup+0x3d4/0x3f4
[   10.561917] -(0)[1:init][<ffffff80083e6cc4>] uart_port_startup+0x78/0x140
[   10.561930] -(0)[1:init][<ffffff80083e7210>] uart_open+0x10c/0x16c
[   10.561941] -(0)[1:init][<ffffff80083d9de4>] tty_open+0x38c/0x4f0
[   10.561954] -(0)[1:init][<ffffff800820db74>] chrdev_open+0x148/0x170
[   10.561967] -(0)[1:init][<ffffff8008207228>] do_dentry_open+0x1dc/0x2e0
[   10.561981] -(0)[1:init][<ffffff8008208488>] vfs_open+0x6c/0x78
[   10.561993] -(0)[1:init][<ffffff8008217954>] path_openat+0xa28/0xd70
[   10.562006] -(0)[1:init][<ffffff8008218afc>] do_filp_open+0x4c/0xac
[   10.562018] -(0)[1:init][<ffffff8008208844>] do_sys_open+0x174/0x224
[   10.562029] -(0)[1:init][<ffffff800820892c>] SyS_openat+0x10/0x18
[   10.562041] -(0)[1:init][<ffffff8008085ff0>] el0_svc_naked+0x24/0x28
[   10.562055]  (0)[1:init][name:platform_uart&]SLEEP_EN = 0x1
[   10.562087] -(0)[1:init][name:uart&]Linux default SW Flow Control

// el0_sync是用戶態發生異常的入口,el0_irq是用戶態發生中斷的的入口。
    // 異常包括幾種:系統調用el0_svc、數據異常el0_da、指令異常el0_ia等等幾種。

        service console /system/bin/sh
        class core
        console
        disabled
        user shell
        group shell log readproc
        seclabel u:r:shell:s0
        
        上面內核初始化時已經將console定義爲輸入、輸出口,所以sh調用shell應該會打開控制檯--即串口0輸出

[   17.511156]  (1)[1:init]init: Starting service 'console'...
[   17.518823]  (1)[1:init]init: Starting service 'atci_service'...
[   17.524829]  (1)[316:init][name:platform_uart&][UART0] mtk_uart_enable_sleep
[   17.524861] -(1)[316:init]CPU: 1 PID: 316 Comm: init Tainted: G        W  O    4.4.22 #10
[   17.524882] -(1)[316:init]Hardware name: MT6739CW (DT)
[   17.524897] -(1)[316:init]Call trace:
[   17.524909] -(1)[316:init][<ffffff800808acd0>] dump_backtrace+0x0/0x1d4
[   17.524932] -(1)[316:init][<ffffff800808affc>] show_stack+0x14/0x1c
[   17.524949] -(1)[316:init][<ffffff800838011c>] dump_stack+0xa8/0xe0
[   17.524966] -(1)[316:init][<ffffff80084987e8>] mtk_uart_enable_sleep+0x40/0x7c
[   17.524984] -(1)[316:init][<ffffff8008495080>] mtk_uart_startup+0x3d4/0x3f4
[   17.525001] -(1)[316:init][<ffffff80083e6cc4>] uart_port_startup+0x78/0x140
[   17.525018] -(1)[316:init][<ffffff80083e7210>] uart_open+0x10c/0x16c
[   17.525033] -(1)[316:init][<ffffff80083d9de4>] tty_open+0x38c/0x4f0
[   17.525049] -(1)[316:init][<ffffff800820db74>] chrdev_open+0x148/0x170
[   17.525067] -(1)[316:init][<ffffff8008207228>] do_dentry_open+0x1dc/0x2e0
[   17.525086] -(1)[316:init][<ffffff8008208488>] vfs_open+0x6c/0x78
[   17.525102] -(1)[316:init][<ffffff8008217954>] path_openat+0xa28/0xd70
[   17.525119] -(1)[316:init][<ffffff8008218afc>] do_filp_open+0x4c/0xac
[   17.525135] -(1)[316:init][<ffffff8008208844>] do_sys_open+0x174/0x224
[   17.525150] -(1)[316:init][<ffffff800820892c>] SyS_openat+0x10/0x18
[   17.525165] -(1)[316:init][<ffffff8008085ff0>] el0_svc_naked+0x24/0x28
[   17.525243]  (1)[316:init][name:platform_uart&]SLEEP_EN = 0x1
[   17.525289] -(1)[316:init][name:uart&]Linux default SW Flow Control        


四、讀寫串口

static void mtk_uart_rx_handler(struct mtk_uart *uart, int intrs)
{
    if(uart->nport == 1)pr_debug("[UART%d] mtk_uart_rx_handler\n", uart->nport);
    if (uart->rx_mode == UART_NON_DMA) {
        mtk_uart_rx_chars(uart);
    } else if (uart->rx_mode == UART_RX_VFIFO_DMA) {
#if defined(ENABLE_VFIFO)
        mtk_uart_rx_pre_handler(uart, intrs);
        mtk_uart_dma_vfifo_rx_tasklet((unsigned long)uart);
#endif
    }
}

uart->rx_mode == UART_NON_DMA

ret = request_irq(port->irq, (irq_handler_t) mtk_uart_irq, uart->setting->irq_flags, DRV_NAME, uart);

mtk_uart_irq//串口中斷
    mtk_uart_tx_handler
        mtk_uart_tx_chars(uart);
            uart->write_byte(uart, xmit->buf[xmit->tail]);//uart->write_byte = mtk_uart_write_byte;
                mtk_uart_write_byte
                    reg_sync_writel(byte, UART_THR);
mtk_uart_irq//串口中斷            
    mtk_uart_rx_handler
        mtk_uart_rx_chars(uart);
            data_byte = uart->read_byte(uart);//uart->read_byte = mtk_uart_read_byte;
                mtk_uart_read_byte
                    return UART_READ32(UART_RBR);

kernel-4.4\drivers\misc\mediatek\uart\uart.c                
mtk_uart_startup
    ret = request_irq(port->irq, (irq_handler_t) mtk_uart_irq, uart->setting->irq_flags, DRV_NAME, uart);//註冊串口中斷號
                
[  121.792308] -(1)[578:logd.reader.per][name:uart&][UART1] mtk_uart_tx_handler
[  121.792330] -(1)[578:logd.reader.per][name:uart&][UART1] mtk_uart_tx_chars
[  121.792348] -(1)[578:logd.reader.per][name:platform_uart&][UART1] mtk_uart_write_byte = 2
[  121.792368] -(1)[578:logd.reader.per][name:uart&][UART1] mtk_uart_rx_handler
[  121.792383] -(1)[578:logd.reader.per][name:uart&][UART1] mtk_uart_rx_chars
[  121.793783] -(2)[313:servicemanager][name:uart&][UART1] mtk_uart_rx_handler
[  121.793812] -(2)[313:servicemanager][name:uart&][UART1] mtk_uart_rx_chars
[  121.793830] -(2)[313:servicemanager][name:platform_uart&][UART1] mtk_uart_read_byte

五、設置波特率
kernel-4.4\drivers\tty\serial\serial_core.c
kernel-4.4/drivers/misc/mediatek/uart/uart.c:956:    ret = uart_set_options(port, co, baud, parity, bits, flow);
uart_set_options //uart_set_options - setup the serial console parameters

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章