您的位置:首页 > 运维架构 > 网站架构

ARM架构处理器MT6572的LK(可以理解为UBOOT)uart串口驱动分析【代码注释】

2013-11-23 10:57 555 查看
提示:

分析注释的部分,一般都会字体加粗或设置为红色字体。



本文包含如下代码:

mediatek/platform/mt6572/lk/platform.c

mediatek/platform/mt6572/lk/include/platform/mt_uart.h

[b]mediatek/platform/mt6572/lk/uart.c[/b]



相关的寄存器资料请参考:


MT6572 的UART串口寄存器DATASHEET http://blog.csdn.net/duanlove/article/details/16862901

串口的使用过程:

1. 串口初始化,配置好波特率、工作模式及相关初始化寄存器。

2. 把需要发送的字符写入到串口发送寄存器。或者把串口接收寄存器里的东西读出来。



LK中的printf 就使用了 UART来发送我们程序中打印的log到串口。这样我们可以通过串口终端来查看 lk打印的log。

关于printf的细节请参考:

MT6572的LK printf 与UART串口打印 /article/1917763.html



platform_early_init 函数是 MT6572平台 必须经过的一个初始化函数。

系统开机从preload预加载开始执行,然后把参数传入LK,并进入LK(类似于uboot),进行相应的初始化。串口的初始化便是在platform_early_init 函数里执行的。



在lk的 mediatek/platform/mt6572/lk/platform.c 里的 platform_early_init 函数中进行了串口的初始化。

void platform_early_init(void)

{

#ifdef LK_PROFILING

unsigned int time_led_init;

unsigned int time_pmic6329_init;

unsigned int time_i2c_init;

unsigned int time_disp_init;

unsigned int time_platform_early_init;

unsigned int time_set_clock;

unsigned int time_disp_preinit;

unsigned int time_misc_init;

unsigned int time_clock_init;

unsigned int time_wdt_init;

time_platform_early_init = get_timer(0);

time_set_clock = get_timer(0);

#endif

//mt_gpio_set_default();

//Specific for MT6572. ARMPLL can't set to max speed when L2 is configured as SRAM.

//preloader won't reach max speed. It will done by LK.

if (g_boot_arg->boot_mode != DOWNLOAD_BOOT)

{

mtk_set_arm_clock();

}

/* initialize the uart */

uart_init_early();

printf("arm clock set finished\n");

//printf实际上调用了串口发送的函数。具体请参考MT6572的LK printf 与UART串口打印

printf("[b]uart_init_early init finished\n");

[/b]

………………

}



uart_init_early() 函数的实现具体请看[b]mediatek/platform/mt6572/lk/uart.c[/b]



/*

filename: mediatek/platform/mt6572/lk/uart.c

* Copyright (c) 2008 Travis Geiselbrecht

*

* Permission is hereby granted, free of charge, to any person obtaining

* a copy of this software and associated documentation files

* (the "Software"), to deal in the Software without restriction,

* including without limitation the rights to use, copy, modify, merge,

* publish, distribute, sublicense, and/or sell copies of the Software,

* and to permit persons to whom the Software is furnished to do so,

* subject to the following conditions:

*

* The above copyright notice and this permission notice shall be

* included in all copies or substantial portions of the Software.

*

* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF

* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY

* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,

* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE

* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*/

#include <debug.h>

#include <reg.h>

#include <dev/uart.h>

#include <platform/mt_typedefs.h>

#include <platform/mt_reg_base.h>

#include <platform/mt_uart.h>

#include <platform/boot_mode.h>

#include <platform/mt_gpio.h>

#include <platform/sync_write.h>

#define CONFIG_BAUDRATE 921600

#define UART_SET_BITS(BS,REG) mt65xx_reg_sync_writel(DRV_Reg32(REG) | (u32)(BS), REG)

#define UART_CLR_BITS(BS,REG) mt65xx_reg_sync_writel(DRV_Reg32(REG) & ~((u32)(BS)), REG)

