From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.36.41; helo=nam02-sn1-obe.outbound.protection.outlook.com; envelope-from=meenakshi.aggarwal@nxp.com; receiver=edk2-devel@lists.01.org Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0041.outbound.protection.outlook.com [104.47.36.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id B953C2034A7A2 for ; Wed, 22 Nov 2017 01:57:05 -0800 (PST) Received: from DM5PR03CA0049.namprd03.prod.outlook.com (2603:10b6:4:3b::38) by DM2PR0301MB0734.namprd03.prod.outlook.com (2a01:111:e400:3c0d::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.239.5; Wed, 22 Nov 2017 10:01:19 +0000 Received: from BY2FFO11OLC008.protection.gbl (2a01:111:f400:7c0c::103) by DM5PR03CA0049.outlook.office365.com (2603:10b6:4:3b::38) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.239.5 via Frontend Transport; Wed, 22 Nov 2017 10:01:19 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; 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 BY2FFO11OLC008.mail.protection.outlook.com (10.1.14.255) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.218.12 via Frontend Transport; Wed, 22 Nov 2017 10:01:19 +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 vAMA0nI7030922; Wed, 22 Nov 2017 03:01:15 -0700 From: Meenakshi Aggarwal To: , , , Date: Wed, 22 Nov 2017 21:18:55 +0530 Message-ID: <1511365740-1157-4-git-send-email-meenakshi.aggarwal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1511365740-1157-1-git-send-email-meenakshi.aggarwal@nxp.com> References: <1510065736-9394-1-git-send-email-meenakshi.aggarwal@nxp.com> <1511365740-1157-1-git-send-email-meenakshi.aggarwal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131558184793454671; (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)(7966004)(376002)(346002)(39860400002)(39380400002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(6666003)(50986999)(8656006)(316002)(33646002)(575784001)(966005)(86362001)(105606002)(8676002)(498600001)(81166006)(106466001)(81156014)(77096006)(189998001)(36756003)(305945005)(2906002)(53376002)(4326008)(104016004)(8936002)(68736007)(50466002)(6306002)(48376002)(16799955002)(5003940100001)(53936002)(97736004)(2201001)(85426001)(356003)(76176999)(2950100002)(5660300001)(110136005)(47776003)(16586007)(15188155005)(54906003)(50226002)(326664003)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR0301MB0734; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC008; 1:D40G7NoeYkeLvTpYZ96RTMpNcphk6mF44Vg+d5JiXr6SB9mDHaBKwE+SRJNgsA13v0M9gSeyVp5JkqcMTBxhovKNZknMBRFxH+RLvZKJlNzFERux+epFo3jjuh4wixV4 MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ff5cf07b-2d58-4e30-b84f-08d5318ffa5f X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(4534020)(4628075)(201703131517081)(2017052603199); SRVR:DM2PR0301MB0734; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0734; 3:yf9hg5KNGitzQlzh3Z7x+vM4QoFZENNQs3HntquO6RCLA0tx73SaK/hh+AOECVx2tj+zXHpIgtTCFivICb8S/lNMF6Llkz2k3V1TXpW1ZrcooUIAj/QmfRNw0lLFIHL9+0SX0PydLjsNemtq83XLsqu1EKdQ4qXuf7uLbY4izNrWpxlNqM1OiypV7j9jwvNE+8ZDd9uqiyWcTKWApOd1TsKh/o6XbLw9IuJ1s2H+XRqormrYvZi9N4Q9i5IB5GggO9PYSVTcyICs2m1YnWrkplJXcP5S5YZE3fGIwCI7P/AbvGtbhQIKSPcThGKmagxYuClTGoVbQm9Hb0k1b2yyysuJyyl1XJxRvyS0JDq9wnE=; 25:PT/IFaZrtWdeQo+usuYIODIaBNEcdvMGxUohf6FCvloxnfOH1AfRw9hcAnmp7X8Z76Mc4PWU7HGDHmPLXMYUHnJw0DYsDcsXJC9zaUWQOiyf1ho1oucY44t+BxTDATpB69fBmug3XzqQPp1WaD8e5cJ0shX5J8HioRxo6vNCMFSaW31eBFlAz0KIWISZZ7Wga+5H32DcUY9ohyTYgZrA8pf/HzOqhQ2Yz913N8NP8qpft5jY4WSf9rFWk1wjRqR/CaEIMSs31Iva+phuKm/GQAm45+llpNWz+8AVqjoAv4Jx+lv7SG+k+UzCQQsgoeVYGGxe62392s0m6j5gLAirBcMQ7CyVJ+f6cpYc/Sqa9jk= X-MS-TrafficTypeDiagnostic: DM2PR0301MB0734: X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0734; 31:o1Zd41U1nwD2JLcYYRi1D+W6jXfPdXoefpcjHUoccLxlvOKyCKPlUMRqRyb68aHb1Z4/T6zNVG8c0PbifrX0SH5g1g8yuB5c9NRv5TGrjiHltaNN7Y9u+IZ+WUv8T1fHNmphGDs13Mh7ljsLP6jS5EoAB9jY2SL5u42XWP9yOUEtN5jQDphTBQoeQMBe/ie1n5TxrPnQMIKmvtMFkXJufUihUWM5NP26EklyiOLh5cg=; 4:MPVHq62aIqP4yXTlI4Vh+c/UAUXseEHpy5emSiSdsotg1jdMtoH62Eg147yVFiuwH/akRFKt3LgVZK8hRUvWcs2cYpRSPGXG8eaPUw6PT41Dr8Nsp2TKgw7VxSj4XD/nEtm483nKfduDjlEWNA8UA7scADhavKkDzyWu+nS2I5TrV6Qt2IU7AOx/yl6orPPX+kB1p828DJ1F/KcMnsV2Wd1H+8nl3owAw+8CBzNp2hWratiymzaNEiGnUisyoZBaWwGEUaF4E6+t3JKA10jwFkqCXTNNJ8FGAoBWJMS5e3k3RGFl2tR6UF2MnFLP6pIW1RG1B+gDgv3+r5HTFUa/WY+ht4Woc+zxpKTvKehFeyE= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(278428928389397)(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(2401047)(8121501046)(5005006)(3231022)(3002001)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(6055026)(6096035)(20161123563025)(20161123565025)(20161123559100)(20161123561025)(201703131430075)(201703131441075)(201703131448075)(201703131433075)(201703161259150)(20161123556025)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DM2PR0301MB0734; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DM2PR0301MB0734; X-Forefront-PRVS: 0499DAF22A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0301MB0734; 23:24+DNXJxh41FB4u+nwP5b8m3+9YTzDW9yh6a3zF?= =?us-ascii?Q?2JFt2t5f5gSDtSeH+vhBtmZXIouoZlzRYLLlzxlP+IA3A52XbNv2NjcGuiwn?= =?us-ascii?Q?5xgqTS9rtRL/jcfwQNI3C+xqqY0K+z1zbOdKVb48LkgHbW3rgL0ehbRuUeOh?= =?us-ascii?Q?hbJzMtqkCLWQclyhISrJJw5aKNdH+VmKzXCSjqIl7MzjtOzkmpMCbWz/Z0Ns?= =?us-ascii?Q?N9ePNKK9RxMyp9SGw0OCEsH74il/+x3NgObBznkxDieip4Ta08aoG6QQqLQC?= =?us-ascii?Q?HoD1IZiuTKl3qt3/gPUNtP6ccgoN14+1glECNFamHg3kn8miNmfald8OPLBF?= =?us-ascii?Q?3BKbE5ZvbftNpUK7yAS5MSDcppzPlCha3oQuwDQ9kbSga7hbyWlh+cUoLAPQ?= =?us-ascii?Q?1qgjMCml/5a51oF4s3eVehHFM+ZuPfSJX0XLT3S/44/EdHewIx41vbaysMou?= =?us-ascii?Q?g7C1sMyKMGxbIZsLe/vLn7vxxY4XN2JDhm9ulmNik2utKPUOvsJ6li+/MATw?= =?us-ascii?Q?DDtqOTD8f+CUxgcDE3IbjcwW/8dDNkieWpLHZdfbbZzEN/97rsjiIy3f/UK/?= =?us-ascii?Q?AFJFECqHoYxttND3UpCo1WxP6vcGXuHGztDN6HXdEC4vyz6AYor4UZIj5OTf?= =?us-ascii?Q?JFHGyQ6oA8LBV+8y5ueDzywbg3OXItNXaw3yyfcuoAfCaijKuT7ZYcunv0Kf?= =?us-ascii?Q?knEMnu9AR4Pcq0PMbpkDj4LcK6TXrReK0mntBQ1BjBeaKRjoIn+gkgywEs77?= =?us-ascii?Q?eJVJFuXov+iSOW3K8dsJ2VxZhV4Qk7IBNQxf982unkmW9KgDxMAOKCbzFzFT?= =?us-ascii?Q?W9PiwKGeOu1af0EAsFL9F6YM8bAg05U9uc5rt8PRGD6UC8AW7RNnalREY0Ao?= =?us-ascii?Q?rEHSGSDFTDiXLk7z6/Sz8NUFVy8j1xrTnQYMuDpHB+jxhcjKVRKrnhWVdtC5?= =?us-ascii?Q?91xPwQE+0PWwUio2rO5kcRHfuDyH+o+0uIWr/ylbYDgpadg/OL6iuO7nXy2k?= =?us-ascii?Q?yKWKX2SjG14RAdw4o8qcoh7uCCJc9h2yosYoZLkGqeYRi2sArhAkx8ud1nxI?= =?us-ascii?Q?aAMg7eTUGF3fsISMnlKoqUMGFBT7Z5CVQrC9tcV6hqg/l7otVGZlwW6DfLnd?= =?us-ascii?Q?0XFgsQL07UpT6AzFSkuwce7irTdajLy6dL9kGw74ZkdiFzcW6svYx8f5jlg+?= =?us-ascii?Q?5WLDkJIab/qGaCuHduH03bKL0cL8bSqEFqIWGFaonkNuFD9dKVLY7Da8QcaO?= =?us-ascii?Q?eqFm24c1KGxAsRBcqYFGK6y/qw6pQJ1OCVm/3kPdSgEa/i2RerIgBg929x2p?= =?us-ascii?Q?NFMSvPoaljUZysIWStikyFxMPz6MvT8GZCwJNGX6STBhz7YMxtXJNowev980?= =?us-ascii?Q?DJI40XSaxLf4dS0X+4NzfdjdIXSg=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0734; 6:cmcjMzhfdym6FpqQe3GKmeqCVl6/Du1CsL1Z4ImIaS6sOktcMGqCI/3s1C5rnupokWZK9GZERc2czja4Nzf3MfOyZO/jyn582iAalMk+3SZYC3r5Ie1FpKrcDP2DrU96OvHWtMUK61MGNlDL5+/ePmD5AUDxOJcTezRxRHGrEP7W6MVB9N5tjIikYcGNNGXkXbFJVhflW25dWlau5BssiXJ+M2oWp4XDLnHgw459bdnL4ZeHxuzksiubrm94QRKissCjJpl3jPYGkCjt1BCpu6oku6XnW0fcF/7UFGYr073eS1ykzF5hcFc8XLcPcIa+p4p3u4jDHJt28qAu3b8fH4H1bvOMY7tDabea0vZujwY=; 5:ZweNyeiVZIPyCdRL1Pl486+zLEiX4ZxzVV81reesWYq1HEtqQR1imORfwM2BNE/CKZ9sB+lXtrn+FFbmiO/9Rl+bIXwiXWZi54r8XynAl3VEQCjYq8aZvBDEtt8x4TRptWt8a2gq6gPzNs7YRhJBQZZtaO2dihwnqPjGpVRBZbQ=; 24:brku6eZDFwEB5OnhkqcthmNxzwIbjudAtoq7EAyeBtSB9Sb/QKQ0HgodtRuhlwMvm9drcuEi7tUih9cZmnLCqQMbvMIHiQXW0yNiPbBVwEo=; 7:e2NG//PijSYbpLLW4bSZM091OGQb6pla6As9iKDKjvTyazAhT6QheSgNo7og0uuWh1l7YqNiL25+uob1UKBxrCWSmQrajcPdiAGFcI0PVML9x0zaTOWkZSdS2MDZC4jTV8nLLqxmknVDj5e0yRqNd7RjsVbu50ksgg40uQht7+fi+tc6gIuaPqaozQSZFpjdDiwHgq+3ZlZSxrulS1OAlwQm5qkPACWZcBIQWSW3z9jhutpKHw5WPm4Kt1r9VIHi SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2017 10:01:19.1582 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ff5cf07b-2d58-4e30-b84f-08d5318ffa5f 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: DM2PR0301MB0734 Subject: [PATCH v2 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: Wed, 22 Nov 2017 09:57:06 -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..907790b --- /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..b2036b8 --- /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..b7b0be0 --- /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