提交 ce176ee1 编写于 作者: B Bernard Xiong

Merge pull request #107 from visitor83/pulls

format s3c24x0 serial.c and mini2440 rtconfig.py
...@@ -12,14 +12,14 @@ TextBase = '0x30000000' ...@@ -12,14 +12,14 @@ TextBase = '0x30000000'
CROSS_TOOL = 'gcc' CROSS_TOOL = 'gcc'
if os.getenv('RTT_CC'): if os.getenv('RTT_CC'):
CROSS_TOOL = os.getenv('RTT_CC') CROSS_TOOL = os.getenv('RTT_CC')
if CROSS_TOOL == 'gcc': if CROSS_TOOL == 'gcc':
PLATFORM = 'gcc' PLATFORM = 'gcc'
EXEC_PATH = 'C:/Program Files/CodeSourcery/Sourcery G++ Lite/bin' EXEC_PATH = 'C:/Program Files/CodeSourcery/Sourcery G++ Lite/bin'
elif CROSS_TOOL == 'keil': elif CROSS_TOOL == 'keil':
PLATFORM = 'armcc' PLATFORM = 'armcc'
EXEC_PATH = 'C:/Keil' EXEC_PATH = 'C:/Keil'
elif CROSS_TOOL == 'iar': elif CROSS_TOOL == 'iar':
print '================ERROR============================' print '================ERROR============================'
print 'Not support iar yet!' print 'Not support iar yet!'
......
...@@ -52,8 +52,8 @@ rt_hw_context_switch: ...@@ -52,8 +52,8 @@ rt_hw_context_switch:
mrs r4, spsr mrs r4, spsr
stmfd sp!, {r4} @ push spsr stmfd sp!, {r4} @ push spsr
str sp, [r0] @ store sp in preempted tasks TCB str sp, [r0] @ store sp in preempted tasks TCB
ldr sp, [r1] @ get new task stack pointer ldr sp, [r1] @ get new task stack pointer
ldmfd sp!, {r4} @ pop new task spsr ldmfd sp!, {r4} @ pop new task spsr
msr spsr_cxsf, r4 msr spsr_cxsf, r4
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* Change Logs: * Change Logs:
* Date Author Notes * Date Author Notes
* 2006-03-13 Bernard first version * 2006-03-13 Bernard first version
* 2009-04-20 yi.qiu modified according bernard's stm32 version * 2009-04-20 yi.qiu modified according bernard's stm32 version
*/ */
#include <rtthread.h> #include <rtthread.h>
...@@ -26,208 +26,220 @@ ...@@ -26,208 +26,220 @@
/** /**
* This function initializes serial * This function initializes serial
*/ */
static rt_err_t rt_serial_init (rt_device_t dev) static rt_err_t rt_serial_init(rt_device_t dev)
{ {
struct serial_device* uart = (struct serial_device*) dev->user_data; struct serial_device* uart = (struct serial_device*) dev->user_data;
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED)) if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
{ {
if (dev->flag & RT_DEVICE_FLAG_INT_RX) if (dev->flag & RT_DEVICE_FLAG_INT_RX)
{ {
rt_memset(uart->int_rx->rx_buffer, 0, rt_memset(uart->int_rx->rx_buffer, 0,
sizeof(uart->int_rx->rx_buffer)); sizeof(uart->int_rx->rx_buffer));
uart->int_rx->read_index = uart->int_rx->save_index = 0; uart->int_rx->read_index = uart->int_rx->save_index = 0;
} }
if (dev->flag & RT_DEVICE_FLAG_INT_TX) if (dev->flag & RT_DEVICE_FLAG_INT_TX)
{ {
rt_memset(uart->int_tx->tx_buffer, 0, rt_memset(uart->int_tx->tx_buffer, 0,
sizeof(uart->int_tx->tx_buffer)); sizeof(uart->int_tx->tx_buffer));
uart->int_tx->write_index = uart->int_tx->save_index = 0; uart->int_tx->write_index = uart->int_tx->save_index = 0;
} }
dev->flag |= RT_DEVICE_FLAG_ACTIVATED; dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
} }
return RT_EOK; return RT_EOK;
} }
/* save a char to serial buffer */ /* save a char to serial buffer */
static void rt_serial_savechar(struct serial_device* uart, char ch) static void rt_serial_savechar(struct serial_device* uart, char ch)
{ {
rt_base_t level; rt_base_t level;
/* disable interrupt */ /* disable interrupt */
level = rt_hw_interrupt_disable(); level = rt_hw_interrupt_disable();
uart->int_rx->rx_buffer[uart->int_rx->save_index] = ch; uart->int_rx->rx_buffer[uart->int_rx->save_index] = ch;
uart->int_rx->save_index ++; uart->int_rx->save_index ++;
if (uart->int_rx->save_index >= UART_RX_BUFFER_SIZE) if (uart->int_rx->save_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->save_index = 0; uart->int_rx->save_index = 0;
/* if the next position is read index, discard this 'read char' */ /* if the next position is read index, discard this 'read char' */
if (uart->int_rx->save_index == uart->int_rx->read_index) if (uart->int_rx->save_index == uart->int_rx->read_index)
{ {
uart->int_rx->read_index ++; uart->int_rx->read_index ++;
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE) if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->read_index = 0; uart->int_rx->read_index = 0;
} }
/* enable interrupt */ /* enable interrupt */
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
} }
static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag) static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag)
{ {
RT_ASSERT(dev != RT_NULL); RT_ASSERT(dev != RT_NULL);
return RT_EOK; return RT_EOK;
} }
static rt_err_t rt_serial_close(rt_device_t dev) static rt_err_t rt_serial_close(rt_device_t dev)
{ {
RT_ASSERT(dev != RT_NULL); RT_ASSERT(dev != RT_NULL);
return RT_EOK; return RT_EOK;
} }
static rt_size_t rt_serial_read (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) static rt_size_t rt_serial_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
{ {
rt_uint8_t* ptr; rt_uint8_t* ptr;
rt_err_t err_code; rt_err_t err_code;
struct serial_device* uart; struct serial_device* uart;
ptr = buffer; ptr = buffer;
err_code = RT_EOK; err_code = RT_EOK;
uart = (struct serial_device*)dev->user_data; uart = (struct serial_device*)dev->user_data;
if (dev->flag & RT_DEVICE_FLAG_INT_RX) if (ptr == RT_NULL)
{ {
rt_base_t level; err_code = -RT_ENOMEM;
rt_set_errno(err_code);
/* interrupt mode Rx */ return -RT_ENOMEM;
while (size) }
{ if (dev->flag & RT_DEVICE_FLAG_INT_RX)
if (uart->int_rx->read_index != uart->int_rx->save_index) {
{ rt_base_t level;
*ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index];
size --; /* interrupt mode Rx */
while (size)
/* disable interrupt */ {
level = rt_hw_interrupt_disable(); if (uart->int_rx->read_index != uart->int_rx->save_index)
{
uart->int_rx->read_index ++; *ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index];
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE) size --;
uart->int_rx->read_index = 0;
/* disable interrupt */
/* enable interrupt */ level = rt_hw_interrupt_disable();
rt_hw_interrupt_enable(level);
} uart->int_rx->read_index ++;
else if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
{ uart->int_rx->read_index = 0;
/* set error code */
err_code = -RT_EEMPTY; /* enable interrupt */
break; rt_hw_interrupt_enable(level);
} }
} else
} {
else /* set error code */
{ err_code = -RT_EEMPTY;
/* polling mode */ break;
while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size) }
{ }
while (uart->uart_device->ustat & USTAT_RCV_READY) }
{ else
*ptr = uart->uart_device->urxh & 0xff; {
ptr ++; /* polling mode */
} while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size)
} {
} while (uart->uart_device->ustat & USTAT_RCV_READY)
{
/* set error code */ *ptr = uart->uart_device->urxh & 0xff;
rt_set_errno(err_code); ptr ++;
return (rt_uint32_t)ptr - (rt_uint32_t)buffer; }
}
}
/* set error code */
rt_set_errno(err_code);
return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
} }
static rt_size_t rt_serial_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) static rt_size_t rt_serial_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
{ {
rt_uint8_t* ptr; rt_uint8_t* ptr;
rt_err_t err_code; rt_err_t err_code;
struct serial_device* uart; struct serial_device* uart;
err_code = RT_EOK; err_code = RT_EOK;
ptr = (rt_uint8_t*)buffer; ptr = (rt_uint8_t*)buffer;
uart = (struct serial_device*)dev->user_data; uart = (struct serial_device*)dev->user_data;
if (dev->flag & RT_DEVICE_FLAG_INT_TX) if (ptr == RT_NULL)
{ {
/* interrupt mode Tx */ err_code = -RT_ENOMEM;
while (uart->int_tx->save_index != uart->int_tx->write_index) rt_set_errno(err_code);
{ return -RT_ENOMEM;
/* save on tx buffer */ }
uart->int_tx->tx_buffer[uart->int_tx->save_index] = *ptr++; if (dev->flag & RT_DEVICE_FLAG_INT_TX)
{
-- size; /* interrupt mode Tx */
while (uart->int_tx->save_index != uart->int_tx->write_index)
/* move to next position */ {
uart->int_tx->save_index ++; /* save on tx buffer */
uart->int_tx->tx_buffer[uart->int_tx->save_index] = *ptr++;
/* wrap save index */
if (uart->int_tx->save_index >= UART_TX_BUFFER_SIZE) -- size;
uart->int_tx->save_index = 0;
} /* move to next position */
uart->int_tx->save_index ++;
/* set error code */
if (size > 0) /* wrap save index */
err_code = -RT_EFULL; if (uart->int_tx->save_index >= UART_TX_BUFFER_SIZE)
} uart->int_tx->save_index = 0;
else }
{
/* polling mode */ /* set error code */
while (size) if (size > 0)
{ err_code = -RT_EFULL;
/* }
* to be polite with serial console add a line feed else
* to the carriage return character {
*/ /* polling mode */
if (*ptr == '\n' && (dev->flag & RT_DEVICE_FLAG_STREAM)) while (size)
{ {
while (!(uart->uart_device->ustat & USTAT_TXB_EMPTY)); /*
uart->uart_device->utxh = '\r'; * to be polite with serial console add a line feed
} * to the carriage return character
*/
while (!(uart->uart_device->ustat & USTAT_TXB_EMPTY)); if (*ptr == '\n' && (dev->flag & RT_DEVICE_FLAG_STREAM))
uart->uart_device->utxh = (*ptr & 0xFF); {
while (!(uart->uart_device->ustat & USTAT_TXB_EMPTY));
++ptr; --size; uart->uart_device->utxh = '\r';
} }
}
while (!(uart->uart_device->ustat & USTAT_TXB_EMPTY));
/* set error code */ uart->uart_device->utxh = (*ptr & 0xFF);
rt_set_errno(err_code);
++ptr;
return (rt_uint32_t)ptr - (rt_uint32_t)buffer; --size;
}
}
/* set error code */
rt_set_errno(err_code);
return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
} }
static rt_err_t rt_serial_control (rt_device_t dev, rt_uint8_t cmd, void *args) static rt_err_t rt_serial_control(rt_device_t dev, rt_uint8_t cmd, void *args)
{ {
RT_ASSERT(dev != RT_NULL); RT_ASSERT(dev != RT_NULL);
switch (cmd) switch (cmd)
{ {
case RT_DEVICE_CTRL_SUSPEND: case RT_DEVICE_CTRL_SUSPEND:
/* suspend device */ /* suspend device */
dev->flag |= RT_DEVICE_FLAG_SUSPENDED; dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
break; break;
case RT_DEVICE_CTRL_RESUME: case RT_DEVICE_CTRL_RESUME:
/* resume device */ /* resume device */
dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED; dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
break; break;
} }
return RT_EOK; return RT_EOK;
} }
/* /*
...@@ -235,49 +247,49 @@ static rt_err_t rt_serial_control (rt_device_t dev, rt_uint8_t cmd, void *args) ...@@ -235,49 +247,49 @@ static rt_err_t rt_serial_control (rt_device_t dev, rt_uint8_t cmd, void *args)
*/ */
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct serial_device *serial) rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct serial_device *serial)
{ {
RT_ASSERT(device != RT_NULL); RT_ASSERT(device != RT_NULL);
device->type = RT_Device_Class_Char; device->type = RT_Device_Class_Char;
device->rx_indicate = RT_NULL; device->rx_indicate = RT_NULL;
device->tx_complete = RT_NULL; device->tx_complete = RT_NULL;
device->init = rt_serial_init; device->init = rt_serial_init;
device->open = rt_serial_open; device->open = rt_serial_open;
device->close = rt_serial_close; device->close = rt_serial_close;
device->read = rt_serial_read; device->read = rt_serial_read;
device->write = rt_serial_write; device->write = rt_serial_write;
device->control = rt_serial_control; device->control = rt_serial_control;
device->user_data = serial; device->user_data = serial;
/* register a character device */ /* register a character device */
return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag); return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag);
} }
/* ISR for serial interrupt */ /* ISR for serial interrupt */
void rt_hw_serial_isr(rt_device_t device) void rt_hw_serial_isr(rt_device_t device)
{ {
struct serial_device* uart = (struct serial_device*) device->user_data; struct serial_device* uart = (struct serial_device*) device->user_data;
/* interrupt mode receive */ /* interrupt mode receive */
RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX); RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX);
/* save on rx buffer */ /* save on rx buffer */
while (uart->uart_device->ustat & USTAT_RCV_READY) while (uart->uart_device->ustat & USTAT_RCV_READY)
{ {
rt_serial_savechar(uart, uart->uart_device->urxh & 0xff); rt_serial_savechar(uart, uart->uart_device->urxh & 0xff);
} }
/* invoke callback */ /* invoke callback */
if (device->rx_indicate != RT_NULL) if (device->rx_indicate != RT_NULL)
{ {
rt_size_t rx_length; rt_size_t rx_length;
/* get rx length */ /* get rx length */
rx_length = uart->int_rx->read_index > uart->int_rx->save_index ? rx_length = uart->int_rx->read_index > uart->int_rx->save_index ?
UART_RX_BUFFER_SIZE - uart->int_rx->read_index + uart->int_rx->save_index : UART_RX_BUFFER_SIZE - uart->int_rx->read_index + uart->int_rx->save_index :
uart->int_rx->save_index - uart->int_rx->read_index; uart->int_rx->save_index - uart->int_rx->read_index;
device->rx_indicate(device, rx_length); device->rx_indicate(device, rx_length);
} }
} }
/*@}*/ /*@}*/
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
* Change Logs: * Change Logs:
* Date Author Notes * Date Author Notes
* 2006-03-13 Bernard first version * 2006-03-13 Bernard first version
* 2006-10-05 Alsor.Z for s3c2440 initialize * 2006-10-05 Alsor.Z for s3c2440 initialize
* 2008-01-29 Yi.Qiu for QEMU emulator * 2008-01-29 Yi.Qiu for QEMU emulator
*/ */
#define CONFIG_STACKSIZE 512 #define CONFIG_STACKSIZE 512
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#define S_LR 56 #define S_LR 56
#define S_SP 52 #define S_SP 52
#define S_IP 48 #define S_IP 48
#define S_FP 44 #define S_FP 44
#define S_R10 40 #define S_R10 40
#define S_R9 36 #define S_R9 36
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册