#define UART_BASE(uart) (uart)

#define UART_RBR(uart) (UART_BASE(uart)+0x0) /* Read only */

#define UART_THR(uart) (UART_BASE(uart)+0x0) /* Write only */

#define UART_IER(uart) (UART_BASE(uart)+0x4)

#define UART_IIR(uart) (UART_BASE(uart)+0x8) /* Read only */

#define UART_FCR(uart) (UART_BASE(uart)+0x8) /* Write only */

#define UART_LCR(uart) (UART_BASE(uart)+0xc)

#define UART_MCR(uart) (UART_BASE(uart)+0x10)

#define UART_LSR(uart) (UART_BASE(uart)+0x14)

#define UART_MSR(uart) (UART_BASE(uart)+0x18)

#define UART_SCR(uart) (UART_BASE(uart)+0x1c)

#define UART_DLL(uart) (UART_BASE(uart)+0x0) /* Only when LCR.DLAB = 1 */

#define UART_DLH(uart) (UART_BASE(uart)+0x4) /* Only when LCR.DLAB = 1 */

#define UART_EFR(uart) (UART_BASE(uart)+0x8) /* Only when LCR = 0xbf */

#define UART_XON1(uart) (UART_BASE(uart)+0x10) /* Only when LCR = 0xbf */

#define UART_XON2(uart) (UART_BASE(uart)+0x14) /* Only when LCR = 0xbf */

#define UART_XOFF1(uart) (UART_BASE(uart)+0x18) /* Only when LCR = 0xbf */

#define UART_XOFF2(uart) (UART_BASE(uart)+0x1c) /* Only when LCR = 0xbf */

#define UART_AUTOBAUD_EN(uart) (UART_BASE(uart)+0x20)

#define UART_HIGHSPEED(uart) (UART_BASE(uart)+0x24)

#define UART_SAMPLE_COUNT(uart) (UART_BASE(uart)+0x28)

#define UART_SAMPLE_POINT(uart) (UART_BASE(uart)+0x2c)

#define UART_AUTOBAUD_REG(uart) (UART_BASE(uart)+0x30)

#define UART_RATE_FIX_AD(uart) (UART_BASE(uart)+0x34)

#define UART_AUTOBAUD_SAMPLE(uart) (UART_BASE(uart)+0x38)

#define UART_GUARD(uart) (UART_BASE(uart)+0x3c)

#define UART_ESCAPE_DAT(uart) (UART_BASE(uart)+0x40)

#define UART_ESCAPE_EN(uart) (UART_BASE(uart)+0x44)

#define UART_SLEEP_EN(uart) (UART_BASE(uart)+0x48)

#define UART_VFIFO_EN(uart) (UART_BASE(uart)+0x4c)

#define UART_RXTRI_AD(uart) (UART_BASE(uart)+0x50)

//FIXME Disable for MT6572 LK Porting

#ifndef MACH_FPGA

#define __ENABLE_UART_LOG_SWITCH_FEATURE__

#endif

// output uart port

volatile unsigned int g_uart;

// output uart baudrate

unsigned int g_brg;

//extern unsigned int mtk_get_bus_freq(void);

#ifdef MACH_FPGA

#define UART_SRC_CLK 12000000

#else

#define UART_SRC_CLK 26000000

#endif

int mtk_uart_power_on(MTK_UART uart)

{

//FIXME Disable for MT6572 LK Porting

//return 0;

/* UART Powr PDN and Reset*/

//#define AP_PERI_GLOBALCON_RST0 (PERI_CON_BASE+0x0)

#define AP_PERI_GLOBALCON_PDN0 (0x10000084)

if (uart == UART1)

UART_SET_BITS(1 << 10, AP_PERI_GLOBALCON_PDN0); /* Power on UART1 */

else if (uart == UART2)

UART_SET_BITS(1 << 11, AP_PERI_GLOBALCON_PDN0); /* Power on UART2 */

return 0;

}

void uart_setbrg()

