From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=40.107.0.87; helo=eur02-am5-obe.outbound.protection.outlook.com; envelope-from=meenakshi.aggarwal@nxp.com; receiver=edk2-devel@lists.01.org Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00087.outbound.protection.outlook.com [40.107.0.87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A5A8D21CF1D18 for ; Fri, 16 Feb 2018 00:46:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=mirUJz3KnO+vlOKr2AsHFErhUNJa9jWAxrThDBmRfkQ=; b=WftZD176JADPj8naAlAdB9kq1iwMd+l3+LQfYtwX8jN83tCclwAdXtmOec3kI+0Jyw8G6ulUtpNStEKMuz+MotXXLNCJFEoN9akxOSSpWzbsvZzhhrImXp3HqJq4YbqQ1Y/qqP0/OOmV3QTwXXkwSGTpBwR/azWQ0wuvu9f9sBc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=meenakshi.aggarwal@nxp.com; Received: from idcbfarm.ap.freescale.net (192.88.169.1) by VI1PR04MB1008.eurprd04.prod.outlook.com (2a01:111:e400:5090::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.485.10; Fri, 16 Feb 2018 08:52:39 +0000 From: Meenakshi To: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org, michael.d.kinney@intel.com, edk2-devel@lists.01.org Date: Fri, 16 Feb 2018 14:20:00 +0530 Message-Id: <1518771035-6733-5-git-send-email-meenakshi.aggarwal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> References: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> MIME-Version: 1.0 X-Originating-IP: [192.88.169.1] X-ClientProxiedBy: HK2PR02CA0172.apcprd02.prod.outlook.com (2603:1096:201:1f::32) To VI1PR04MB1008.eurprd04.prod.outlook.com (2a01:111:e400:5090::28) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 537e0f9b-0c24-42ba-b1a9-08d5751aa445 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603307)(7153060)(7193020); SRVR:VI1PR04MB1008; X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 3:576fLQL2cuM7ZQi+c/PTfIu4wTY5o1HZTgtFtgoFnYdQPASi1Qne1Dj0UXb9sTRKQNZNkBiubJDWzkZ/bc4pAjReGYU2RbmNK9F6hw81PvebprA2ohJjvXNcmqPe0mA9X3MHBwCsghNZMsAxSDz+rBkM6Itz5nrfh3WOa67v4i9vgd8LLYo1/jIF3zwuS+1AD+zEF8zZFUfsWXMVt7iQKQNrtwawAYzQJpjdbMl/nU3iskdIYDFr3C2lFlEb4ozR; 25:Wy1d2hK9vq7rrLCAQLCJKu3envd0O7SKhDY9uYpVgq986mndnN5dDdNiKFVNsPWICOmKaS4BEWId5QUo6Nwn1qUWgtSf7UltcDFJk3XAmuee/A0YBKR8xjPbuofwjb5bcIRY5qGXKgo67Dqgj/N0khSgYpoZEI1xGqwhrNaNvzUgz4UsSaoHIcza3IEk2tjgqkrAsj66efIhRONG7fW0Nf0+ypwU/DkBT6cX8W2qsoyxKhVhn9ZVD3B3JAIs3MMKyPvaLBF/bVJoExJ5sFyjFvJCtvsKJFgdqjbIPRF7k47T9WS/6VlviYfK6btOe4QrqrNpILtxb6iy9NH2YaPQJg==; 31:Mz/fi3zXo27tLV+KDHRqn2Ieh/NoReaN4kF+WPHwQLv921vp7Njtf9cwS8Z4Sje1XDBE/jk06G5dRNID//XjbVQYqntFfw9O54qftVsNlJFOO+8JzAaXq/gbysz7OYZGRcVxowS/C52wOIE/Iub6lqFFViHxmVjrnk5S4btjkoEiJsWVoSJtFdq2fuk+gXLo/58pcYOCN5pGd7tJ8GzckCycHD/4X9K2MX/0ttURs2o= X-MS-TrafficTypeDiagnostic: VI1PR04MB1008: X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 20:nmeDaFVI2kqYSGk7XMnTHUDijQRcExc9v/bh6YsLp1l89n+pQNrpiuCGo0iY6uj0OyZIRcQez2vYvINsFsYmIlDJtDhadXlowVY+0D3pE2we7tgqbA268ByQ27o51ShQUScG5ds1D8Lupstbw2qpzkbeG5bJKo9bjp/ONCXKlBJgml3dXsECaodX/rnMuZwSq1U2N9/ld6SyJYLdLUyWLenvOuaE/hNvPd0BOxufE6cZM5vM7v/msbZScNs3ZZh3ah+vMktwsf4MyhsoycVQxnuNp6ReRHGN7lHF5Pz02InVGsssJp5GptxGTgbSjnW1WjWR5jF7e9jwMzJ/cslZkxEsBjnqQpyJrjn5zlbN+dgJxm5oB+WR0525ME8AlgVe1xYlvOfdP6SDvAHQkEt5QnhZF989unwkkBPrcZJlMMyiPmtCD2VFfiQ/7Vfjf6/XNAc3pylfol3jFPcZRhkBkr8VPvlH4v3jhkL+cr/dxk0YPGaJKJdpnnhKNNuk9/Cj; 4:oVHKEfxRSR5EgxbkOBeLgPWtvKlo0tzfKLFOVak1wUKNIdMt+nK+qKqgfUUyg1c8OY0SZ70MeVKqekaTS9Lvl787n8ZtwTy2Z0HWsKZavzGYXoFT5ZVz2X1wuJKQT1ffrOAyfFSYBLHjuTVqWCB8AymVA61bXc51NwW3SeiobiqPesl7wZxYg80SDD9HoynnlYpZKYuSxFvTY+t9k4LkeEieAUG571/r9kqdDWa1f4piBL9ff0AtHae7mSrqZmjgI88ytc80WEKaIEgXp5C8BNCc/bGMZxnYO8e2q/tr10vNkFIo6bXnxKVH3a1PJaq45NyB0xLoyJp4jVecMMnm+rLJ3dykZkN61ifl7Ll1Pgw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(278428928389397)(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(3231101)(944501161)(6055026)(6041288)(20161123558120)(20161123564045)(20161123560045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:VI1PR04MB1008; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB1008; X-Forefront-PRVS: 0585417D7B X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(376002)(39380400002)(396003)(39860400002)(366004)(199004)(189003)(86362001)(575784001)(6486002)(8676002)(76176011)(36756003)(53376002)(966005)(4326008)(6116002)(15188155005)(16799955002)(7736002)(386003)(68736007)(186003)(26005)(53936002)(305945005)(16526019)(81156014)(3846002)(6506007)(478600001)(50226002)(16586007)(8936002)(2950100002)(316002)(2906002)(59450400001)(25786009)(97736004)(50466002)(48376002)(105586002)(52116002)(47776003)(81166006)(51416003)(5660300001)(6666003)(106356001)(66066001)(6306002)(6512007)(11771545001)(326664003)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB1008; H:idcbfarm.ap.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR04MB1008; 23:27QInRkmd3woginy38bABbeivCRPG3qZRnjqgFB1A?= =?us-ascii?Q?ybCVVGDudNkldNKCbB+GYVNJXPjeQ/Lzi/zibXothrbDfHPPkMZ6jPuhe54r?= =?us-ascii?Q?REOSaUJgiSdfYbWK6MUDfj0bKySIkBVd0mtgPaz9FB0Dw6tV8EdCrtLrh4nV?= =?us-ascii?Q?1gmuyBb3kWRRgwmDN060NGOZ2jdw1WqX3QtjlLxkHWzZjwmRbwnzXs207sga?= =?us-ascii?Q?Rmi1NVGwjQm+8PLNSLGNhid3nGQHxFXGhvl/bhP65tD1/fRW0PLYxLgkF1hM?= =?us-ascii?Q?lKvGgqmoQlXsGVXWI3zATRqTp5KkJlCHfM1o28a2ELol5UzIDQen+h1Zb4G0?= =?us-ascii?Q?ZhTgwGgL8CqNyJcKD8F2dah3GijGpj20QqYPDvx3pywPFrZchDCL57CdC8r4?= =?us-ascii?Q?4kntQmmQnzuXrKRAt8mxgI/RX8LMlQKR/mBsnsvE2b45Ko2mzF0JMjqULH4k?= =?us-ascii?Q?5JLfCWrxBqbJOeLIelUFD5k+Lozal5b5mySAr8mGz5lZM6IeWgHgmJPadK5g?= =?us-ascii?Q?jZSNyhVw7oE06KF+rWh1nduEeH4pd92VDJuzSKqKNrC75MSX67Xe7iBlnsfk?= =?us-ascii?Q?s7caKIxUQK3M8oJhmQFvUgQ3v3brIWbuih7hAqM4INSOwES5H3VUSVtqNfq5?= =?us-ascii?Q?n0z7xsK/WCgiVCnRmucKlj6fCSRUqIRIUeJL2w7fjyhe1BH2Jt82/dmoPap+?= =?us-ascii?Q?/RE0tVfpSujKqJpSu1i3jeCqf9+yDRbYOpPhG3TZ7aEl403T3U1i8VBjRy/R?= =?us-ascii?Q?n4YAoeVgz60B9CMR2z+Hwl84BOJA3f7Vu1P3sHeBCjzF1STPy0+wEhrA3k0n?= =?us-ascii?Q?YJXv808oTnAzvphJ0YDaoXCbRNeQgvWBKRf1R8lzboDV5Fd0PSR8qgX/rIeJ?= =?us-ascii?Q?FHHiKzsqNhr+cPdo3LaeBk4RGwMkyEmdTH0+wt/O535J6eFa/+AYbM9fQlv6?= =?us-ascii?Q?GVvozA85W9Fmif2zRnQxiyZSdgAS8boos2rRceo2Yl9q52sW1ythP72b+PEi?= =?us-ascii?Q?qkwyCR/qWAIWr6WZYTW7+LJ/0vJuSEMjf0RYZMaaQw11LYSyvE7OeTZEe/C5?= =?us-ascii?Q?6X+BoubLvQdSPDP//4yXFVKBnyQkgQeLpSGRREyFMrcGi1vP4tva13UPsDXg?= =?us-ascii?Q?1+NfXL+QYCEq5kyHBltLuP0ggd852Lhoqc4P6GTVLe0NcD4EmDwJ+yHH8Z/j?= =?us-ascii?Q?aKiy5+3SYalEhdZ0bo2nzQpOqoITdxJLh0gbl+DIPT8vcLDplDrZ/DyB+iB5?= =?us-ascii?Q?34MGzOpUuKntLm+gXEcvHcDMyMYMVNlO9bYtANmaymUIcMwuYDN4JmHGPWQQ?= =?us-ascii?Q?22dCGETgmiwsfJ9rbgIowo=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 6:iaFaaCXPVQI5osUoAwhOSxe1Fa89wlkr5XDobTys8nRpdgtdqL/iMolZpAZhdItFEKRVcxMrSUZDdLYpNGc89Ll20NQVr1zK2rOw2wdanvA9812FMjs1HIBCbnKoSD6cDffRanNfppenjDKPOyO12plS5CkVz/V12R2DQUNQlZSR2vnc72QuPGQbGHWnarmYCcGI7YsZeR0Va6M3dmbGXs20W8q0E7cG87/MF0cyYly8qMizDbNqRVLYEpCbgImkETKMxl34d2DVeU07UmmfGr7eifCmrmhmOTi/nmfr1KV/ne+Nd2jHeoUBDRgEgZM115LmWwJWjq/XYWduZFCKp4V9dqKx1N6jrisdkHsi7ak=; 5:IKqaLufmdi6mi/ixkRp/dxDabFKIqfpADcWgltqhGS7RTNbTQzdWhNg0HRubLA6EB0xENcHoQFPgCVMKKQxVFdYFluGpNIlvopDRj1Fg/JKnIUDCrrT4ftqFTzA1aPXG2hEeqVRBV1LwT9lfsqoHo18RwAOajpeLLQFK0YLU0jg=; 24:JfU5crHPbFPXss5Q11LyD8YLuGOuzemRWqHC5KQVSxl+sYWR2cbAe7JhHSP1k5AAQdmsa9tKDUAM8bWM2xhbwozCnYCW/OqN0z1y0Hlu1OE=; 7:j6y7wJI8sT8hDPXrpU/8GOSA5L9ffzSLZhWJBbBG2XUOYBw2MWA1QBs6iNPA+oUfUEK2xNtADMAyC0XOVMcnK/KdIxmmt32I5L8pxUOt7M8rlzaTN3EhwDAG+l121tAB3WNiMaZuQjq+xOzRgd5zjX1sPDtSvhxSXL0TRYlwWqnRI7nGhc0eB648nZiRN/qSo0x+UPKUi8+bJRef/0RJZQO3gaB1fRqWpxS2wy5tLdekAUugdklW1kFmEeeseky9 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2018 08:52:39.7954 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 537e0f9b-0c24-42ba-b1a9-08d5751aa445 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB1008 Subject: [PATCH edk2-platforms 04/39] Silicon/NXP : Add support for DUART library X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Feb 2018 08:46:54 -0000 Content-Type: text/plain From: Meenakshi Aggarwal Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Meenakshi Aggarwal --- Silicon/NXP/Library/DUartPortLib/DUart.h | 128 ++++++++ Silicon/NXP/Library/DUartPortLib/DUartPortLib.c | 370 ++++++++++++++++++++++ Silicon/NXP/Library/DUartPortLib/DUartPortLib.inf | 41 +++ 3 files changed, 539 insertions(+) create mode 100644 Silicon/NXP/Library/DUartPortLib/DUart.h create mode 100644 Silicon/NXP/Library/DUartPortLib/DUartPortLib.c create mode 100644 Silicon/NXP/Library/DUartPortLib/DUartPortLib.inf diff --git a/Silicon/NXP/Library/DUartPortLib/DUart.h b/Silicon/NXP/Library/DUartPortLib/DUart.h new file mode 100644 index 0000000..3fa0a68 --- /dev/null +++ b/Silicon/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 +UINT64 +GetBusFrequency ( + VOID + ); + +#endif /* __DUART_H__ */ diff --git a/Silicon/NXP/Library/DUartPortLib/DUartPortLib.c b/Silicon/NXP/Library/DUartPortLib/DUartPortLib.c new file mode 100644 index 0000000..5fcfa9a --- /dev/null +++ b/Silicon/NXP/Library/DUartPortLib/DUartPortLib.c @@ -0,0 +1,370 @@ +/** 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; +} + +/* + * Return Baud divisor on basis of Baudrate + */ +UINT32 +CalculateBaudDivisor ( + IN UINT64 BaudRate + ) +{ + UINTN DUartClk; + UINTN FreqSystemBus; + + FreqSystemBus = GetBusFrequency (); + DUartClk = FreqSystemBus/PcdGet32(PcdPlatformFreqDiv); + + return ((DUartClk)/(BaudRate * 16)); +} + +/* + Initialise the serial port to the specified settings. + All unspecified settings will be set to the default values. + + @return Always return EFI_SUCCESS or EFI_INVALID_PARAMETER. + + **/ +VOID +EFIAPI +DuartInitializePort ( + IN UINT64 BaudRate + ) +{ + UINTN UartBase; + UINT32 BaudDivisor; + + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase); + 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; +} + +/** + Programmed hardware of Serial port. + + @return Always return EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +SerialPortInitialize ( + VOID + ) +{ + UINT64 BaudRate; + BaudRate = (UINTN)PcdGet64 (PcdUartDefaultBaudRate); + + + DuartInitializePort (BaudRate); + + 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 + ) +{ + DuartInitializePort (*BaudRate); + + return EFI_SUCCESS; +} diff --git a/Silicon/NXP/Library/DUartPortLib/DUartPortLib.inf b/Silicon/NXP/Library/DUartPortLib/DUartPortLib.inf new file mode 100644 index 0000000..6940de9 --- /dev/null +++ b/Silicon/NXP/Library/DUartPortLib/DUartPortLib.inf @@ -0,0 +1,41 @@ +# 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 + Silicon/NXP/NxpQoriqLs.dec + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate + gNxpQoriqLsTokenSpaceGuid.PcdPlatformFreqDiv -- 1.9.1