Merge pull request #107 from visitor83/pulls

format s3c24x0 serial.c and mini2440 rtconfig.py
This commit is contained in:
Bernard Xiong 2013-06-18 01:30:02 -07:00
commit ce176ee1d6
4 changed files with 219 additions and 207 deletions

View File

@ -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!'

View File

@ -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

View File

@ -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 @@
/** /**
* 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)
{
rt_memset(uart->int_tx->tx_buffer, 0,
sizeof(uart->int_tx->tx_buffer));
uart->int_tx->write_index = uart->int_tx->save_index = 0;
}
dev->flag |= RT_DEVICE_FLAG_ACTIVATED; if (dev->flag & RT_DEVICE_FLAG_INT_TX)
} {
rt_memset(uart->int_tx->tx_buffer, 0,
sizeof(uart->int_tx->tx_buffer));
uart->int_tx->write_index = uart->int_tx->save_index = 0;
}
return RT_EOK; dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
}
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 */
level = rt_hw_interrupt_disable();
uart->int_rx->rx_buffer[uart->int_rx->save_index] = ch; /* disable interrupt */
uart->int_rx->save_index ++; level = rt_hw_interrupt_disable();
if (uart->int_rx->save_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->save_index = 0;
/* if the next position is read index, discard this 'read char' */
if (uart->int_rx->save_index == uart->int_rx->read_index)
{
uart->int_rx->read_index ++;
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->read_index = 0;
}
/* enable interrupt */ uart->int_rx->rx_buffer[uart->int_rx->save_index] = ch;
rt_hw_interrupt_enable(level); uart->int_rx->save_index ++;
if (uart->int_rx->save_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->save_index = 0;
/* if the next position is read index, discard this 'read char' */
if (uart->int_rx->save_index == uart->int_rx->read_index)
{
uart->int_rx->read_index ++;
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->read_index = 0;
}
/* enable interrupt */
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;
err_code = RT_EOK;
uart = (struct serial_device*)dev->user_data;
if (dev->flag & RT_DEVICE_FLAG_INT_RX) ptr = buffer;
{ err_code = RT_EOK;
rt_base_t level; uart = (struct serial_device*)dev->user_data;
/* interrupt mode Rx */ if (ptr == RT_NULL)
while (size) {
{ err_code = -RT_ENOMEM;
if (uart->int_rx->read_index != uart->int_rx->save_index) rt_set_errno(err_code);
{ return -RT_ENOMEM;
*ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index]; }
size --; if (dev->flag & RT_DEVICE_FLAG_INT_RX)
{
rt_base_t level;
/* disable interrupt */ /* interrupt mode Rx */
level = rt_hw_interrupt_disable(); while (size)
{
if (uart->int_rx->read_index != uart->int_rx->save_index)
{
*ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index];
size --;
uart->int_rx->read_index ++; /* disable interrupt */
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE) level = rt_hw_interrupt_disable();
uart->int_rx->read_index = 0;
/* enable interrupt */ uart->int_rx->read_index ++;
rt_hw_interrupt_enable(level); if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
} uart->int_rx->read_index = 0;
else
{
/* set error code */
err_code = -RT_EEMPTY;
break;
}
}
}
else
{
/* polling mode */
while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size)
{
while (uart->uart_device->ustat & USTAT_RCV_READY)
{
*ptr = uart->uart_device->urxh & 0xff;
ptr ++;
}
}
}
/* set error code */ /* enable interrupt */
rt_set_errno(err_code); rt_hw_interrupt_enable(level);
return (rt_uint32_t)ptr - (rt_uint32_t)buffer; }
else
{
/* set error code */
err_code = -RT_EEMPTY;
break;
}
}
}
else
{
/* polling mode */
while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size)
{
while (uart->uart_device->ustat & USTAT_RCV_READY)
{
*ptr = uart->uart_device->urxh & 0xff;
ptr ++;
}
}
}
/* 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;
ptr = (rt_uint8_t*)buffer;
uart = (struct serial_device*)dev->user_data;
if (dev->flag & RT_DEVICE_FLAG_INT_TX) err_code = RT_EOK;
{ ptr = (rt_uint8_t*)buffer;
/* interrupt mode Tx */ uart = (struct serial_device*)dev->user_data;
while (uart->int_tx->save_index != uart->int_tx->write_index)
{
/* save on tx buffer */
uart->int_tx->tx_buffer[uart->int_tx->save_index] = *ptr++;
-- size;
/* move to next position */ if (ptr == RT_NULL)
uart->int_tx->save_index ++; {
err_code = -RT_ENOMEM;
/* wrap save index */ rt_set_errno(err_code);
if (uart->int_tx->save_index >= UART_TX_BUFFER_SIZE) return -RT_ENOMEM;
uart->int_tx->save_index = 0; }
} if (dev->flag & RT_DEVICE_FLAG_INT_TX)
{
/* set error code */ /* interrupt mode Tx */
if (size > 0) while (uart->int_tx->save_index != uart->int_tx->write_index)
err_code = -RT_EFULL; {
} /* save on tx buffer */
else uart->int_tx->tx_buffer[uart->int_tx->save_index] = *ptr++;
{
/* polling mode */
while (size)
{
/*
* to be polite with serial console add a line feed
* to the carriage return character
*/
if (*ptr == '\n' && (dev->flag & RT_DEVICE_FLAG_STREAM))
{
while (!(uart->uart_device->ustat & USTAT_TXB_EMPTY));
uart->uart_device->utxh = '\r';
}
while (!(uart->uart_device->ustat & USTAT_TXB_EMPTY)); -- size;
uart->uart_device->utxh = (*ptr & 0xFF);
++ptr; --size; /* move to next position */
} uart->int_tx->save_index ++;
}
/* set error code */ /* wrap save index */
rt_set_errno(err_code); if (uart->int_tx->save_index >= UART_TX_BUFFER_SIZE)
uart->int_tx->save_index = 0;
return (rt_uint32_t)ptr - (rt_uint32_t)buffer; }
/* set error code */
if (size > 0)
err_code = -RT_EFULL;
}
else
{
/* polling mode */
while (size)
{
/*
* to be polite with serial console add a line feed
* to the carriage return character
*/
if (*ptr == '\n' && (dev->flag & RT_DEVICE_FLAG_STREAM))
{
while (!(uart->uart_device->ustat & USTAT_TXB_EMPTY));
uart->uart_device->utxh = '\r';
}
while (!(uart->uart_device->ustat & USTAT_TXB_EMPTY));
uart->uart_device->utxh = (*ptr & 0xFF);
++ptr;
--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)
*/ */
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 */
RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX);
/* save on rx buffer */ /* interrupt mode receive */
while (uart->uart_device->ustat & USTAT_RCV_READY) RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX);
{
rt_serial_savechar(uart, uart->uart_device->urxh & 0xff);
}
/* invoke callback */ /* save on rx buffer */
if (device->rx_indicate != RT_NULL) while (uart->uart_device->ustat & USTAT_RCV_READY)
{ {
rt_size_t rx_length; rt_serial_savechar(uart, uart->uart_device->urxh & 0xff);
}
/* get rx length */
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->int_rx->save_index - uart->int_rx->read_index;
device->rx_indicate(device, rx_length); /* invoke callback */
} if (device->rx_indicate != RT_NULL)
{
rt_size_t rx_length;
/* get rx length */
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->int_rx->save_index - uart->int_rx->read_index;
device->rx_indicate(device, rx_length);
}
} }
/*@}*/ /*@}*/

View File

@ -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 @@
#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