{

unsigned int byte,speed;

unsigned int highspeed;

unsigned int quot, divisor, remainder;

unsigned int uartclk;

unsigned short data, high_speed_div, sample_count, sample_point;

unsigned int tmp_div;

speed = g_brg; //921600

////FIXME Disable for MT6572 LK Porting

uartclk = UART_SRC_CLK;

//uartclk = (unsigned int)(mtk_get_bus_freq()*1000/4);

if (speed <= 115200 ) {

highspeed = 0;

quot = 16;

} else {

highspeed = 3;

quot = 1;

}

// 根据串口速率的等级,根据算法,分别设置对应的波特率。相关算法请看另外一篇文章。

if (highspeed < 3) { /*0~2*/

/* Set divisor DLL and DLH */

divisor = uartclk / (quot * speed);

remainder = uartclk % (quot * speed);



if (remainder >= (quot / 2) * speed)

divisor += 1;

mt65xx_reg_sync_writew(highspeed, UART_HIGHSPEED(g_uart));

byte = DRV_Reg32(UART_LCR(g_uart)); /* DLAB start 读取UART_LCR 寄存器的值*/

mt65xx_reg_sync_writel((byte | UART_LCR_DLAB), UART_LCR(g_uart));

mt65xx_reg_sync_writel((divisor & 0x00ff), UART_DLL(g_uart));

mt65xx_reg_sync_writel(((divisor >> 8)&0x00ff), UART_DLH(g_uart));

mt65xx_reg_sync_writel(byte, UART_LCR(g_uart)); /* DLAB end */

}

else {

data=(unsigned short)(uartclk/speed);

high_speed_div = (data>>8) + 1; // divided by 256

tmp_div=uartclk/(speed*high_speed_div);

divisor = (unsigned short)tmp_div;

remainder = (uartclk)%(high_speed_div*speed);

/*get (sample_count+1)*/

if (remainder >= ((speed)*(high_speed_div))>>1)

divisor = (unsigned short)(tmp_div+1);

else

divisor = (unsigned short)tmp_div;



sample_count=divisor-1;



/*get the sample point*/

sample_point=(sample_count-1)>>1;



/*configure register*/

mt65xx_reg_sync_writel(highspeed, UART_HIGHSPEED(g_uart));



byte = DRV_Reg32(UART_LCR(g_uart)); /* DLAB start */

mt65xx_reg_sync_writel((byte | UART_LCR_DLAB), UART_LCR(g_uart));

mt65xx_reg_sync_writel((high_speed_div & 0x00ff), UART_DLL(g_uart));

mt65xx_reg_sync_writel(((high_speed_div >> 8)&0x00ff), UART_DLH(g_uart));

mt65xx_reg_sync_writel(sample_count, UART_SAMPLE_COUNT(g_uart));

mt65xx_reg_sync_writel(sample_point, UART_SAMPLE_POINT(g_uart));

mt65xx_reg_sync_writel(byte, UART_LCR(g_uart)); /* DLAB end */

}

}

//设置当前使用的串口(串口1/串口2)

/*

mediatek/platform/mt6572/lk/include/platform/mt_uart.h:

typedef enum

{

UART1 = UART1_BASE,

UART2 = UART2_BASE

} MTK_UART;

mediatek/platform/mt6572/lk/include/platform/mt_reg_base.h:#define UART1_BASE 0x11005000 //MT6572

*/

void mtk_set_current_uart(MTK_UART uart_base)

{

switch(uart_base)

{

case UART1 :

g_uart = uart_base;

break;

case UART2 :

g_uart = uart_base;

break;

default:

ASSERT(0);

break;

}

}

extern BOOT_ARGUMENT *g_boot_arg;

void
uart_init_early(void)

