mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 11:26:12 +08:00
Fix DM320 serial configuration problem
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@661 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
@@ -332,6 +332,4 @@
|
|||||||
(see bug 1887170)
|
(see bug 1887170)
|
||||||
* Pascal P-Code runtime now compiles with the SDCC toolchain.
|
* Pascal P-Code runtime now compiles with the SDCC toolchain.
|
||||||
* Added a generic CAN driver. This driver is untested as of this writing.
|
* Added a generic CAN driver. This driver is untested as of this writing.
|
||||||
|
* Corrected DM320 UART configuration problem
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -990,6 +990,7 @@ nuttx-0.3.8 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
|||||||
(see bug 1887170)
|
(see bug 1887170)
|
||||||
* Pascal P-Code runtime now compiles with the SDCC toolchain.
|
* Pascal P-Code runtime now compiles with the SDCC toolchain.
|
||||||
* Added a generic CAN driver. This driver is untested as of this writing.
|
* Added a generic CAN driver. This driver is untested as of this writing.
|
||||||
|
* Corrected DM320 UART configuration problem
|
||||||
|
|
||||||
pascal-0.1.2 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
pascal-0.1.2 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ NuttX TODO List (Last updated January 6, 2008)
|
|||||||
(0) Applications & Tests (examples/)
|
(0) Applications & Tests (examples/)
|
||||||
(1) ARM (arch/arm/)
|
(1) ARM (arch/arm/)
|
||||||
(1) ARM/C5471 (arch/arm/src/c5471/)
|
(1) ARM/C5471 (arch/arm/src/c5471/)
|
||||||
(2) ARM/DM320 (arch/arm/src/dm320/)
|
(1) ARM/DM320 (arch/arm/src/dm320/)
|
||||||
(2) ARM/LPC214x (arch/arm/src/lpc214x/)
|
(2) ARM/LPC214x (arch/arm/src/lpc214x/)
|
||||||
(4) pjrc-8052 / MCS51 (arch/pjrc-8051/)
|
(4) pjrc-8052 / MCS51 (arch/pjrc-8051/)
|
||||||
(2) z80 (arch/z80/)
|
(2) z80 (arch/z80/)
|
||||||
@@ -304,11 +304,6 @@ o ARM/DM320 (arch/arm/src/dm320/)
|
|||||||
Status: Open
|
Status: Open
|
||||||
Priority: Medium
|
Priority: Medium
|
||||||
|
|
||||||
Description: UART re-configuration is untested and conditionally compiled out.
|
|
||||||
Status: Open
|
|
||||||
Priority: Medium. ttyS1 is not configured, but not used; ttyS0 is configured
|
|
||||||
by the bootloader
|
|
||||||
|
|
||||||
o ARM/LPC214x (arch/arm/src/lpc214x/)
|
o ARM/LPC214x (arch/arm/src/lpc214x/)
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|||||||
@@ -49,11 +49,11 @@
|
|||||||
* board bring-up and not part of normal platform configuration.
|
* board bring-up and not part of normal platform configuration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#undef CONFIG_SUPPRESS_INTERRUPTS /* Do not enable interrupts */
|
#undef CONFIG_SUPPRESS_INTERRUPTS /* DEFINED: Do not enable interrupts */
|
||||||
#undef CONFIG_SUPPRESS_TIMER_INTS /* No timer */
|
#undef CONFIG_SUPPRESS_TIMER_INTS /* DEFINED: No timer */
|
||||||
#undef CONFIG_SUPPRESS_SERIAL_INTS /* Console will poll */
|
#undef CONFIG_SUPPRESS_SERIAL_INTS /* DEFINED: Console will poll */
|
||||||
#define CONFIG_SUPPRESS_UART_CONFIG 1 /* Do not reconfig UART */
|
#undef CONFIG_SUPPRESS_UART_CONFIG /* DEFINED: Do not reconfig UART */
|
||||||
#undef CONFIG_DUMP_ON_EXIT /* Dump task state on exit */
|
#undef CONFIG_DUMP_ON_EXIT /* DEFINED: Dump task state on exit */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
|
|||||||
@@ -379,7 +379,7 @@ static int up_setup(struct uart_dev_s *dev)
|
|||||||
|
|
||||||
/* Setup the new UART configuration */
|
/* Setup the new UART configuration */
|
||||||
|
|
||||||
up_serialout(priv,UART_MSR, priv->msr);
|
up_serialout(priv, UART_MSR, priv->msr);
|
||||||
up_serialout(priv, UART_BRSR, brsr);
|
up_serialout(priv, UART_BRSR, brsr);
|
||||||
up_enablebreaks(priv, FALSE);
|
up_enablebreaks(priv, FALSE);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -70,24 +70,28 @@
|
|||||||
#define UART_DTRR_DTR_MASK 0x00ff /* Data transmit/receive */
|
#define UART_DTRR_DTR_MASK 0x00ff /* Data transmit/receive */
|
||||||
|
|
||||||
/* UART BRSR register bit definitions */
|
/* UART BRSR register bit definitions */
|
||||||
/* The UART clock is half of the ARM clock */
|
/* The UART module is clocked by either the AHB clock or PLLIN / 16 */
|
||||||
|
|
||||||
#define UART_CLK (DM320_ARM_CLOCK / 2)
|
#ifdef CONFIG_DM320_UARTPPLIN
|
||||||
|
# define UART_REFCLK (27000000 / 16)
|
||||||
|
#else
|
||||||
|
# define UART_REFCLK (DM320_AHB_CLOCK / 16)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* And baud rate = UART_CLK / 16 / (VALUE+1) */
|
/* And baud = UART_REFCLK / (brsr+1) */
|
||||||
|
|
||||||
#define UART_BAUD_2400 ((uint16)(((UART_CLK / 16) / 2400 ) - 1))
|
#define UART_BAUD_2400 ((uint16)((UART_REFCLK / 2400 ) - 1))
|
||||||
#define UART_BAUD_4800 ((uint16)(((UART_CLK / 16) / 4800 ) - 1))
|
#define UART_BAUD_4800 ((uint16)((UART_REFCLK / 4800 ) - 1))
|
||||||
#define UART_BAUD_9600 ((uint16)(((UART_CLK / 16) / 9600 ) - 1))
|
#define UART_BAUD_9600 ((uint16)((UART_REFCLK / 9600 ) - 1))
|
||||||
#define UART_BAUD_14400 ((uint16)(((UART_CLK / 16) / 14400 ) - 1))
|
#define UART_BAUD_14400 ((uint16)((UART_REFCLK / 14400 ) - 1))
|
||||||
#define UART_BAUD_19200 ((uint16)(((UART_CLK / 16) / 19200 ) - 1))
|
#define UART_BAUD_19200 ((uint16)((UART_REFCLK / 19200 ) - 1))
|
||||||
#define UART_BAUD_28800 ((uint16)(((UART_CLK / 16) / 28800 ) - 1))
|
#define UART_BAUD_28800 ((uint16)((UART_REFCLK / 28800 ) - 1))
|
||||||
#define UART_BAUD_38400 ((uint16)(((UART_CLK / 16) / 38400 ) - 1))
|
#define UART_BAUD_38400 ((uint16)((UART_REFCLK / 38400 ) - 1))
|
||||||
#define UART_BAUD_57600 ((uint16)(((UART_CLK / 16) / 57600 ) - 1))
|
#define UART_BAUD_57600 ((uint16)((UART_REFCLK / 57600 ) - 1))
|
||||||
#define UART_BAUD_115200 ((uint16)(((UART_CLK / 16) / 115200) - 1))
|
#define UART_BAUD_115200 ((uint16)((UART_REFCLK / 115200) - 1))
|
||||||
#define UART_BAUD_230400 ((uint16)(((UART_CLK / 16) / 230400) - 1))
|
#define UART_BAUD_230400 ((uint16)((UART_REFCLK / 230400) - 1))
|
||||||
#define UART_BAUD_460800 ((uint16)(((UART_CLK / 16) / 460800) - 1))
|
#define UART_BAUD_460800 ((uint16)((UART_REFCLK / 460800) - 1))
|
||||||
#define UART_BAUD_921600 ((uint16)(((UART_CLK / 16) / 921600) - 1))
|
#define UART_BAUD_921600 ((uint16)((UART_REFCLK / 921600) - 1))
|
||||||
|
|
||||||
/* UART MSR register bit definitions */
|
/* UART MSR register bit definitions */
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* arch/board/board.h
|
* arch/board/board.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
* notice, this list of conditions and the following disclaimer in
|
* notice, this list of conditions and the following disclaimer in
|
||||||
* the documentation and/or other materials provided with the
|
* the documentation and/or other materials provided with the
|
||||||
* distribution.
|
* distribution.
|
||||||
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
|
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||||
* used to endorse or promote products derived from this software
|
* used to endorse or promote products derived from this software
|
||||||
* without specific prior written permission.
|
* without specific prior written permission.
|
||||||
*
|
*
|
||||||
@@ -56,9 +56,12 @@
|
|||||||
#define DM320_AXL_CLOCK 175500000
|
#define DM320_AXL_CLOCK 175500000
|
||||||
#define DM320_AHB_CLOCK 87750000
|
#define DM320_AHB_CLOCK 87750000
|
||||||
|
|
||||||
/*
|
/* UART0/1 and TIMER0/1 are clocked by PLLIN=27MHz */
|
||||||
* configration for dm9000 network device
|
|
||||||
*/
|
#define CONFIG_DM320_UARTPPLIN 1
|
||||||
|
|
||||||
|
/* Configration for dm9000 network device */
|
||||||
|
|
||||||
#define DM9000_BASE CONFIG_DM9000_BASE
|
#define DM9000_BASE CONFIG_DM9000_BASE
|
||||||
|
|
||||||
/* GIO keyboard (GIO 1-5) */
|
/* GIO keyboard (GIO 1-5) */
|
||||||
|
|||||||
+34
-19
@@ -106,6 +106,7 @@ static int can_open(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct can_dev_s *dev = inode->i_private;
|
FAR struct can_dev_s *dev = inode->i_private;
|
||||||
|
ubyte tmp;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
/* If the port is the middle of closing, wait until the close is finished */
|
/* If the port is the middle of closing, wait until the close is finished */
|
||||||
@@ -121,29 +122,43 @@ static int can_open(FAR struct file *filep)
|
|||||||
* the device.
|
* the device.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (++dev->cd_ocount == 1)
|
tmp = dev->cd_ocount + 1;
|
||||||
|
if (tmp == 0)
|
||||||
{
|
{
|
||||||
irqstate_t flags = irqsave();
|
/* More than 255 opens; ubyte overflows to zero */
|
||||||
|
|
||||||
/* Configure hardware interrupts */
|
ret = -EMFILE;
|
||||||
|
|
||||||
ret = dev_setup(dev);
|
|
||||||
if (ret == OK)
|
|
||||||
{
|
|
||||||
/* Mark the FIFOs empty */
|
|
||||||
|
|
||||||
dev->cd_xmit.cf_head = 0;
|
|
||||||
dev->cd_xmit.cf_tail = 0;
|
|
||||||
dev->cd_recv.cf_head = 0;
|
|
||||||
dev->cd_recv.cf_tail = 0;
|
|
||||||
|
|
||||||
/* Finally, Enable CAN interrupt */
|
|
||||||
|
|
||||||
dev_rxint(dev, TRUE);
|
|
||||||
}
|
|
||||||
irqrestore(flags);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check if this is the first time that the driver has been opened. */
|
||||||
|
|
||||||
|
if (tmp == 1)
|
||||||
|
{
|
||||||
|
/* Yes.. perform one time hardware initialization. */
|
||||||
|
|
||||||
|
irqstate_t flags = irqsave();
|
||||||
|
ret = dev_setup(dev);
|
||||||
|
if (ret == OK)
|
||||||
|
{
|
||||||
|
/* Mark the FIFOs empty */
|
||||||
|
|
||||||
|
dev->cd_xmit.cf_head = 0;
|
||||||
|
dev->cd_xmit.cf_tail = 0;
|
||||||
|
dev->cd_recv.cf_head = 0;
|
||||||
|
dev->cd_recv.cf_tail = 0;
|
||||||
|
|
||||||
|
/* Finally, Enable the CAN RX interrupt */
|
||||||
|
|
||||||
|
dev_rxint(dev, TRUE);
|
||||||
|
|
||||||
|
/* Save the new open count on success */
|
||||||
|
|
||||||
|
dev->cd_ocount = tmp;
|
||||||
|
}
|
||||||
|
irqrestore(flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
sem_post(&dev->cd_closesem);
|
sem_post(&dev->cd_closesem);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
+77
-56
@@ -67,11 +67,11 @@
|
|||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static int uart_open(struct file *filep);
|
static int uart_open(FAR struct file *filep);
|
||||||
static int uart_close(struct file *filep);
|
static int uart_close(FAR struct file *filep);
|
||||||
static ssize_t uart_read(struct file *filep, char *buffer, size_t buflen);
|
static ssize_t uart_read(FAR struct file *filep, FAR char *buffer, size_t buflen);
|
||||||
static ssize_t uart_write(struct file *filep, const char *buffer, size_t buflen);
|
static ssize_t uart_write(FAR struct file *filep, FAR const char *buffer, size_t buflen);
|
||||||
static int uart_ioctl(struct file *filep, int cmd, unsigned long arg);
|
static int uart_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Private Variables
|
* Private Variables
|
||||||
@@ -95,7 +95,7 @@ struct file_operations g_serialops =
|
|||||||
* Name: uart_takesem
|
* Name: uart_takesem
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static void uart_takesem(sem_t *sem)
|
static void uart_takesem(FAR sem_t *sem)
|
||||||
{
|
{
|
||||||
while (sem_wait(sem) != 0)
|
while (sem_wait(sem) != 0)
|
||||||
{
|
{
|
||||||
@@ -111,7 +111,7 @@ static void uart_takesem(sem_t *sem)
|
|||||||
* Name: uart_givesem
|
* Name: uart_givesem
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static inline void uart_givesem(sem_t *sem)
|
static inline void uart_givesem(FAR sem_t *sem)
|
||||||
{
|
{
|
||||||
(void)sem_post(sem);
|
(void)sem_post(sem);
|
||||||
}
|
}
|
||||||
@@ -120,7 +120,7 @@ static inline void uart_givesem(sem_t *sem)
|
|||||||
* Name: uart_putxmitchar
|
* Name: uart_putxmitchar
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static void uart_putxmitchar(uart_dev_t *dev, int ch)
|
static void uart_putxmitchar(FAR uart_dev_t *dev, int ch)
|
||||||
{
|
{
|
||||||
int nexthead = dev->xmit.head + 1;
|
int nexthead = dev->xmit.head + 1;
|
||||||
if (nexthead >= dev->xmit.size)
|
if (nexthead >= dev->xmit.size)
|
||||||
@@ -159,7 +159,7 @@ static void uart_putxmitchar(uart_dev_t *dev, int ch)
|
|||||||
* Name: uart_irqwrite
|
* Name: uart_irqwrite
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static ssize_t uart_irqwrite(uart_dev_t *dev, const char *buffer, size_t buflen)
|
static ssize_t uart_irqwrite(FAR uart_dev_t *dev, FAR const char *buffer, size_t buflen)
|
||||||
{
|
{
|
||||||
ssize_t ret = buflen;
|
ssize_t ret = buflen;
|
||||||
|
|
||||||
@@ -185,11 +185,11 @@ static ssize_t uart_irqwrite(uart_dev_t *dev, const char *buffer, size_t buflen)
|
|||||||
* Name: uart_write
|
* Name: uart_write
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static ssize_t uart_write(struct file *filep, const char *buffer, size_t buflen)
|
static ssize_t uart_write(FAR struct file *filep, FAR const char *buffer, size_t buflen)
|
||||||
{
|
{
|
||||||
struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
uart_dev_t *dev = inode->i_private;
|
FAR uart_dev_t *dev = inode->i_private;
|
||||||
ssize_t ret = buflen;
|
ssize_t ret = buflen;
|
||||||
|
|
||||||
/* We may receive console writes through this path from
|
/* We may receive console writes through this path from
|
||||||
* interrupt handlers and from debug output in the IDLE task!
|
* interrupt handlers and from debug output in the IDLE task!
|
||||||
@@ -251,11 +251,11 @@ static ssize_t uart_write(struct file *filep, const char *buffer, size_t buflen)
|
|||||||
* Name: uart_read
|
* Name: uart_read
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static ssize_t uart_read(struct file *filep, char *buffer, size_t buflen)
|
static ssize_t uart_read(FAR struct file *filep, FAR char *buffer, size_t buflen)
|
||||||
{
|
{
|
||||||
struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
uart_dev_t *dev = inode->i_private;
|
FAR uart_dev_t *dev = inode->i_private;
|
||||||
ssize_t ret = buflen;
|
ssize_t ret = buflen;
|
||||||
|
|
||||||
/* Only one user can be accessing dev->recv.tail at once */
|
/* Only one user can be accessing dev->recv.tail at once */
|
||||||
|
|
||||||
@@ -301,10 +301,10 @@ static ssize_t uart_read(struct file *filep, char *buffer, size_t buflen)
|
|||||||
* Name: uart_ioctl
|
* Name: uart_ioctl
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static int uart_ioctl(struct file *filep, int cmd, unsigned long arg)
|
static int uart_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
uart_dev_t *dev = inode->i_private;
|
FAR uart_dev_t *dev = inode->i_private;
|
||||||
|
|
||||||
return dev->ops->ioctl(filep, cmd, arg);
|
return dev->ops->ioctl(filep, cmd, arg);
|
||||||
}
|
}
|
||||||
@@ -318,11 +318,11 @@ static int uart_ioctl(struct file *filep, int cmd, unsigned long arg)
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static int uart_close(struct file *filep)
|
static int uart_close(FAR struct file *filep)
|
||||||
{
|
{
|
||||||
struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
uart_dev_t *dev = inode->i_private;
|
FAR uart_dev_t *dev = inode->i_private;
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
|
|
||||||
uart_takesem(&dev->closesem);
|
uart_takesem(&dev->closesem);
|
||||||
if (dev->open_count > 1)
|
if (dev->open_count > 1)
|
||||||
@@ -384,10 +384,11 @@ static int uart_close(struct file *filep)
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
static int uart_open(struct file *filep)
|
static int uart_open(FAR struct file *filep)
|
||||||
{
|
{
|
||||||
struct inode *inode = filep->f_inode;
|
struct inode *inode = filep->f_inode;
|
||||||
uart_dev_t *dev = inode->i_private;
|
uart_dev_t *dev = inode->i_private;
|
||||||
|
ubyte tmp;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
/* If the port is the middle of closing, wait until the close is finished */
|
/* If the port is the middle of closing, wait until the close is finished */
|
||||||
@@ -395,39 +396,59 @@ static int uart_open(struct file *filep)
|
|||||||
uart_takesem(&dev->closesem);
|
uart_takesem(&dev->closesem);
|
||||||
|
|
||||||
/* Start up serial port */
|
/* Start up serial port */
|
||||||
|
/* Increment the count of references to the device. */
|
||||||
|
|
||||||
if (++dev->open_count == 1)
|
tmp = dev->open_count + 1;
|
||||||
|
if (tmp == 0)
|
||||||
{
|
{
|
||||||
irqstate_t flags = irqsave();
|
/* More than 255 opens; ubyte overflows to zero */
|
||||||
|
|
||||||
/* If this is the console, then the UART has already been initialized. */
|
ret = -EMFILE;
|
||||||
|
|
||||||
if (!dev->isconsole)
|
|
||||||
{
|
|
||||||
uart_setup(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* In any event, we do have to configure for interrupt driven mode of
|
|
||||||
* operation. Attach the hardware IRQ(s)
|
|
||||||
*/
|
|
||||||
|
|
||||||
ret = uart_attach(dev);
|
|
||||||
if (ret == OK)
|
|
||||||
{
|
|
||||||
/* Mark the io buffers empty */
|
|
||||||
|
|
||||||
dev->xmit.head = 0;
|
|
||||||
dev->xmit.tail = 0;
|
|
||||||
dev->recv.head = 0;
|
|
||||||
dev->recv.tail = 0;
|
|
||||||
|
|
||||||
/* Finally, enable the RX interrupt */
|
|
||||||
|
|
||||||
uart_enablerxint(dev);
|
|
||||||
}
|
|
||||||
irqrestore(flags);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check if this is the first time that the driver has been opened. */
|
||||||
|
|
||||||
|
if (tmp == 1)
|
||||||
|
{
|
||||||
|
irqstate_t flags = irqsave();
|
||||||
|
|
||||||
|
/* If this is the console, then the UART has already been initialized. */
|
||||||
|
|
||||||
|
if (!dev->isconsole)
|
||||||
|
{
|
||||||
|
/* Perform one time hardware initialization */
|
||||||
|
|
||||||
|
uart_setup(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In any event, we do have to configure for interrupt driven mode of
|
||||||
|
* operation. Attach the hardware IRQ(s). Hmm.. should shutdown() the
|
||||||
|
* the device in the rare case that uart_attach() fails, tmp==1, and
|
||||||
|
* this is not the console.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = uart_attach(dev);
|
||||||
|
if (ret == OK)
|
||||||
|
{
|
||||||
|
/* Mark the io buffers empty */
|
||||||
|
|
||||||
|
dev->xmit.head = 0;
|
||||||
|
dev->xmit.tail = 0;
|
||||||
|
dev->recv.head = 0;
|
||||||
|
dev->recv.tail = 0;
|
||||||
|
|
||||||
|
/* Enable the RX interrupt */
|
||||||
|
|
||||||
|
uart_enablerxint(dev);
|
||||||
|
|
||||||
|
/* Save the new open count on success */
|
||||||
|
|
||||||
|
dev->open_count = tmp;
|
||||||
|
}
|
||||||
|
irqrestore(flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
uart_givesem(&dev->closesem);
|
uart_givesem(&dev->closesem);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -444,7 +465,7 @@ static int uart_open(struct file *filep)
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
int uart_register(const char *path, uart_dev_t *dev)
|
int uart_register(FAR const char *path, FAR uart_dev_t *dev)
|
||||||
{
|
{
|
||||||
sem_init(&dev->xmit.sem, 0, 1);
|
sem_init(&dev->xmit.sem, 0, 1);
|
||||||
sem_init(&dev->recv.sem, 0, 1);
|
sem_init(&dev->recv.sem, 0, 1);
|
||||||
@@ -467,7 +488,7 @@ int uart_register(const char *path, uart_dev_t *dev)
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
void uart_xmitchars(uart_dev_t *dev)
|
void uart_xmitchars(FAR uart_dev_t *dev)
|
||||||
{
|
{
|
||||||
/* Send while we still have data & room in the fifo */
|
/* Send while we still have data & room in the fifo */
|
||||||
|
|
||||||
@@ -508,7 +529,7 @@ void uart_xmitchars(uart_dev_t *dev)
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
void uart_recvchars(uart_dev_t *dev)
|
void uart_recvchars(FAR uart_dev_t *dev)
|
||||||
{
|
{
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
int nexthead = dev->recv.head + 1;
|
int nexthead = dev->recv.head + 1;
|
||||||
|
|||||||
+14
-6
@@ -49,14 +49,22 @@
|
|||||||
* Definitions
|
* Definitions
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
/* Default configuration settings that may be overridden in the board configuration file */
|
/* Default configuration settings that may be overridden in the board configuration.
|
||||||
|
* file. The configured size is limited to 255 to fit into a ubyte.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_CAN_FIFOSIZE
|
#if !defined(CONFIG_CAN_FIFOSIZE)
|
||||||
# define CONFIG_CAN_FIFOSIZE 8
|
# define CONFIG_CAN_FIFOSIZE 8
|
||||||
|
#elif CONFIG_CAN_FIFOSIZE > 255
|
||||||
|
# undef CONFIG_CAN_FIFOSIZE
|
||||||
|
# define CONFIG_CAN_FIFOSIZE 255
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONFIG_CAN_NPENDINGRTR
|
#if !defined(CONFIG_CAN_NPENDINGRTR)
|
||||||
# define CONFIG_CAN_NPENDINGRTR 4
|
# define CONFIG_CAN_NPENDINGRTR 4
|
||||||
|
#elif CONFIG_CAN_NPENDINGRTR > 255
|
||||||
|
# undef CONFIG_CAN_NPENDINGRTR
|
||||||
|
# define CONFIG_CAN_NPENDINGRTR 255
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Convenience macros */
|
/* Convenience macros */
|
||||||
@@ -206,8 +214,8 @@ struct can_ops_s
|
|||||||
|
|
||||||
struct can_dev_s
|
struct can_dev_s
|
||||||
{
|
{
|
||||||
int cd_ocount; /* The number of times the device has been opened */
|
ubyte cd_ocount; /* The number of times the device has been opened */
|
||||||
int cd_npendrtr; /* Number of pending RTR messages */
|
ubyte cd_npendrtr; /* Number of pending RTR messages */
|
||||||
sem_t cd_closesem; /* Locks out new opens while close is in progress */
|
sem_t cd_closesem; /* Locks out new opens while close is in progress */
|
||||||
sem_t cd_recvsem; /* Used to wakeup user waiting for space in cd_recv.buffer */
|
sem_t cd_recvsem; /* Used to wakeup user waiting for space in cd_recv.buffer */
|
||||||
struct can_fifo_s cd_xmit; /* Describes transmit FIFO */
|
struct can_fifo_s cd_xmit; /* Describes transmit FIFO */
|
||||||
@@ -222,7 +230,7 @@ struct can_dev_s
|
|||||||
|
|
||||||
struct canioctl_rtr_s
|
struct canioctl_rtr_s
|
||||||
{
|
{
|
||||||
uint16 ci_id; /* The ID to use in the RTR message */
|
uint16 ci_id; /* The 11-bit ID to use in the RTR message */
|
||||||
FAR struct can_msg_s *ci_msg; /* The location to return the RTR response */
|
FAR struct can_msg_s *ci_msg; /* The location to return the RTR response */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+16
-16
@@ -97,14 +97,14 @@ struct uart_ops_s
|
|||||||
* performed when the attach() method is called.
|
* performed when the attach() method is called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int (*setup)(struct uart_dev_s *dev);
|
CODE int (*setup)(FAR struct uart_dev_s *dev);
|
||||||
|
|
||||||
/* Disable the UART. This method is called when the serial port is closed.
|
/* Disable the UART. This method is called when the serial port is closed.
|
||||||
* This method reverses the operation the setup method. NOTE that the serial
|
* This method reverses the operation the setup method. NOTE that the serial
|
||||||
* console is never shutdown.
|
* console is never shutdown.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void (*shutdown)(struct uart_dev_s *dev);
|
CODE void (*shutdown)(FAR struct uart_dev_s *dev);
|
||||||
|
|
||||||
/* Configure the UART to operation in interrupt driven mode. This method is
|
/* Configure the UART to operation in interrupt driven mode. This method is
|
||||||
* called when the serial port is opened. Normally, this is just after the
|
* called when the serial port is opened. Normally, this is just after the
|
||||||
@@ -116,47 +116,47 @@ struct uart_ops_s
|
|||||||
* interrupts are not enabled until the txint() and rxint() methods are called.
|
* interrupts are not enabled until the txint() and rxint() methods are called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int (*attach)(struct uart_dev_s *dev);
|
CODE int (*attach)(FAR struct uart_dev_s *dev);
|
||||||
|
|
||||||
/* Detach UART interrupts. This method is called when the serial port is
|
/* Detach UART interrupts. This method is called when the serial port is
|
||||||
* closed normally just before the shutdown method is called. The exception is
|
* closed normally just before the shutdown method is called. The exception is
|
||||||
* the serial console which is never shutdown.
|
* the serial console which is never shutdown.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void (*detach)(struct uart_dev_s *dev);
|
CODE void (*detach)(FAR struct uart_dev_s *dev);
|
||||||
|
|
||||||
/* All ioctl calls will be routed through this method */
|
/* All ioctl calls will be routed through this method */
|
||||||
|
|
||||||
int (*ioctl)(struct file *filep, int cmd, unsigned long arg);
|
CODE int (*ioctl)(FAR struct file *filep, int cmd, unsigned long arg);
|
||||||
|
|
||||||
/* Called (usually) from the interrupt level to receive one character from
|
/* Called (usually) from the interrupt level to receive one character from
|
||||||
* the UART. Error bits associated with the receipt are provided in the
|
* the UART. Error bits associated with the receipt are provided in the
|
||||||
* the return 'status'.
|
* the return 'status'.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int (*receive)(struct uart_dev_s *dev, unsigned int *status);
|
CODE int (*receive)(FAR struct uart_dev_s *dev, unsigned int *status);
|
||||||
|
|
||||||
/* Call to enable or disable RX interrupts */
|
/* Call to enable or disable RX interrupts */
|
||||||
|
|
||||||
void (*rxint)(struct uart_dev_s *dev, boolean enable);
|
CODE void (*rxint)(FAR struct uart_dev_s *dev, boolean enable);
|
||||||
|
|
||||||
/* Return TRUE if the receive data is available */
|
/* Return TRUE if the receive data is available */
|
||||||
|
|
||||||
boolean (*rxavailable)(struct uart_dev_s *dev);
|
CODE boolean (*rxavailable)(FAR struct uart_dev_s *dev);
|
||||||
|
|
||||||
/* This method will send one byte on the UART */
|
/* This method will send one byte on the UART */
|
||||||
|
|
||||||
void (*send)(struct uart_dev_s *dev, int ch);
|
CODE void (*send)(FAR struct uart_dev_s *dev, int ch);
|
||||||
|
|
||||||
/* Call to enable or disable TX interrupts */
|
/* Call to enable or disable TX interrupts */
|
||||||
|
|
||||||
void (*txint)(struct uart_dev_s *dev, boolean enable);
|
CODE void (*txint)(FAR struct uart_dev_s *dev, boolean enable);
|
||||||
|
|
||||||
/* Return TRUE if the tranmsit hardware is ready to send another byte. This
|
/* Return TRUE if the tranmsit hardware is ready to send another byte. This
|
||||||
* is used to determine if send() method can be called.
|
* is used to determine if send() method can be called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
boolean (*txready)(struct uart_dev_s *dev);
|
CODE boolean (*txready)(FAR struct uart_dev_s *dev);
|
||||||
|
|
||||||
/* Return TRUE if all characters have been sent. If for example, the UART
|
/* Return TRUE if all characters have been sent. If for example, the UART
|
||||||
* hardware implements FIFOs, then this would mean the the transmit FIFO is
|
* hardware implements FIFOs, then this would mean the the transmit FIFO is
|
||||||
@@ -164,7 +164,7 @@ struct uart_ops_s
|
|||||||
* all characters are "drained" from the TX hardware.
|
* all characters are "drained" from the TX hardware.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
boolean (*txempty)(struct uart_dev_s *dev);
|
CODE boolean (*txempty)(FAR struct uart_dev_s *dev);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This is the device structure used by the driver. The caller of
|
/* This is the device structure used by the driver. The caller of
|
||||||
@@ -179,7 +179,7 @@ struct uart_ops_s
|
|||||||
|
|
||||||
struct uart_dev_s
|
struct uart_dev_s
|
||||||
{
|
{
|
||||||
int open_count; /* The number of times
|
ubyte open_count; /* The number of times
|
||||||
* the device has been opened */
|
* the device has been opened */
|
||||||
boolean xmitwaiting; /* TRUE: User is waiting
|
boolean xmitwaiting; /* TRUE: User is waiting
|
||||||
* for space in xmit.buffer */
|
* for space in xmit.buffer */
|
||||||
@@ -223,7 +223,7 @@ extern "C" {
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
EXTERN int uart_register(const char *path, uart_dev_t *dev);
|
EXTERN int uart_register(FAR const char *path, FAR uart_dev_t *dev);
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Name: uart_xmitchars
|
* Name: uart_xmitchars
|
||||||
@@ -236,7 +236,7 @@ EXTERN int uart_register(const char *path, uart_dev_t *dev);
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
EXTERN void uart_xmitchars(uart_dev_t *dev);
|
EXTERN void uart_xmitchars(FAR uart_dev_t *dev);
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Name: uart_receivechars
|
* Name: uart_receivechars
|
||||||
@@ -249,7 +249,7 @@ EXTERN void uart_xmitchars(uart_dev_t *dev);
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
EXTERN void uart_recvchars(uart_dev_t *dev);
|
EXTERN void uart_recvchars(FAR uart_dev_t *dev);
|
||||||
|
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
|
|||||||
Reference in New Issue
Block a user