forked from Imagelibrary/rtems
termios: Update due to API changes
Termios notifies now the driver about an inactive transmit with the length argument set to zero.
This commit is contained in:
@@ -294,11 +294,13 @@ static ssize_t imx_uart_poll_write(int minor, const char *buf, size_t len)
|
|||||||
#if defined(USE_INTERRUPTS)
|
#if defined(USE_INTERRUPTS)
|
||||||
static ssize_t imx_uart_intr_write(int minor, const char *buf, size_t len)
|
static ssize_t imx_uart_intr_write(int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
imx_uart_data[minor].buf = buf;
|
if (len > 0) {
|
||||||
imx_uart_data[minor].len = len;
|
imx_uart_data[minor].buf = buf;
|
||||||
imx_uart_data[minor].idx = 0;
|
imx_uart_data[minor].len = len;
|
||||||
|
imx_uart_data[minor].idx = 0;
|
||||||
|
|
||||||
imx_uart_data[minor].regs->cr1 |= MC9328MXL_UART_CR1_TXMPTYEN;
|
imx_uart_data[minor].regs->cr1 |= MC9328MXL_UART_CR1_TXMPTYEN;
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -371,8 +371,6 @@ BSP_uart_termios_set(int uart, void *ttyp)
|
|||||||
int
|
int
|
||||||
BSP_uart_termios_write_com1(int minor, const char *buf, int len)
|
BSP_uart_termios_write_com1(int minor, const char *buf, int len)
|
||||||
{
|
{
|
||||||
assert(buf != NULL);
|
|
||||||
|
|
||||||
if(len <= 0)
|
if(len <= 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@@ -410,8 +408,6 @@ BSP_uart_termios_write_com1(int minor, const char *buf, int len)
|
|||||||
int
|
int
|
||||||
BSP_uart_termios_write_com2(int minor, const char *buf, int len)
|
BSP_uart_termios_write_com2(int minor, const char *buf, int len)
|
||||||
{
|
{
|
||||||
assert(buf != NULL);
|
|
||||||
|
|
||||||
if(len <= 0)
|
if(len <= 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -114,11 +114,10 @@ static int mmconsole_set_attributes(int minor, const struct termios *t)
|
|||||||
|
|
||||||
static ssize_t mmconsole_write(int minor, const char *buf, size_t n)
|
static ssize_t mmconsole_write(int minor, const char *buf, size_t n)
|
||||||
{
|
{
|
||||||
rtems_interrupt_level level;
|
if (n > 0) {
|
||||||
|
MM_WRITE(MM_UART_RXTX, *buf);
|
||||||
|
}
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
|
||||||
MM_WRITE(MM_UART_RXTX, *buf);
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -382,18 +382,15 @@ static ssize_t IntUartInterruptWrite(
|
|||||||
size_t len
|
size_t len
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
rtems_interrupt_level level;
|
if (len > 0) {
|
||||||
|
/* write out character */
|
||||||
|
MCF5282_UART_UTB(minor) = *buf;
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
/* enable tx interrupt */
|
||||||
|
IntUartInfo[minor].uimr |= MCF5282_UART_UIMR_TXRDY;
|
||||||
|
MCF5282_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
||||||
|
}
|
||||||
|
|
||||||
/* write out character */
|
|
||||||
MCF5282_UART_UTB(minor) = *buf;
|
|
||||||
|
|
||||||
/* enable tx interrupt */
|
|
||||||
IntUartInfo[minor].uimr |= MCF5282_UART_UIMR_TXRDY;
|
|
||||||
MCF5282_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -172,12 +172,16 @@ static ssize_t
|
|||||||
InterruptWrite (int minor, const char *buf, size_t len)
|
InterruptWrite (int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
if (minor==UART_CHANNEL_A) {
|
if (minor==UART_CHANNEL_A) {
|
||||||
if (len>0) DUTBA=*buf;
|
if (len>0) {
|
||||||
Enable_Interrupts_Tx_A;
|
DUTBA=*buf;
|
||||||
|
Enable_Interrupts_Tx_A;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (minor==UART_CHANNEL_B) {
|
else if (minor==UART_CHANNEL_B) {
|
||||||
if (len>0) DUTBB=*buf;
|
if (len>0) {
|
||||||
Enable_Interrupts_Tx_B;
|
DUTBB=*buf;
|
||||||
|
Enable_Interrupts_Tx_B;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -231,9 +231,12 @@ smc1PollRead (int minor)
|
|||||||
static ssize_t
|
static ssize_t
|
||||||
smc1InterruptWrite (int minor, const char *buf, size_t len)
|
smc1InterruptWrite (int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
smcTxBd->buffer = (char *)buf;
|
if (len > 0) {
|
||||||
smcTxBd->length = len;
|
smcTxBd->buffer = (char *)buf;
|
||||||
smcTxBd->status = M360_BD_READY | M360_BD_WRAP | M360_BD_INTERRUPT;
|
smcTxBd->length = len;
|
||||||
|
smcTxBd->status = M360_BD_READY | M360_BD_WRAP | M360_BD_INTERRUPT;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -528,18 +528,15 @@ IntUartInitialize(void)
|
|||||||
static ssize_t
|
static ssize_t
|
||||||
IntUartInterruptWrite (int minor, const char *buf, size_t len)
|
IntUartInterruptWrite (int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
int level;
|
if (len > 0) {
|
||||||
|
/* write out character */
|
||||||
|
*(volatile uint8_t *)(&MCF548X_PSC_TB(minor)) = *buf;
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
/* enable tx interrupt */
|
||||||
|
IntUartInfo[minor].imr |= MCF548X_PSC_IMR_TXRDY;
|
||||||
|
MCF548X_PSC_IMR(minor) = IntUartInfo[minor].imr;
|
||||||
|
}
|
||||||
|
|
||||||
/* write out character */
|
|
||||||
*(volatile uint8_t *)(&MCF548X_PSC_TB(minor)) = *buf;
|
|
||||||
|
|
||||||
/* enable tx interrupt */
|
|
||||||
IntUartInfo[minor].imr |= MCF548X_PSC_IMR_TXRDY;
|
|
||||||
MCF548X_PSC_IMR(minor) = IntUartInfo[minor].imr;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -341,18 +341,15 @@ static void IntUartInitialize(void)
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
|
static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
int level;
|
if (len > 0) {
|
||||||
|
/* write out character */
|
||||||
|
MCF_UART_UTB(minor) = *buf;
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
/* enable tx interrupt */
|
||||||
|
IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
|
||||||
|
MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
||||||
|
}
|
||||||
|
|
||||||
/* write out character */
|
|
||||||
MCF_UART_UTB(minor) = *buf;
|
|
||||||
|
|
||||||
/* enable tx interrupt */
|
|
||||||
IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
|
|
||||||
MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -366,18 +366,15 @@ static void IntUartInitialize(void)
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
|
static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
rtems_interrupt_level level=UART0_IRQ_LEVEL;
|
if (len > 0) {
|
||||||
|
/* write out character */
|
||||||
|
MCF_UART_UTB(minor) = *buf;
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
/* enable tx interrupt */
|
||||||
|
IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
|
||||||
|
MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
||||||
|
}
|
||||||
|
|
||||||
/* write out character */
|
|
||||||
MCF_UART_UTB(minor) = *buf;
|
|
||||||
|
|
||||||
/* enable tx interrupt */
|
|
||||||
IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
|
|
||||||
MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -394,18 +394,15 @@ IntUartInitialize(void)
|
|||||||
static ssize_t
|
static ssize_t
|
||||||
IntUartInterruptWrite (int minor, const char *buf, size_t len)
|
IntUartInterruptWrite (int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
int level;
|
if (len > 0) {
|
||||||
|
/* write out character */
|
||||||
|
MCF5235_UART_UTB(minor) = *buf;
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
/* enable tx interrupt */
|
||||||
|
IntUartInfo[minor].uimr |= MCF5235_UART_UIMR_TXRDY;
|
||||||
|
MCF5235_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
||||||
|
}
|
||||||
|
|
||||||
/* write out character */
|
|
||||||
MCF5235_UART_UTB(minor) = *buf;
|
|
||||||
|
|
||||||
/* enable tx interrupt */
|
|
||||||
IntUartInfo[minor].uimr |= MCF5235_UART_UIMR_TXRDY;
|
|
||||||
MCF5235_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -356,18 +356,15 @@ static void IntUartInitialize(void)
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
|
static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
int level;
|
if (len > 0) {
|
||||||
|
/* write out character */
|
||||||
|
MCF_UART_UTB(minor) = *buf;
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
/* enable tx interrupt */
|
||||||
|
IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
|
||||||
|
MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
||||||
|
}
|
||||||
|
|
||||||
/* write out character */
|
|
||||||
MCF_UART_UTB(minor) = *buf;
|
|
||||||
|
|
||||||
/* enable tx interrupt */
|
|
||||||
IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
|
|
||||||
MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1141,37 +1141,39 @@ ssize_t cd2401_write(
|
|||||||
size_t len
|
size_t len
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
cd2401->car = minor; /* Select channel */
|
if (len > 0) {
|
||||||
|
cd2401->car = minor; /* Select channel */
|
||||||
|
|
||||||
if ( (cd2401->dmabsts & 0x08) == 0 ) {
|
if ( (cd2401->dmabsts & 0x08) == 0 ) {
|
||||||
/* Next buffer is A. Wait for it to be ours. */
|
/* Next buffer is A. Wait for it to be ours. */
|
||||||
while ( cd2401->atbsts & 0x01 );
|
while ( cd2401->atbsts & 0x01 );
|
||||||
|
|
||||||
CD2401_Channel_Info[minor].own_buf_A = FALSE;
|
CD2401_Channel_Info[minor].own_buf_A = FALSE;
|
||||||
CD2401_Channel_Info[minor].len = len;
|
CD2401_Channel_Info[minor].len = len;
|
||||||
CD2401_Channel_Info[minor].buf = buf;
|
CD2401_Channel_Info[minor].buf = buf;
|
||||||
cd2401->atbadru = (uint16_t)( ( (uint32_t) buf ) >> 16 );
|
cd2401->atbadru = (uint16_t)( ( (uint32_t) buf ) >> 16 );
|
||||||
cd2401->atbadrl = (uint16_t)( (uint32_t) buf );
|
cd2401->atbadrl = (uint16_t)( (uint32_t) buf );
|
||||||
cd2401->atbcnt = len;
|
cd2401->atbcnt = len;
|
||||||
CD2401_RECORD_WRITE_INFO(( len, buf, 'A' ));
|
CD2401_RECORD_WRITE_INFO(( len, buf, 'A' ));
|
||||||
cd2401->atbsts = 0x03; /* CD2401 owns buffer, int when empty */
|
cd2401->atbsts = 0x03; /* CD2401 owns buffer, int when empty */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Next buffer is B. Wait for it to be ours. */
|
||||||
|
while ( cd2401->btbsts & 0x01 );
|
||||||
|
|
||||||
|
CD2401_Channel_Info[minor].own_buf_B = FALSE;
|
||||||
|
CD2401_Channel_Info[minor].len = len;
|
||||||
|
CD2401_Channel_Info[minor].buf = buf;
|
||||||
|
cd2401->btbadru = (uint16_t)( ( (uint32_t) buf ) >> 16 );
|
||||||
|
cd2401->btbadrl = (uint16_t)( (uint32_t) buf );
|
||||||
|
cd2401->btbcnt = len;
|
||||||
|
CD2401_RECORD_WRITE_INFO(( len, buf, 'B' ));
|
||||||
|
cd2401->btbsts = 0x03; /* CD2401 owns buffer, int when empty */
|
||||||
|
}
|
||||||
|
/* Nuts -- Need TxD ints */
|
||||||
|
CD2401_Channel_Info[minor].txEmpty = FALSE;
|
||||||
|
cd2401->ier |= 0x01;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
/* Next buffer is B. Wait for it to be ours. */
|
|
||||||
while ( cd2401->btbsts & 0x01 );
|
|
||||||
|
|
||||||
CD2401_Channel_Info[minor].own_buf_B = FALSE;
|
|
||||||
CD2401_Channel_Info[minor].len = len;
|
|
||||||
CD2401_Channel_Info[minor].buf = buf;
|
|
||||||
cd2401->btbadru = (uint16_t)( ( (uint32_t) buf ) >> 16 );
|
|
||||||
cd2401->btbadrl = (uint16_t)( (uint32_t) buf );
|
|
||||||
cd2401->btbcnt = len;
|
|
||||||
CD2401_RECORD_WRITE_INFO(( len, buf, 'B' ));
|
|
||||||
cd2401->btbsts = 0x03; /* CD2401 owns buffer, int when empty */
|
|
||||||
}
|
|
||||||
/* Nuts -- Need TxD ints */
|
|
||||||
CD2401_Channel_Info[minor].txEmpty = FALSE;
|
|
||||||
cd2401->ier |= 0x01;
|
|
||||||
|
|
||||||
/* Return something */
|
/* Return something */
|
||||||
return len;
|
return len;
|
||||||
|
|||||||
@@ -409,18 +409,15 @@ IntUartInitialize(void)
|
|||||||
static ssize_t
|
static ssize_t
|
||||||
IntUartInterruptWrite (int minor, const char *buf, size_t len)
|
IntUartInterruptWrite (int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
int level;
|
if (len > 0) {
|
||||||
|
/* write out character */
|
||||||
|
MCF5282_UART_UTB(minor) = *buf;
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
/* enable tx interrupt */
|
||||||
|
IntUartInfo[minor].uimr |= MCF5282_UART_UIMR_TXRDY;
|
||||||
|
MCF5282_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
||||||
|
}
|
||||||
|
|
||||||
/* write out character */
|
|
||||||
MCF5282_UART_UTB(minor) = *buf;
|
|
||||||
|
|
||||||
/* enable tx interrupt */
|
|
||||||
IntUartInfo[minor].uimr |= MCF5282_UART_UIMR_TXRDY;
|
|
||||||
MCF5282_UART_UIMR(minor) = IntUartInfo[minor].uimr;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -581,33 +581,35 @@ ssize_t mpc5200_uart_write(
|
|||||||
size_t len
|
size_t len
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int frame_len = len;
|
if (len > 0) {
|
||||||
const char *frame_buf = buf;
|
int frame_len = len;
|
||||||
struct mpc5200_psc *psc =
|
const char *frame_buf = buf;
|
||||||
(struct mpc5200_psc *)(&mpc5200.psc[psc_minor_to_regset[minor]]);
|
struct mpc5200_psc *psc =
|
||||||
|
(struct mpc5200_psc *)(&mpc5200.psc[psc_minor_to_regset[minor]]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check tx fifo space
|
* Check tx fifo space
|
||||||
*/
|
*/
|
||||||
if(len > (TX_FIFO_SIZE - psc->tfnum))
|
if(len > (TX_FIFO_SIZE - psc->tfnum))
|
||||||
frame_len = TX_FIFO_SIZE - psc->tfnum;
|
frame_len = TX_FIFO_SIZE - psc->tfnum;
|
||||||
|
|
||||||
#ifndef SINGLE_CHAR_MODE
|
#ifndef SINGLE_CHAR_MODE
|
||||||
channel_info[minor].cur_tx_len = frame_len;
|
channel_info[minor].cur_tx_len = frame_len;
|
||||||
#else
|
#else
|
||||||
frame_len = 1;
|
frame_len = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*rtems_cache_flush_multiple_data_lines( (void *)frame_buf, frame_len);*/
|
/*rtems_cache_flush_multiple_data_lines( (void *)frame_buf, frame_len);*/
|
||||||
|
|
||||||
while (frame_len--)
|
while (frame_len--)
|
||||||
/* perform byte write to avoid extra NUL characters */
|
/* perform byte write to avoid extra NUL characters */
|
||||||
(* (volatile char *)&(psc->rb_tb)) = *frame_buf++;
|
(* (volatile char *)&(psc->rb_tb)) = *frame_buf++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* unmask interrupt
|
* unmask interrupt
|
||||||
*/
|
*/
|
||||||
psc->isr_imr = channel_info[minor].shadow_imr |= IMR_TX_RDY;
|
psc->isr_imr = channel_info[minor].shadow_imr |= IMR_TX_RDY;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,28 +153,30 @@ static int last_close(int major, int minor, void *arg)
|
|||||||
|
|
||||||
static ssize_t write_with_interrupts(int minor, const char *buf, size_t len)
|
static ssize_t write_with_interrupts(int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
if (len > 0) {
|
||||||
console_tbl *ct = Console_Port_Tbl[minor];
|
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||||
uart_bridge_slave_control *control = ct->pDeviceParams;
|
console_tbl *ct = Console_Port_Tbl[minor];
|
||||||
intercom_packet *packet = qoriq_intercom_allocate_packet(
|
uart_bridge_slave_control *control = ct->pDeviceParams;
|
||||||
control->type,
|
intercom_packet *packet = qoriq_intercom_allocate_packet(
|
||||||
INTERCOM_SIZE_64
|
control->type,
|
||||||
);
|
INTERCOM_SIZE_64
|
||||||
|
);
|
||||||
|
|
||||||
packet->size = len;
|
packet->size = len;
|
||||||
memcpy(packet->data, buf, len);
|
memcpy(packet->data, buf, len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Due to the lovely Termios implementation we have to hand this over to
|
* Due to the lovely Termios implementation we have to hand this over to
|
||||||
* another context.
|
* another context.
|
||||||
*/
|
*/
|
||||||
sc = rtems_chain_append_with_notification(
|
sc = rtems_chain_append_with_notification(
|
||||||
&control->transmit_fifo,
|
&control->transmit_fifo,
|
||||||
&packet->glue.node,
|
&packet->glue.node,
|
||||||
control->transmit_task,
|
control->transmit_task,
|
||||||
TRANSMIT_EVENT
|
TRANSMIT_EVENT
|
||||||
);
|
);
|
||||||
assert(sc == RTEMS_SUCCESSFUL);
|
assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -559,8 +559,6 @@ BSP_uart_termios_write_polled(int minor, const char *buf, size_t len)
|
|||||||
int nwrite;
|
int nwrite;
|
||||||
const char *b = buf;
|
const char *b = buf;
|
||||||
|
|
||||||
assert(buf != NULL);
|
|
||||||
|
|
||||||
for (nwrite=0 ; nwrite < len ; nwrite++) {
|
for (nwrite=0 ; nwrite < len ; nwrite++) {
|
||||||
BSP_uart_polled_write(uart, *b++);
|
BSP_uart_polled_write(uart, *b++);
|
||||||
}
|
}
|
||||||
@@ -571,7 +569,6 @@ ssize_t
|
|||||||
BSP_uart_termios_write_com(int minor, const char *buf, size_t len)
|
BSP_uart_termios_write_com(int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
int uart=minor; /* could differ, theoretically */
|
int uart=minor; /* could differ, theoretically */
|
||||||
assert(buf != NULL);
|
|
||||||
|
|
||||||
if(len <= 0)
|
if(len <= 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -778,26 +778,29 @@ sccPollRead (int minor)
|
|||||||
static ssize_t
|
static ssize_t
|
||||||
sccInterruptWrite (int minor, const char *buf, size_t len)
|
sccInterruptWrite (int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
int chan = minor;
|
if (len > 0) {
|
||||||
|
int chan = minor;
|
||||||
|
|
||||||
if ((sccPrepTxBd[chan]->status & M8xx_BD_READY) == 0) {
|
if ((sccPrepTxBd[chan]->status & M8xx_BD_READY) == 0) {
|
||||||
sccPrepTxBd[chan]->buffer = (char *)buf;
|
sccPrepTxBd[chan]->buffer = (char *)buf;
|
||||||
sccPrepTxBd[chan]->length = len;
|
sccPrepTxBd[chan]->length = len;
|
||||||
rtems_cache_flush_multiple_data_lines((const void *)buf,len);
|
rtems_cache_flush_multiple_data_lines((const void *)buf,len);
|
||||||
/*
|
/*
|
||||||
* clear status, set ready bit
|
* clear status, set ready bit
|
||||||
*/
|
*/
|
||||||
sccPrepTxBd[chan]->status =
|
sccPrepTxBd[chan]->status =
|
||||||
(sccPrepTxBd[chan]->status
|
(sccPrepTxBd[chan]->status
|
||||||
& M8xx_BD_WRAP)
|
& M8xx_BD_WRAP)
|
||||||
| M8xx_BD_READY | M8xx_BD_INTERRUPT;
|
| M8xx_BD_READY | M8xx_BD_INTERRUPT;
|
||||||
if ((sccPrepTxBd[chan]->status & M8xx_BD_WRAP) != 0) {
|
if ((sccPrepTxBd[chan]->status & M8xx_BD_WRAP) != 0) {
|
||||||
sccPrepTxBd[chan] = sccFrstTxBd[chan];
|
sccPrepTxBd[chan] = sccFrstTxBd[chan];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sccPrepTxBd[chan]++;
|
sccPrepTxBd[chan]++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -149,28 +149,28 @@ static int erc32_console_first_open(int major, int minor, void *arg)
|
|||||||
#if (CONSOLE_USE_INTERRUPTS)
|
#if (CONSOLE_USE_INTERRUPTS)
|
||||||
static ssize_t erc32_console_write_support_int(int minor, const char *buf, size_t len)
|
static ssize_t erc32_console_write_support_int(int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
console_data *cd = &Console_Port_Data[minor];
|
|
||||||
int k = 0;
|
|
||||||
|
|
||||||
if (minor == 0) { /* uart a */
|
|
||||||
for (k = 0;
|
|
||||||
k < len && (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEA); k ++) {
|
|
||||||
ERC32_MEC.UART_Channel_A = (unsigned char)buf[k];
|
|
||||||
}
|
|
||||||
ERC32_Force_interrupt(ERC32_INTERRUPT_UART_A_RX_TX);
|
|
||||||
} else { /* uart b */
|
|
||||||
for (k = 0;
|
|
||||||
k < len && (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEB); k ++) {
|
|
||||||
ERC32_MEC.UART_Channel_B = (unsigned char)buf[k];
|
|
||||||
}
|
|
||||||
ERC32_Force_interrupt(ERC32_INTERRUPT_UART_B_RX_TX);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
|
console_data *cd = &Console_Port_Data[minor];
|
||||||
|
int k = 0;
|
||||||
|
|
||||||
|
if (minor == 0) { /* uart a */
|
||||||
|
for (k = 0;
|
||||||
|
k < len && (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEA); k ++) {
|
||||||
|
ERC32_MEC.UART_Channel_A = (unsigned char)buf[k];
|
||||||
|
}
|
||||||
|
ERC32_Force_interrupt(ERC32_INTERRUPT_UART_A_RX_TX);
|
||||||
|
} else { /* uart b */
|
||||||
|
for (k = 0;
|
||||||
|
k < len && (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEB); k ++) {
|
||||||
|
ERC32_MEC.UART_Channel_B = (unsigned char)buf[k];
|
||||||
|
}
|
||||||
|
ERC32_Force_interrupt(ERC32_INTERRUPT_UART_B_RX_TX);
|
||||||
|
}
|
||||||
|
|
||||||
cd->pDeviceContext = (void *)k;
|
cd->pDeviceContext = (void *)k;
|
||||||
cd->bActive = true;
|
cd->bActive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -117,27 +117,24 @@ void console_isr(void *arg)
|
|||||||
*/
|
*/
|
||||||
int console_write_interrupt(int minor, const char *buf, int len)
|
int console_write_interrupt(int minor, const char *buf, int len)
|
||||||
{
|
{
|
||||||
struct apbuart_priv *uart;
|
if (len > 0) {
|
||||||
unsigned int oldLevel;
|
struct apbuart_priv *uart;
|
||||||
|
|
||||||
if (minor == 0)
|
if (minor == 0)
|
||||||
uart = &apbuarts[syscon_uart_index];
|
uart = &apbuarts[syscon_uart_index];
|
||||||
else
|
else
|
||||||
uart = &apbuarts[minor - 1];
|
uart = &apbuarts[minor - 1];
|
||||||
|
|
||||||
/* Remember what position in buffer */
|
/* Remember what position in buffer */
|
||||||
|
|
||||||
rtems_interrupt_disable(oldLevel);
|
/* Enable TX interrupt */
|
||||||
|
uart->regs->ctrl |= LEON_REG_UART_CTRL_TI;
|
||||||
|
|
||||||
/* Enable TX interrupt */
|
/* start UART TX, this will result in an interrupt when done */
|
||||||
uart->regs->ctrl |= LEON_REG_UART_CTRL_TI;
|
uart->regs->data = *buf;
|
||||||
|
|
||||||
/* start UART TX, this will result in an interrupt when done */
|
uart->sending = 1;
|
||||||
uart->regs->data = *buf;
|
}
|
||||||
|
|
||||||
uart->sending = 1;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(oldLevel);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -323,12 +323,14 @@ static int setAttributes(int minor, const struct termios *termios) {
|
|||||||
static ssize_t uart_interruptWrite(int minor, const char *buf, size_t len) {
|
static ssize_t uart_interruptWrite(int minor, const char *buf, size_t len) {
|
||||||
uint32_t base = 0;
|
uint32_t base = 0;
|
||||||
bfin_uart_channel_t* channel = NULL;
|
bfin_uart_channel_t* channel = NULL;
|
||||||
rtems_interrupt_level isrLevel;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sanity Check
|
* Sanity Check
|
||||||
*/
|
*/
|
||||||
if (NULL == buf || NULL == channel || NULL == uartsConfig || minor < 0) {
|
if (
|
||||||
|
NULL == buf || NULL == channel || NULL == uartsConfig
|
||||||
|
|| minor < 0 || 0 == len
|
||||||
|
) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,8 +340,6 @@ static ssize_t uart_interruptWrite(int minor, const char *buf, size_t len) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_interrupt_disable(isrLevel);
|
|
||||||
|
|
||||||
base = channel->uart_baseAddress;
|
base = channel->uart_baseAddress;
|
||||||
|
|
||||||
channel->flags |= BFIN_UART_XMIT_BUSY;
|
channel->flags |= BFIN_UART_XMIT_BUSY;
|
||||||
@@ -347,8 +347,6 @@ static ssize_t uart_interruptWrite(int minor, const char *buf, size_t len) {
|
|||||||
*(uint16_t volatile *) (base + UART_THR_OFFSET) = *buf;
|
*(uint16_t volatile *) (base + UART_THR_OFFSET) = *buf;
|
||||||
*(uint16_t volatile *) (base + UART_IER_OFFSET) = UART_IER_ETBEI;
|
*(uint16_t volatile *) (base + UART_IER_OFFSET) = UART_IER_ETBEI;
|
||||||
|
|
||||||
rtems_interrupt_enable(isrLevel);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -412,12 +410,11 @@ static ssize_t uart_DmaWrite(int minor, const char *buf, size_t len) {
|
|||||||
uint32_t base = 0;
|
uint32_t base = 0;
|
||||||
bfin_uart_channel_t* channel = NULL;
|
bfin_uart_channel_t* channel = NULL;
|
||||||
uint32_t tx_dma_base = 0;
|
uint32_t tx_dma_base = 0;
|
||||||
rtems_interrupt_level isrLevel;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sanity Check
|
* Sanity Check
|
||||||
*/
|
*/
|
||||||
if ( NULL == buf || 0 > minor || NULL == uartsConfig ) {
|
if ( NULL == buf || 0 > minor || NULL == uartsConfig || 0 == len ) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,8 +427,6 @@ static ssize_t uart_DmaWrite(int minor, const char *buf, size_t len) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_interrupt_disable(isrLevel);
|
|
||||||
|
|
||||||
base = channel->uart_baseAddress;
|
base = channel->uart_baseAddress;
|
||||||
tx_dma_base = channel->uart_txDmaBaseAddress;
|
tx_dma_base = channel->uart_txDmaBaseAddress;
|
||||||
|
|
||||||
@@ -445,8 +440,6 @@ static ssize_t uart_DmaWrite(int minor, const char *buf, size_t len) {
|
|||||||
*(uint16_t volatile *) (tx_dma_base + DMA_CONFIG_OFFSET) |= DMA_CONFIG_DMAEN;
|
*(uint16_t volatile *) (tx_dma_base + DMA_CONFIG_OFFSET) |= DMA_CONFIG_DMAEN;
|
||||||
*(uint16_t volatile *) (base + UART_IER_OFFSET) = UART_IER_ETBEI;
|
*(uint16_t volatile *) (base + UART_IER_OFFSET) = UART_IER_ETBEI;
|
||||||
|
|
||||||
rtems_interrupt_enable(isrLevel);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -519,19 +519,20 @@ mcfuart_interrupt_handler(rtems_vector_number vec)
|
|||||||
ssize_t
|
ssize_t
|
||||||
mcfuart_interrupt_write(mcfuart *uart, const char *buf, size_t len)
|
mcfuart_interrupt_write(mcfuart *uart, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
int level;
|
if (len > 0)
|
||||||
rtems_interrupt_disable(level);
|
|
||||||
uart->tx_buf = buf;
|
|
||||||
uart->tx_buf_len = len;
|
|
||||||
uart->tx_ptr = 0;
|
|
||||||
*MCF5206E_UIMR(MBAR, uart->chn) =
|
|
||||||
MCF5206E_UIMR_FFULL | MCF5206E_UIMR_TXRDY;
|
|
||||||
while (((*MCF5206E_USR(MBAR,uart->chn) & MCF5206E_USR_TXRDY) != 0) &&
|
|
||||||
(uart->tx_ptr < uart->tx_buf_len))
|
|
||||||
{
|
{
|
||||||
*MCF5206E_UTB(MBAR,uart->chn) = uart->tx_buf[uart->tx_ptr++];
|
uart->tx_buf = buf;
|
||||||
|
uart->tx_buf_len = len;
|
||||||
|
uart->tx_ptr = 0;
|
||||||
|
*MCF5206E_UIMR(MBAR, uart->chn) =
|
||||||
|
MCF5206E_UIMR_FFULL | MCF5206E_UIMR_TXRDY;
|
||||||
|
while (((*MCF5206E_USR(MBAR,uart->chn) & MCF5206E_USR_TXRDY) != 0) &&
|
||||||
|
(uart->tx_ptr < uart->tx_buf_len))
|
||||||
|
{
|
||||||
|
*MCF5206E_UTB(MBAR,uart->chn) = uart->tx_buf[uart->tx_ptr++];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -686,7 +686,6 @@ MG5UART_STATIC int mg5uart_write_support_int(
|
|||||||
size_t len
|
size_t len
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
uint32_t Irql;
|
|
||||||
uint32_t pMG5UART_port;
|
uint32_t pMG5UART_port;
|
||||||
|
|
||||||
pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
|
pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
|
||||||
@@ -703,8 +702,6 @@ MG5UART_STATIC int mg5uart_write_support_int(
|
|||||||
* Put the character out and enable interrupts if necessary.
|
* Put the character out and enable interrupts if necessary.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rtems_interrupt_disable(Irql);
|
|
||||||
|
|
||||||
MG5UART_SETREG(pMG5UART_port, MG5UART_TX_BUFFER, *buf);
|
MG5UART_SETREG(pMG5UART_port, MG5UART_TX_BUFFER, *buf);
|
||||||
|
|
||||||
if( Console_Port_Data[minor].bActive == FALSE )
|
if( Console_Port_Data[minor].bActive == FALSE )
|
||||||
@@ -713,7 +710,6 @@ MG5UART_STATIC int mg5uart_write_support_int(
|
|||||||
mg5uart_enable_interrupts(minor, MG5UART_ENABLE_ALL);
|
mg5uart_enable_interrupts(minor, MG5UART_ENABLE_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_interrupt_enable(Irql);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -292,13 +292,12 @@ static int mpc55xx_esci_termios_poll_write( int minor, const char *out,
|
|||||||
*/
|
*/
|
||||||
static int mpc55xx_esci_termios_write( int minor, const char *out, size_t n)
|
static int mpc55xx_esci_termios_write( int minor, const char *out, size_t n)
|
||||||
{
|
{
|
||||||
mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
|
if (n > 0) {
|
||||||
rtems_interrupt_level level;
|
mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
e->regs->DR.B.D = out [0];
|
||||||
e->regs->DR.B.D = out [0];
|
e->transmit_in_progress = true;
|
||||||
e->transmit_in_progress = true;
|
}
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,10 +144,13 @@ ssize_t m5xx_uart_write(
|
|||||||
size_t len
|
size_t len
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
volatile m5xxSCIRegisters_t *regs = sci_descs[minor].regs;
|
if (len > 0) {
|
||||||
|
volatile m5xxSCIRegisters_t *regs = sci_descs[minor].regs;
|
||||||
|
|
||||||
|
regs->scdr = *buf; /* start transmission */
|
||||||
|
regs->sccr1 |= QSMCM_SCI_TIE; /* enable interrupt */
|
||||||
|
}
|
||||||
|
|
||||||
regs->scdr = *buf; /* start transmission */
|
|
||||||
regs->sccr1 |= QSMCM_SCI_TIE; /* enable interrupt */
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1090,12 +1090,15 @@ m8xx_uart_write(
|
|||||||
size_t len
|
size_t len
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
while( (TxBd[minor]->status) & M8260_BD_READY );
|
if (len > 0) {
|
||||||
|
while( (TxBd[minor]->status) & M8260_BD_READY );
|
||||||
|
|
||||||
|
rtems_cache_flush_multiple_data_lines( buf, len );
|
||||||
|
TxBd[minor]->buffer = (char *) buf;
|
||||||
|
TxBd[minor]->length = len;
|
||||||
|
TxBd[minor]->status = M8260_BD_READY | M8260_BD_WRAP | M8260_BD_INTERRUPT;
|
||||||
|
}
|
||||||
|
|
||||||
rtems_cache_flush_multiple_data_lines( buf, len );
|
|
||||||
TxBd[minor]->buffer = (char *) buf;
|
|
||||||
TxBd[minor]->length = len;
|
|
||||||
TxBd[minor]->status = M8260_BD_READY | M8260_BD_WRAP | M8260_BD_INTERRUPT;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -271,8 +271,11 @@ spiPollRead (int minor)
|
|||||||
static int
|
static int
|
||||||
spiInterruptWrite (int minor, const char *buf, int len)
|
spiInterruptWrite (int minor, const char *buf, int len)
|
||||||
{
|
{
|
||||||
port->SPTB = *buf; /* write char to send */
|
if (len > 0) {
|
||||||
port->SPTC |= TCRIntEnabled; /* always enable tx interrupt */
|
port->SPTB = *buf; /* write char to send */
|
||||||
|
port->SPTC |= TCRIntEnabled; /* always enable tx interrupt */
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -296,8 +296,11 @@ spiStopRemoteTx (int minor)
|
|||||||
|
|
||||||
static ssize_t InterruptWrite (int minor, const char *buf, size_t len)
|
static ssize_t InterruptWrite (int minor, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
port->IER |= IER_XMT; /* always enable tx interrupt */
|
if (len > 0) {
|
||||||
port->THR = *buf; /* write char to send */
|
port->IER |= IER_XMT; /* always enable tx interrupt */
|
||||||
|
port->THR = *buf; /* write char to send */
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -761,24 +761,21 @@ sh4uart2_interrupt_transmit(rtems_vector_number vec)
|
|||||||
rtems_status_code
|
rtems_status_code
|
||||||
sh4uart_interrupt_write(sh4uart *uart, const char *buf, int len)
|
sh4uart_interrupt_write(sh4uart *uart, const char *buf, int len)
|
||||||
{
|
{
|
||||||
volatile uint8_t *scr1 = (volatile uint8_t *)SH7750_SCSCR1;
|
if (len > 0) {
|
||||||
volatile uint16_t *scr2 = (volatile uint16_t *)SH7750_SCSCR2;
|
volatile uint8_t *scr1 = (volatile uint8_t *)SH7750_SCSCR1;
|
||||||
int level;
|
volatile uint16_t *scr2 = (volatile uint16_t *)SH7750_SCSCR2;
|
||||||
|
|
||||||
while ((SCSSR1 & SH7750_SCSSR1_TEND) == 0);
|
while ((SCSSR1 & SH7750_SCSSR1_TEND) == 0);
|
||||||
|
|
||||||
rtems_interrupt_disable(level);
|
uart->tx_buf = buf;
|
||||||
|
uart->tx_buf_len = len;
|
||||||
|
uart->tx_ptr = 0;
|
||||||
|
|
||||||
uart->tx_buf = buf;
|
if (uart->chn == SH4_SCI)
|
||||||
uart->tx_buf_len = len;
|
*scr1 |= SH7750_SCSCR_TIE;
|
||||||
uart->tx_ptr = 0;
|
else
|
||||||
|
*scr2 |= SH7750_SCSCR_TIE;
|
||||||
if (uart->chn == SH4_SCI)
|
}
|
||||||
*scr1 |= SH7750_SCSCR_TIE;
|
|
||||||
else
|
|
||||||
*scr2 |= SH7750_SCSCR_TIE;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(level);
|
|
||||||
|
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user