{

#ifdef __ENABLE_UART_LOG_SWITCH_FEATURE__ //走if分支

if(get_uart_port_id() == 1){// 如果是使用串口1,则设置串口基地址为UART1的寄存器基地址 // MT6572的工程配置了log从UART1输出。

#ifdef GPIO_UART_URXD1_PIN //GPIO103

mt_set_gpio_mode(GPIO_UART_URXD1_PIN, GPIO_MODE_01);

mt_set_gpio_mode(GPIO_UART_UTXD1_PIN, GPIO_MODE_01); //GPIO104 ->GPIO_UART_UTXD1_PIN

#endif

mtk_set_current_uart(UART1); // 设置当前串口为 UART1

mtk_uart_power_on(UART1);// 打开UART1的相关的电源

}else{

#ifdef GPIO_UART_URXD2_PIN

mt_set_gpio_mode(GPIO_UART_URXD2_PIN, GPIO_MODE_01);

mt_set_gpio_mode(GPIO_UART_UTXD2_PIN, GPIO_MODE_01);

#endif

mtk_set_current_uart(UART2);

mtk_uart_power_on(UART2);

}

#else

mtk_set_current_uart(UART2);

mtk_uart_power_on(UART2);

#endif

/*[MT6572] workaround set all uart port to AP in META_mode*/

if((g_boot_arg->boot_mode &= 0x000000FF) == META_BOOT){
// 如果是 META_BOOT 模式启动,则做如下操作.Meta模式使用UART1。

if((g_boot_arg->meta_com_type &= 0x000000FF) == META_UART_COM){

#ifdef GPIO_UART_URXD1_PIN // 如果 meta_com_type 为 META_UART_COM,那么设置UART1的两个PIN脚为GPIO模式。

mt_set_gpio_mode(GPIO_UART_URXD1_PIN, GPIO_MODE_01);

mt_set_gpio_mode(GPIO_UART_UTXD1_PIN, GPIO_MODE_01);

#endif

mtk_set_current_uart(UART1);// 设置当前使用串口的基地址, 基地址保存在g_uart 变量。

mtk_uart_power_on(UART1);

}

}

/*[MT6572] workaround end*/



/*

// #define UART_FCR(uart) (UART_BASE(uart)+0x8) // 串口的FCR寄存器,地址位于串口寄存器的基地址偏移0x8也就是第3个寄存器。

//mediatek/platform/mt6572/lk/include/platform/mt_uart.h:

#define UART_FCR_FIFO_INIT (UART_FCR_FIFOE|UART_FCR_CLRR|UART_FCR_CLRT)

*/

使能串口FIFO(FCR: FIFO CONTROL REGISTER),clear TX FIFO, clear RX FIFO.

DRV_SetReg32(UART_FCR(g_uart), UART_FCR_FIFO_INIT); /* clear fifo */

/* LCR: Line Control Register.

UART_NONE_PARITY:(0 << 3); // 奇偶校验: (0:不检查,1:检查)

UART_1_STOP:(0 << 2); // 发送的时候添加的停止位的位数。(0:1, 1:2bit)

UART_WLS_8:(3 << 0), 选择word的长度为8bit (0:5, 1:6, 2:7, 3:8bit)

*/

mt65xx_reg_sync_writew(UART_NONE_PARITY | UART_WLS_8 | UART_1_STOP, UART_LCR(g_uart));

g_brg = CONFIG_BAUDRATE; // 921600

//串口1的初始化配置:设置串口波特率...

uart_setbrg();

}

void uart_init(void)

{

}

//通过串口发送单个字符

int uart_putc(const char c )

{

/*

#define UART_LSR(uart) (UART_BASE(uart)+0x14)

mediatek/platform/mt6572/lk/include/platform/mt_uart.h:#define UART_LSR_THRE (1 << 5)

mediatek/platform/mt6572/lk/include/platform/mt_typedefs.h:

#define READ_REGISTER_UINT32(reg) (*(volatile unsigned int * const)(reg))

#define INREG32(x) READ_REGISTER_UINT32((unsigned int *)(x))

#define DRV_Reg32(addr) INREG32(addr)// 含义:就是吧 addr地址 的数据读取出来。

*/

while (!(DRV_Reg32(UART_LSR(g_uart)) & UART_LSR_THRE));

if (c == '\n')

mt65xx_reg_sync_writel((unsigned int)'\r', UART_THR(g_uart));

mt65xx_reg_sync_writel((unsigned int)c, UART_THR(g_uart)); // THR 串口发送寄存器。

return 0;

}

