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