From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.32.89; helo=nam01-sn1-obe.outbound.protection.outlook.com; envelope-from=meenakshi.aggarwal@nxp.com; receiver=edk2-devel@lists.01.org Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0089.outbound.protection.outlook.com [104.47.32.89]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id C222321A1099E for ; Sun, 26 Nov 2017 20:59:45 -0800 (PST) Received: from CY1PR03CA0042.namprd03.prod.outlook.com (2603:10b6:600::52) by DM2PR0301MB0735.namprd03.prod.outlook.com (2a01:111:e400:3c0d::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.260.4; Mon, 27 Nov 2017 05:04:05 +0000 Received: from BN1BFFO11FD046.protection.gbl (2a01:111:f400:7c10::1:134) by CY1PR03CA0042.outlook.office365.com (2603:10b6:600::52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.260.4 via Frontend Transport; Mon, 27 Nov 2017 05:04:04 +0000 Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1BFFO11FD046.mail.protection.outlook.com (10.58.145.1) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.218.12 via Frontend Transport; Mon, 27 Nov 2017 05:04:04 +0000 Received: from uefi-OptiPlex-790.ap.freescale.net (uefi-OptiPlex-790.ap.freescale.net [10.232.132.78]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vAR53iMW000785; Sun, 26 Nov 2017 22:04:01 -0700 From: Meenakshi Aggarwal To: , , , Date: Mon, 27 Nov 2017 16:21:52 +0530 Message-ID: <1511779917-9255-5-git-send-email-meenakshi.aggarwal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1511779917-9255-1-git-send-email-meenakshi.aggarwal@nxp.com> References: <1511779917-9255-1-git-send-email-meenakshi.aggarwal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131562326450216444; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39380400002)(376002)(346002)(39860400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(47776003)(2906002)(356003)(68736007)(97736004)(305945005)(8676002)(81166006)(81156014)(51416003)(86362001)(50986999)(316002)(50466002)(16586007)(2201001)(15188155005)(54906003)(104016004)(5660300001)(76176999)(575784001)(16799955002)(36756003)(110136005)(498600001)(33646002)(53936002)(6306002)(966005)(53376002)(48376002)(4326008)(6666003)(2950100002)(77096006)(8936002)(50226002)(105606002)(8656006)(106466001)(189998001)(326664003)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR0301MB0735; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD046; 1:MEjDtbg4SaAZsMUVxvC/8bbI4VzC7N+l020PiIIY6jE6FSuZOUQ7aDobP/TM5QJG0wNHxDPw70D8l3w+GwVw5gxkF6aEcLbsyjwLSBZiLASd9BoqUxXfpQtN+5SN3F6y MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9adf94b2-6a43-4ee0-3c9d-08d535544858 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4628075)(201703131517081)(2017052603258); SRVR:DM2PR0301MB0735; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0735; 3:6e1RlvxrJq+AIoj70COctuyBW8Yt8T21fMTB73WrSqQaD1d7dWM8kqZgX/1LQp2MnpsGNXvBx0BdtTKcLApETuWJLSNEr+TQNeop0iGPdrayJk188pFRXvA4zAia2lrLcATSOsdhnwQBch3AYCxOBjinDovYnRtqHDVcX3LhiGCWjwzIwx80MqRWHJ+wNIVJ8ro+loKhFu8ZULANwbGZXTIqw71fgeXU3JXElfbnMKd84y/x5qyqgrz/J+anAtX81SngQ9u7kWD20Nr5GlaS4Q5c5aL1GZfetnmTmJnj3JwON3iPk24kXXQh/nejDQ4TVWR1P0/agJoyze7DjqbOUtxsoXdYo6PmtllJHcsLMXA=; 25:b/Dktvg7IIRGaJQorSWWjN6JxJxapBzHPavrXWc8lv9C7+uh5Xo1SC03PiTUB8G8BcvH6xTCZIMxrowxwyW3kelp5UxTeDb0zLzdyMy61Vs7I7P/H5wVD6/zniWWH7phExciHDx7xeXVxq7USoeRvTm6sMr9yekaXzAtNf1qBS0OKR19eSQlp1x9M+AzvIk+Q7oPKCTzVKvJBGd1rEc4Xlo1hbPfhvGG/3Sp306RnpqMeYydSuw85GdP2THTKMjxuypxEqa8L+eWVeL/DxrdcyHOBl/Pa4hRFkcUj/B6YAFlHJB+3xPjE5FllSwSHuUY3Bmc5w/IOxbphTkppbltmJB1hmUm0SzNSthifb7pLA4= X-MS-TrafficTypeDiagnostic: DM2PR0301MB0735: X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0735; 31:d+kURyksVtHNCSBhpQ1R10Wsl4AxB0XYnmAAXORsj+xN5aut+5JLkSXSKHdneNcA/ws+BX10flRza3GVtfZYRC3PduHXdc0P7ZpdKYUugqC969AAMIYAq/8tBNd4bVSgwMJm1ldCPhW11aZfvq0tNTd1REQdoD+6ZFfWep8EN9zAbD9goJcjp3l1fjgHHuNh6ZJC1yyQhitNueNjKbB9Cnh1sFIUJ3P2IdtPDiMfEA8=; 4:Y4Q5EqukIEZB1n3A+g8H4nKCSivAwQpWq7vrt5strd+42ApdCgmkIMUJuLHjwMg7LPgrzRXyWguxtq2bjnufPravNY7GlbHvJ8W4h8sma23EspQvur4dl5/+DCzqftPTLPh3Pv9GrGlrVx2gUFT3dRpCflJ3DQ1sVEe9dRo1aDXzEq4gm2t8LbQ3r+PCPWK5ajoH4+oqRULyJa9sxS1kFLJAcLWZqMuWkBsaMB5f3EcTt4DQYTx1wqLdZv9wNUQJG0cVMMQ46iFFtDSlqd4iBQWnieyf9RjmS6dayeD4GsLVFnzqA4MEp+lgJZRZFt7rmyVoZzb1ta00NubLDvfF8VPSJANAQenAebttEaapdvU= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(278428928389397)(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(5005006)(8121501046)(93006095)(93001095)(3231022)(3002001)(10201501046)(6055026)(6096035)(20161123563025)(20161123561025)(20161123565025)(20161123559100)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(20161123556025)(201708071742011); SRVR:DM2PR0301MB0735; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:DM2PR0301MB0735; X-Forefront-PRVS: 0504F29D72 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0301MB0735; 23:DChqdkwilWdb2KqX0wDJd/38K4BsthiPl5yofu3?= =?us-ascii?Q?p3/kBlrD65+6fDXZg77dlrnGVQ7keWjVJvuMca87NSTCpJBANv8JLMakIoWW?= =?us-ascii?Q?FnqtPZXxR8SAlGjhkUqwduDeVdGG+zJIkWxe+9mUYaV6q6fZDJVlJPMVR8gg?= =?us-ascii?Q?/rDQ/YbPmAnK0SssFMqaeQsidj1roqRZy9eE0q2HBibaxk+j6K6/DJY+9+KA?= =?us-ascii?Q?xFcA1+jqHN+U8qcHURp4L+hSKLw9AjoD46x+OSiU2ekzY+hZFaRqIULTkInE?= =?us-ascii?Q?D00e0IVhVNr6bx8dGRpFN1mNCuywu/Hc8YF485A+SrgmBFBJiIQRAZe9cKca?= =?us-ascii?Q?7axbcdx/GGnjxvWr4lHrvp8cjaJLfORTvLMxnTk4GgVUIGBOIyAtddVo8BYm?= =?us-ascii?Q?W0oHSuUDnAWZOVVwty9eP7wocjEZEVfsJZvLOZc1Gi0ZImhFuMTOsWezw8TT?= =?us-ascii?Q?04QKcLBALv6qIfrWDaCKdBitD4TvxoL/tYNupkMZoZphfi3gFAXn88nj5At0?= =?us-ascii?Q?y+KfiTJ/NMVzxDes3d24Xi2vQd1/Tun/tOBphV/wGoaH4tVyZWkS4sWG2jyW?= =?us-ascii?Q?1tL+1n3UcvTEiwrYczgMVSnlbIfcPiPJVexPiFzQeN2XhHYnlO1Q+YwmcUla?= =?us-ascii?Q?B0PAaOwKqC2LKY0pTErr3LCxQtHFwLJvSoBZISSFZyKaq92XOzii0E8CmJo8?= =?us-ascii?Q?g7/zg/cNZSq6tphZXTDUE4TY/Kv1FvVfmV4pUBLnGu+r/b2kEIucAz4qMG/w?= =?us-ascii?Q?+mIRCBkw8jfXNyoswRcwOg8G7btSbevLeX4X1+VPyV3bCNIc/Gs1X4Ixt/b6?= =?us-ascii?Q?uLS9iAuIffF/dBLPcdF87qur6zt2G5YIl1dxyczU1GcUJUScamcpiw61Zbey?= =?us-ascii?Q?ki/PkEq3Nt+SBXIFPg2IPi2WDKfR4ERldSmmEjgd3Rh/7fQ0OZ3dElPra/cd?= =?us-ascii?Q?p4h7jaSU0LtsGNe3Y+/MsklmgMP6srDzaGwHaR/7drSZy7COieoMUhHgSzFe?= =?us-ascii?Q?IEdhQJPSGWhiVNM5lJYa3vcgDstSDecMFhsi1LN8JFfpgb2ylrj3xcQPOqdT?= =?us-ascii?Q?P1YscQapjLUMbeGmY5EvOUMIH8lH6kQ4rqJ/u/AVuhmrlV20fGHCIQdmIL1g?= =?us-ascii?Q?faEJ+3kdhzgNo89IvdRhBLbTwnti1x894hjRMSidmhnteknnBge6x4ZnCK4C?= =?us-ascii?Q?pE9TXBAqOGYQ9Z47ENbB3FtGDgsF56es4E7Za/ohGRdL/xWcJeqUqJr2628e?= =?us-ascii?Q?Dw+vnOyLFsrpU5RzSKTQl7NMLZRIdM8x545RKboyXeyf/EP00Q3C6WiVPg9U?= =?us-ascii?Q?0a5hykQhkhzdweJ8ZzdGZgnE=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0735; 6:kwoUOP9WDim6g0tzwo83hE89Fh8BHzZCMtv18VPY85vv3+Qud+oXlxDAv/nYobnYEumXvFqsTmI9EhAPgU6eTVWqHjMA059LQElaXdM4cqkBpDcyYO6UTX6bHX7IbBNWIObL/SlMGdWSPOvzjOKgUGR+XDmEIgTBeLEw70HGJDnJyRH28JTG/1qIsEA41Hs306uuRokctBSldQye42mhSgZ3j/kRnbvR91WtWwocI17JiGwfBcsJsaZYDogSSpLzh3o7/cLkFuVyLoJYngz0TZwPkFxMVDZD05PbBRLuxz3dezaBLmWPqeWNBR5u7+yBZJqVpXJW1Znj/u6/VZA2C/P8+US/AX17sm6ZhzKO5Dw=; 5:Kd166lvDmNR9CIaY+ndYNP4f3AsJwLD69GoNhUn2CDLjmAqGpZH6p1H0QmebL9+Jnylt+jUl3En0X4nniqx/22mAxcx45XMdqNJ/9ZlX0dHcqNbc1BSJBZPM28ko/nsKIYG5R043O/+oe36VphyWZbP3hzYG+h3Lnzn3mQnvVtI=; 24:qH3klsOEKoFnlM+YZitn+hJ38L5ZEUpgB61/0CbPv+5TR0bLvnrn5lkqyHF4juacNZTbj0nI75oNkvDW/ZViqsh6DCwZcUnibEyWoU3CCzE=; 7:Vl1R4SrtMwqwIp3Ok3siQH4qnnJoweXDHAKqAS8xhu1YJ/qn5unlhfQmd+OxB5J78ximbPlUUiBfSniPKnRZk3WJOXxm0slAygUP7JzkUcFYrQvC8BhP76Ul9yBjdNo8liaX+qBI6O7ZTNJrSVfyAFAv9IO2ZbWLGhXZHln/VvEJLLHZMLiYKEKKoYV6/O1i1ADMIx8q/lrNyKIpUtUel9shyv8cXYidg9olK1Sb4geeecQgpLqY/CjuLz+wPEff SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Nov 2017 05:04:04.8500 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9adf94b2-6a43-4ee0-3c9d-08d535544858 X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB0735 Subject: [PATCH edk2-platforms] [PATCH v3 4/9] Platform/NXP : Add support for DUART library X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Nov 2017 04:59:46 -0000 Content-Type: text/plain Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Meenakshi Aggarwal --- Platform/NXP/Library/DUartPortLib/DUart.h | 128 ++++++++ Platform/NXP/Library/DUartPortLib/DUartPortLib.c | 331 +++++++++++++++++++++ Platform/NXP/Library/DUartPortLib/DUartPortLib.inf | 39 +++ 3 files changed, 498 insertions(+) create mode 100644 Platform/NXP/Library/DUartPortLib/DUart.h create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.c create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.inf diff --git a/Platform/NXP/Library/DUartPortLib/DUart.h b/Platform/NXP/Library/DUartPortLib/DUart.h new file mode 100644 index 0000000..5ad198d --- /dev/null +++ b/Platform/NXP/Library/DUartPortLib/DUart.h @@ -0,0 +1,128 @@ +/** DUart.h +* Header defining the DUART constants (Base addresses, sizes, flags) +* +* Based on Serial I/O Port library headers available in PL011Uart.h +* +* Copyright (c) 2011-2012, ARM Limited. All rights reserved. +* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved. +* Copyright 2017 NXP +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +* +**/ + +#ifndef __DUART_H__ +#define __DUART_H__ + +// FIFO Control Register +#define DUART_FCR_FIFO_EN 0x01 /* Fifo enable */ +#define DUART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */ +#define DUART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */ +#define DUART_FCR_DMA_SELECT 0x08 /* For DMA applications */ +#define DUART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger range */ +#define DUART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */ +#define DUART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */ +#define DUART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */ +#define DUART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */ +#define DUART_FCR_RXSR 0x02 /* Receiver soft reset */ +#define DUART_FCR_TXSR 0x04 /* Transmitter soft reset */ + +// Modem Control Register +#define DUART_MCR_DTR 0x01 /* Reserved */ +#define DUART_MCR_RTS 0x02 /* RTS */ +#define DUART_MCR_OUT1 0x04 /* Reserved */ +#define DUART_MCR_OUT2 0x08 /* Reserved */ +#define DUART_MCR_LOOP 0x10 /* Enable loopback test mode */ +#define DUART_MCR_AFE 0x20 /* AFE (Auto Flow Control) */ +#define DUART_MCR_DMA_EN 0x04 +#define DUART_MCR_TX_DFR 0x08 + +// Line Control Register +/* +* Note: if the word length is 5 bits (DUART_LCR_WLEN5), then setting +* DUART_LCR_STOP will select 1.5 stop bits, not 2 stop bits. +*/ +#define DUART_LCR_WLS_MSK 0x03 /* character length select mask */ +#define DUART_LCR_WLS_5 0x00 /* 5 bit character length */ +#define DUART_LCR_WLS_6 0x01 /* 6 bit character length */ +#define DUART_LCR_WLS_7 0x02 /* 7 bit character length */ +#define DUART_LCR_WLS_8 0x03 /* 8 bit character length */ +#define DUART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */ +#define DUART_LCR_PEN 0x08 /* Parity eneble */ +#define DUART_LCR_EPS 0x10 /* Even Parity Select */ +#define DUART_LCR_STKP 0x20 /* Stick Parity */ +#define DUART_LCR_SBRK 0x40 /* Set Break */ +#define DUART_LCR_BKSE 0x80 /* Bank select enable */ +#define DUART_LCR_DLAB 0x80 /* Divisor latch access bit */ + +// Line Status Register +#define DUART_LSR_DR 0x01 /* Data ready */ +#define DUART_LSR_OE 0x02 /* Overrun */ +#define DUART_LSR_PE 0x04 /* Parity error */ +#define DUART_LSR_FE 0x08 /* Framing error */ +#define DUART_LSR_BI 0x10 /* Break */ +#define DUART_LSR_THRE 0x20 /* Xmit holding register empty */ +#define DUART_LSR_TEMT 0x40 /* Xmitter empty */ +#define DUART_LSR_ERR 0x80 /* Error */ + +// Modem Status Register +#define DUART_MSR_DCTS 0x01 /* Delta CTS */ +#define DUART_MSR_DDSR 0x02 /* Reserved */ +#define DUART_MSR_TERI 0x04 /* Reserved */ +#define DUART_MSR_DDCD 0x08 /* Reserved */ +#define DUART_MSR_CTS 0x10 /* Clear to Send */ +#define DUART_MSR_DSR 0x20 /* Reserved */ +#define DUART_MSR_RI 0x40 /* Reserved */ +#define DUART_MSR_DCD 0x80 /* Reserved */ + +// Interrupt Identification Register +#define DUART_IIR_NO_INT 0x01 /* No interrupts pending */ +#define DUART_IIR_ID 0x06 /* Mask for the interrupt ID */ +#define DUART_IIR_MSI 0x00 /* Modem status interrupt */ +#define DUART_IIR_THRI 0x02 /* Transmitter holding register empty */ +#define DUART_IIR_RDI 0x04 /* Receiver data interrupt */ +#define DUART_IIR_RLSI 0x06 /* Receiver line status interrupt */ + +// Interrupt Enable Register +#define DUART_IER_MSI 0x08 /* Enable Modem status interrupt */ +#define DUART_IER_RLSI 0x04 /* Enable receiver line status interrupt */ +#define DUART_IER_THRI 0x02 /* Enable Transmitter holding register int. */ +#define DUART_IER_RDI 0x01 /* Enable receiver data interrupt */ + +// LCR defaults +#define DUART_LCR_8N1 0x03 +#define DUART_LCRVAL DUART_LCR_8N1 /* 8 data, 1 stop, no parity */ +#define DUART_MCRVAL (DUART_MCR_DTR | \ + DUART_MCR_RTS) /* RTS/DTR */ +#define DUART_FCRVAL (DUART_FCR_FIFO_EN | \ + DUART_FCR_RXSR | \ + DUART_FCR_TXSR) /* Clear & enable FIFOs */ + +#define URBR 0x0 +#define UTHR 0x0 +#define UDLB 0x0 +#define UDMB 0x1 +#define UIER 0x1 +#define UIIR 0x2 +#define UFCR 0x2 +#define UAFR 0x2 +#define ULCR 0x3 +#define UMCR 0x4 +#define ULSR 0x5 +#define UMSR 0x6 +#define USCR 0x7 +#define UDSR 0x10 + +extern +UINT32 +CalculateBaudDivisor ( + IN UINT64 BaudRate + ); + +#endif /* __DUART_H__ */ diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.c b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c new file mode 100644 index 0000000..ad416de --- /dev/null +++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c @@ -0,0 +1,331 @@ +/** DuartPortLib.c + DUART (NS16550) library functions + + Based on Serial I/O Port library functions available in PL011SerialPortLib.c + + Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
+ Copyright (c) 2012 - 2013, ARM Ltd. All rights reserved.
+ Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved. + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include +#include + +#include "DUart.h" + +STATIC CONST UINT32 mInvalidControlBits = (EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \ + EFI_SERIAL_DATA_TERMINAL_READY); + +/** + Assert or deassert the control signals on a serial port. + The following control signals are set according their bit settings : + . Request to Send + . Data Terminal Ready + + @param[in] Control The following bits are taken into account : + . EFI_SERIAL_REQUEST_TO_SEND : assert/deassert the + "Request To Send" control signal if this bit is + equal to one/zero. + . EFI_SERIAL_DATA_TERMINAL_READY : assert/deassert + the "Data Terminal Ready" control signal if this + bit is equal to one/zero. + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : enable/disable + the hardware loopback if this bit is equal to + one/zero. + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : not supported. + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : enable/ + disable the hardware flow control based on CTS (Clear + To Send) and RTS (Ready To Send) control signals. + + @retval EFI_SUCCESS The new control bits were set on the device. + @retval EFI_UNSUPPORTED The device does not support this operation. + +**/ +EFI_STATUS +EFIAPI +SerialPortSetControl ( + IN UINT32 Control + ) +{ + UINT32 McrBits; + UINTN UartBase; + + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase); + + if (Control & (mInvalidControlBits)) { + return EFI_UNSUPPORTED; + } + + McrBits = MmioRead8 (UartBase + UMCR); + + if (Control & EFI_SERIAL_REQUEST_TO_SEND) { + McrBits |= DUART_MCR_RTS; + } else { + McrBits &= ~DUART_MCR_RTS; + } + + if (Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) { + McrBits |= DUART_MCR_LOOP; + } else { + McrBits &= ~DUART_MCR_LOOP; + } + + if (Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) { + McrBits |= DUART_MCR_AFE; + } else { + McrBits &= ~DUART_MCR_AFE; + } + + MmioWrite32 (UartBase + UMCR, McrBits); + + return EFI_SUCCESS; +} + +/** + Retrieve the status of the control bits on a serial device. + + @param[out] Control Status of the control bits on a serial device : + + . EFI_SERIAL_DATA_CLEAR_TO_SEND, + EFI_SERIAL_DATA_SET_READY, + EFI_SERIAL_RING_INDICATE, + EFI_SERIAL_CARRIER_DETECT, + EFI_SERIAL_REQUEST_TO_SEND, + EFI_SERIAL_DATA_TERMINAL_READY + are all related to the DTE (Data Terminal Equipment) + and DCE (Data Communication Equipment) modes of + operation of the serial device. + . EFI_SERIAL_INPUT_BUFFER_EMPTY : equal to one if the + receive buffer is empty, 0 otherwise. + . EFI_SERIAL_OUTPUT_BUFFER_EMPTY : equal to one if the + transmit buffer is empty, 0 otherwise. + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : equal to one if + the hardware loopback is enabled (the ouput feeds the + receive buffer), 0 otherwise. + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : equal to one if + a loopback is accomplished by software, 0 otherwise. + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : equal to + one if the hardware flow control based on CTS (Clear + To Send) and RTS (Ready To Send) control signals is + enabled, 0 otherwise. + + @retval EFI_SUCCESS The control bits were read from the serial device. + +**/ +EFI_STATUS +EFIAPI +SerialPortGetControl ( + OUT UINT32 *Control + ) +{ + UINT32 MsrRegister; + UINT32 McrRegister; + UINT32 LsrRegister; + UINTN UartBase; + + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase); + + MsrRegister = MmioRead8 (UartBase + UMSR); + McrRegister = MmioRead8 (UartBase + UMCR); + LsrRegister = MmioRead8 (UartBase + ULSR); + + *Control = 0; + + if ((MsrRegister & DUART_MSR_CTS) == DUART_MSR_CTS) { + *Control |= EFI_SERIAL_CLEAR_TO_SEND; + } + + if ((McrRegister & DUART_MCR_RTS) == DUART_MCR_RTS) { + *Control |= EFI_SERIAL_REQUEST_TO_SEND; + } + + if ((LsrRegister & DUART_LSR_TEMT) == DUART_LSR_TEMT) { + *Control |= EFI_SERIAL_OUTPUT_BUFFER_EMPTY; + } + + if ((McrRegister & DUART_MCR_AFE) == DUART_MCR_AFE) { + *Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE; + } + + if ((McrRegister & DUART_MCR_LOOP) == DUART_MCR_LOOP) { + *Control |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE; + } + + return EFI_SUCCESS; +} + +/** + Programmed hardware of Serial port. + + @return Always return EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +SerialPortInitialize ( + VOID + ) +{ + UINT64 BaudRate; + UINT32 BaudDivisor; + UINTN UartBase; + + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase); + BaudRate = (UINTN)PcdGet64 (PcdUartDefaultBaudRate); + + BaudDivisor = CalculateBaudDivisor (BaudRate); + + while (!(MmioRead8 (UartBase + ULSR) & DUART_LSR_TEMT)); + + // + // Enable and assert interrupt when new data is available on + // external device, + // setup data format, setup baud divisor + // + MmioWrite8 (UartBase + UIER, 0x1); + MmioWrite8 (UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL); + MmioWrite8 (UartBase + UDLB, 0); + MmioWrite8 (UartBase + UDMB, 0); + MmioWrite8 (UartBase + ULCR, DUART_LCRVAL); + MmioWrite8 (UartBase + UMCR, DUART_MCRVAL); + MmioWrite8 (UartBase + UFCR, DUART_FCRVAL); + MmioWrite8 (UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL); + MmioWrite8 (UartBase + UDLB, BaudDivisor & 0xff); + MmioWrite8 (UartBase + UDMB, (BaudDivisor >> 8) & 0xff); + MmioWrite8 (UartBase + ULCR, DUART_LCRVAL); + + return EFI_SUCCESS; +} + +/** + Write data to serial device. + + @param Buffer Point of data buffer which need to be written. + @param NumberOfBytes Number of output bytes which are cached in Buffer. + + @retval 0 Write data failed. + @retval !0 Actual number of bytes written to serial device. + +**/ +UINTN +EFIAPI +SerialPortWrite ( + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + UINT8 *Final; + UINTN UartBase; + + Final = &Buffer[NumberOfBytes]; + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase); + + while (Buffer < Final) { + while ((MmioRead8 (UartBase + ULSR) & DUART_LSR_THRE) == 0); + MmioWrite8 (UartBase + UTHR, *Buffer++); + } + + return NumberOfBytes; +} + +/** + Read data from serial device and save the data in buffer. + + @param Buffer Point of data buffer which need to be written. + @param NumberOfBytes Number of output bytes which are cached in Buffer. + + @retval 0 Read data failed. + @retval !0 Actual number of bytes read from serial device. + +**/ +UINTN +EFIAPI +SerialPortRead ( + OUT UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + UINTN Count; + UINTN UartBase; + + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase); + + for (Count = 0; Count < NumberOfBytes; Count++, Buffer++) { + // Loop while waiting for a new char(s) to arrive in the + // RxFIFO + while ((MmioRead8 (UartBase + ULSR) & DUART_LSR_DR) == 0); + + *Buffer = MmioRead8 (UartBase + URBR); + } + + return NumberOfBytes; +} + +/** + Check to see if any data is available to be read from the debug device. + + @retval EFI_SUCCESS At least one byte of data is available to be read + @retval EFI_NOT_READY No data is available to be read + @retval EFI_DEVICE_ERROR The serial device is not functioning properly + +**/ +BOOLEAN +EFIAPI +SerialPortPoll ( + VOID + ) +{ + UINTN UartBase; + + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase); + + return ((MmioRead8 (UartBase + ULSR) & DUART_LSR_DR) != 0); +} + +/** + Set new attributes to LS1043a. + + @param BaudRate The baud rate of the serial device. If the baud rate is not supported, + the speed will be reduced down to the nearest supported one and the + variable's value will be updated accordingly. + @param ReceiveFifoDepth The number of characters the device will buffer on input. If the specified + value is not supported, the variable's value will be reduced down to the + nearest supported one. + @param Timeout If applicable, the number of microseconds the device will wait + before timing out a Read or a Write operation. + @param Parity If applicable, this is the EFI_PARITY_TYPE that is computed or checked + as each character is transmitted or received. If the device does not + support parity, the value is the default parity value. + @param DataBits The number of data bits in each character + @param StopBits If applicable, the EFI_STOP_BITS_TYPE number of stop bits per character. + If the device does not support stop bits, the value is the default stop + bit value. + + @retval EFI_SUCCESS All attributes were set correctly on the serial device. + +**/ +EFI_STATUS +EFIAPI +SerialPortSetAttributes ( + IN OUT UINT64 *BaudRate, + IN OUT UINT32 *ReceiveFifoDepth, + IN OUT UINT32 *Timeout, + IN OUT EFI_PARITY_TYPE *Parity, + IN OUT UINT8 *DataBits, + IN OUT EFI_STOP_BITS_TYPE *StopBits + ) +{ + return SerialPortInitialize (); +} diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf new file mode 100644 index 0000000..7eb02ce --- /dev/null +++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf @@ -0,0 +1,39 @@ +# DUartPortLib.inf +# +# Component description file for DUartPortLib module +# +# Copyright (c) 2013, Freescale Ltd. All rights reserved. +# Copyright 2017 NXP +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = DUartPortLib + FILE_GUID = c42dfe79-8de5-429e-a055-2d0a58591498 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = SerialPortLib + +[Sources.common] + DUartPortLib.c + +[LibraryClasses] + PcdLib + SocLib + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate -- 1.9.1