//通过串口接受字符

int uart_getc(void) /* returns -1 if no data available */

{

while (!(DRV_Reg32(UART_LSR(g_uart)) & UART_LSR_DR));

return (int)DRV_Reg32(UART_RBR(g_uart));// RBR 串口接收寄存器。

}

//通过串口传输字符串;

void uart_puts(const char *s)

{

while (*s)

uart_putc(*s++);

}

#ifdef __ENABLE_UART_LOG_SWITCH_FEATURE__

extern BOOT_ARGUMENT *g_boot_arg;

int get_uart_port_id(void)

{

unsigned int mode = 0;

unsigned int log_port;

unsigned int log_enable;

unsigned int log_baudrate;

mode = g_boot_arg->boot_mode &= 0x000000FF;

log_port = g_boot_arg->log_port;

log_enable = g_boot_arg->log_enable;

log_baudrate = g_boot_arg->log_baudrate;

if( (log_port == UART1)&&(log_enable != 0) )

return 1;

return 2;

}

static void change_uart_port(char * cmd_line, char new_val)

{

int i;

int len;

char *ptr;

if(NULL == cmd_line)

return;

len = strlen(cmd_line);

ptr = cmd_line;

i = strlen("ttyMT");

if(len < i)

return;

len = len-i;

for(i=0; i<=len; i++)

{

if(strncmp(ptr, "ttyMT", 5)==0)

{

ptr[5] = new_val; // Find and modify

break;

}

ptr++;

}

}

void custom_port_in_kernel(BOOTMODE boot_mode, char *command)

{

if(get_uart_port_id() == 1){

change_uart_port(command, '0');

}

}

#else

void custom_port_in_kernel(BOOTMODE boot_mode, char *command)

{

// Dummy function case

}

int get_uart_port_id(void)

{

// Dummy function case

}

#endif





/*

FILENAME: mediatek/platform/mt6572/lk/include/platform/mt_uart.h

Copyright Statement:

*

* This software/firmware and related documentation ("MediaTek Software") are

* protected under relevant copyright laws. The information contained herein

* is confidential and proprietary to MediaTek Inc. and/or its licensors.

* Without the prior written permission of MediaTek inc. and/or its licensors,

* any reproduction, modification, use or disclosure of MediaTek Software,

* and information contained herein, in whole or in part, shall be strictly prohibited.

*

* MediaTek Inc. (C) 2010. All rights reserved.

*

* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES

* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")

* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON

* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,

* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF

* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.

* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE

* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR

* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH

* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES

* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES

* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK

* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR

* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND

* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,

* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,

* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO

* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.

*

* The following software/firmware and/or related documentation ("MediaTek Software")

* have been modified by MediaTek Inc. All revisions are subject to any receiver's

* applicable license agreements with MediaTek Inc.

*/

#ifndef ___MTK_UART_H__

#define ___MTK_UART_H__

#include <platform/mt_reg_base.h>

typedef enum

{

UART1 = UART1_BASE,

UART2 = UART2_BASE

} MTK_UART;

#define UART_FIFO_SIZE (16)

#define IO_OFFSET (0)

/* IER */

#define UART_IER_ERBFI (1 << 0) /* RX buffer conatins data int. */

#define UART_IER_ETBEI (1 << 1) /* TX FIFO threshold trigger int. */

#define UART_IER_ELSI (1 << 2) /* BE, FE, PE, or OE int. */

#define UART_IER_EDSSI (1 << 3) /* CTS change (DCTS) int. */

#define UART_IER_XOFFI (1 << 5)

#define UART_IER_RTSI (1 << 6)

#define UART_IER_CTSI (1 << 7)

#define UART_IER_ALL_INTS (UART_IER_ERBFI|UART_IER_ETBEI|UART_IER_ELSI|\

UART_IER_EDSSI|UART_IER_XOFFI|UART_IER_RTSI|\

UART_IER_CTSI)

#define UART_IER_HW_NORMALINTS (UART_IER_ERBFI|UART_IER_ELSI|UART_IER_EDSSI)

#define UART_IER_HW_ALLINTS (UART_IER_ERBFI|UART_IER_ETBEI| \

UART_IER_ELSI|UART_IER_EDSSI)

/* FCR */

#define UART_FCR_FIFOE (1 << 0)

#define UART_FCR_CLRR (1 << 1)

#define UART_FCR_CLRT (1 << 2)

#define UART_FCR_DMA1 (1 << 3)

#define UART_FCR_RXFIFO_1B_TRI (0 << 6)

#define UART_FCR_RXFIFO_6B_TRI (1 << 6)

#define UART_FCR_RXFIFO_12B_TRI (2 << 6)

#define UART_FCR_RXFIFO_RX_TRI (3 << 6)

#define UART_FCR_TXFIFO_1B_TRI (0 << 4)

#define UART_FCR_TXFIFO_4B_TRI (1 << 4)

#define UART_FCR_TXFIFO_8B_TRI (2 << 4)

#define UART_FCR_TXFIFO_14B_TRI (3 << 4)

#define UART_FCR_FIFO_INIT (UART_FCR_FIFOE|UART_FCR_CLRR|UART_FCR_CLRT)

#define UART_FCR_NORMAL (UART_FCR_FIFO_INIT | \

UART_FCR_TXFIFO_4B_TRI| \

UART_FCR_RXFIFO_12B_TRI)

/* LCR */

#define UART_LCR_BREAK (1 << 6)

#define UART_LCR_DLAB (1 << 7)

#define UART_WLS_5 (0 << 0)

#define UART_WLS_6 (1 << 0)

#define UART_WLS_7 (2 << 0)

#define UART_WLS_8 (3 << 0)

#define UART_WLS_MASK (3 << 0)

#define UART_1_STOP (0 << 2)

#define UART_2_STOP (1 << 2)

#define UART_1_5_STOP (1 << 2) /* Only when WLS=5 */

#define UART_STOP_MASK (1 << 2)

#define UART_NONE_PARITY (0 << 3)

#define UART_ODD_PARITY (0x1 << 3)

#define UART_EVEN_PARITY (0x3 << 3)

#define UART_MARK_PARITY (0x5 << 3)

#define UART_SPACE_PARITY (0x7 << 3)

#define UART_PARITY_MASK (0x7 << 3)

/* MCR */

#define UART_MCR_DTR (1 << 0)

#define UART_MCR_RTS (1 << 1)

#define UART_MCR_OUT1 (1 << 2)

#define UART_MCR_OUT2 (1 << 3)

#define UART_MCR_LOOP (1 << 4)

#define UART_MCR_XOFF (1 << 7) /* read only */

#define UART_MCR_NORMAL (UART_MCR_DTR|UART_MCR_RTS)

/* LSR */

#define UART_LSR_DR (1 << 0)

#define UART_LSR_OE (1 << 1)

#define UART_LSR_PE (1 << 2)

#define UART_LSR_FE (1 << 3)

#define UART_LSR_BI (1 << 4)

#define UART_LSR_THRE (1 << 5)

#define UART_LSR_TEMT (1 << 6)

#define UART_LSR_FIFOERR (1 << 7)

/* MSR */

#define UART_MSR_DCTS (1 << 0)

#define UART_MSR_DDSR (1 << 1)

#define UART_MSR_TERI (1 << 2)

#define UART_MSR_DDCD (1 << 3)

#define UART_MSR_CTS (1 << 4)

#define UART_MSR_DSR (1 << 5)

#define UART_MSR_RI (1 << 6)

#define UART_MSR_DCD (1 << 7)

/* EFR */

#define UART_EFR_EN (1 << 4)

#define UART_EFR_AUTO_RTS (1 << 6)

#define UART_EFR_AUTO_CTS (1 << 7)

#define UART_EFR_SW_CTRL_MASK (0xf << 0)

#define UART_EFR_NO_SW_CTRL (0)

#define UART_EFR_NO_FLOW_CTRL (0)

#define UART_EFR_AUTO_RTSCTS (UART_EFR_AUTO_RTS|UART_EFR_AUTO_CTS)

#define UART_EFR_XON1_XOFF1 (0xa) /* TX/RX XON1/XOFF1 flow control */

#define UART_EFR_XON2_XOFF2 (0x5) /* TX/RX XON2/XOFF2 flow control */

#define UART_EFR_XON12_XOFF12 (0xf) /* TX/RX XON1,2/XOFF1,2 flow

control */

#define UART_EFR_XON1_XOFF1_MASK (0xa)

#define UART_EFR_XON2_XOFF2_MASK (0x5)

/* IIR (Read Only) */

#define UART_IIR_NO_INT_PENDING (0x01)

#define UART_IIR_RLS (0x06) /* Receiver Line Status */

#define UART_IIR_RDA (0x04) /* Receive Data Available */

#define UART_IIR_CTI (0x0C) /* Character Timeout Indicator */

#define UART_IIR_THRE (0x02) /* Transmit Holding Register Empty

*/

#define UART_IIR_MS (0x00) /* Check Modem Status Register */

#define UART_IIR_SW_FLOW_CTRL (0x10) /* Receive XOFF characters */

#define UART_IIR_HW_FLOW_CTRL (0x20) /* CTS or RTS Rising Edge */

#define UART_IIR_FIFO_EN (0xc0)

#define UART_IIR_INT_MASK (0x1f)

/* RateFix */

#define UART_RATE_FIX (1 << 0)

//#define UART_AUTORATE_FIX (1 << 1)

//#define UART_FREQ_SEL (1 << 2)

#define UART_FREQ_SEL (1 << 1)

#define UART_RATE_FIX_13M (1 << 0) /* means UARTclk = APBclk / 4 */

#define UART_AUTORATE_FIX_13M (1 << 1)

#define UART_FREQ_SEL_13M (1 << 2)

#define UART_RATE_FIX_ALL_13M (UART_RATE_FIX_13M|UART_AUTORATE_FIX_13M| \

UART_FREQ_SEL_13M)

#define UART_RATE_FIX_26M (0 << 0) /* means UARTclk = APBclk / 2 */

#define UART_AUTORATE_FIX_26M (0 << 1)

#define UART_FREQ_SEL_26M (0 << 2)

#define UART_RATE_FIX_ALL_26M (UART_RATE_FIX_26M|UART_AUTORATE_FIX_26M| \

UART_FREQ_SEL_26M)

#define UART_RATE_FIX_32M5 (0 << 0) /* means UARTclk = APBclk / 2 */

#define UART_FREQ_SEL_32M5 (0 << 1)

#define UART_RATE_FIX_ALL_32M5 (UART_RATE_FIX_32M5|UART_FREQ_SEL_32M5)

#define UART_RATE_FIX_16M25 (0 << 0) /* means UARTclk = APBclk / 4 */

#define UART_FREQ_SEL_16M25 (0 << 1)

#define UART_RATE_FIX_ALL_16M25 (UART_RATE_FIX_16M25|UART_FREQ_SEL_16M25)

/* Autobaud sample */

#define UART_AUTOBADUSAM_13M 7

#define UART_AUTOBADUSAM_26M 15

#define UART_AUTOBADUSAM_52M 31

//#define UART_AUTOBADUSAM_52M 29 /* 28 or 29 ? */

#define UART_AUTOBAUDSAM_58_5M 31 /* 31 or 32 ? */

extern void mtk_set_current_uart(MTK_UART uart_base);

#endif /* !__MT65XX_UART_H__ */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: