This is the mail archive of the
ecos-patches@sourceware.org
mailing list for the eCos project.
[PATCH]:add support for at91sam7x processor to work in different supported USART MODE
- From: vibisreenivasan <vibi_sreenivasan at cms dot com>
- To: ecos-patches at ecos dot sourceware dot org
- Date: Mon, 30 Mar 2009 11:55:53 +0530
- Subject: [PATCH]:add support for at91sam7x processor to work in different supported USART MODE
- Reply-to: vibi_sreenivasan at cms dot com
AT91sam7x hardware supports different usart configurations like
RS485,IrDA.
Patch helps that to be set during compile time.
Thanks & Regards
vibi
Index: packages/devs/serial/arm/at91/current/src/at91_serial.c
===================================================================
RCS file: /media/nfs/ecos-exp/ecos/packages/devs/serial/arm/at91/current/src/at91_serial.c,v
retrieving revision 1.1.1.1
diff -u -5 -p -r1.1.1.1 at91_serial.c
--- packages/devs/serial/arm/at91/current/src/at91_serial.c 28 Mar 2009 11:18:51 -0000 1.1.1.1
+++ packages/devs/serial/arm/at91/current/src/at91_serial.c 30 Mar 2009 06:23:22 -0000
@@ -88,10 +88,11 @@ typedef struct at91_serial_info {
cyg_handle_t serial_interrupt_handle;
cyg_uint8 *rcv_buffer[2];
cyg_uint16 rcv_chunk_size;
cyg_uint8 curbuf;
cyg_uint8 flags;
+ cyg_uint8 mode;
} at91_serial_info;
static bool at91_serial_init(struct cyg_devtab_entry *tab);
static bool at91_serial_putc_interrupt(serial_channel *chan, unsigned char c);
#if (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL0) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE == 0) \
@@ -145,11 +146,12 @@ static cyg_uint8 at91_serial_rcv_buffer_
[2][CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_RCV_CHUNK_SIZE + RCVBUF_EXTRA];
static at91_serial_info at91_serial_info0 = {
base : (CYG_ADDRWORD) AT91_USART0,
int_num : CYGNUM_HAL_INTERRUPT_USART0,
rcv_chunk_size : CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_RCV_CHUNK_SIZE,
- rcv_buffer : {at91_serial_rcv_buffer_0[0], at91_serial_rcv_buffer_0[1]}
+ rcv_buffer : {at91_serial_rcv_buffer_0[0], at91_serial_rcv_buffer_0[1]},
+ mode : AT91_US_MR_USART_MODE_NORMAL
};
#if CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE > 0
static unsigned char at91_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE];
static unsigned char at91_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE];
@@ -192,11 +194,12 @@ static cyg_uint8 at91_serial_rcv_buffer_
[2][CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_RCV_CHUNK_SIZE + RCVBUF_EXTRA];
static at91_serial_info at91_serial_info1 = {
base : (CYG_ADDRWORD) AT91_USART1,
int_num : CYGNUM_HAL_INTERRUPT_USART1,
rcv_chunk_size : CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_RCV_CHUNK_SIZE,
- rcv_buffer : {at91_serial_rcv_buffer_1[0], at91_serial_rcv_buffer_1[1]}
+ rcv_buffer : {at91_serial_rcv_buffer_1[0], at91_serial_rcv_buffer_1[1]},
+ mode : AT91_US_MR_USART_MODE_NORMAL
};
#if CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE > 0
static unsigned char at91_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE];
static unsigned char at91_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE];
@@ -240,11 +243,12 @@ static cyg_uint8 at91_serial_rcv_buffer_
[2][CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_RCV_CHUNK_SIZE + RCVBUF_EXTRA];
static at91_serial_info at91_serial_info2 = {
base : (CYG_ADDRWORD) AT91_USART2,
int_num : CYGNUM_HAL_INTERRUPT_USART2,
rcv_chunk_size : CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_RCV_CHUNK_SIZE,
- rcv_buffer : {at91_serial_rcv_buffer_2[0], at91_serial_rcv_buffer_2[1]}
+ rcv_buffer : {at91_serial_rcv_buffer_2[0], at91_serial_rcv_buffer_2[1]},
+ mode : AT91_US_MR_USART_MODE_NORMAL
};
#if CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE > 0
static unsigned char at91_serial_out_buf2[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE];
static unsigned char at91_serial_in_buf2[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE];
@@ -301,11 +305,11 @@ at91_serial_config_port(serial_channel *
// Reset device
HAL_WRITE_UINT32(base + AT91_US_CR, AT91_US_CR_RxRESET | AT91_US_CR_TxRESET);
// Configuration
- HAL_WRITE_UINT32(base + AT91_US_MR, parity | word_length | stop_bits);
+ HAL_WRITE_UINT32(base + AT91_US_MR,at91_chan->mode | parity | word_length | stop_bits);
// Baud rate
HAL_WRITE_UINT32(base + AT91_US_BRG, AT91_US_BAUD(select_baud[new_config->baud]));
// Disable all interrupts
Index: packages/hal/arm/at91/var/current/include/var_io.h
===================================================================
RCS file: /media/nfs/ecos-exp/ecos/packages/hal/arm/at91/var/current/include/var_io.h,v
retrieving revision 1.1.1.1
diff -u -5 -p -r1.1.1.1 var_io.h
--- packages/hal/arm/at91/var/current/include/var_io.h 28 Mar 2009 11:18:18 -0000 1.1.1.1
+++ packages/hal/arm/at91/var/current/include/var_io.h 28 Mar 2009 11:42:37 -0000
@@ -73,10 +73,20 @@
#define AT91_US_CR_TxENAB (1<<6)
#define AT91_US_CR_TxDISAB (1<<7)
#define AT91_US_CR_RSTATUS (1<<8)
#define AT91_US_CR_STTTO (1<<11)
#define AT91_US_MR 0x04 // Mode register
+#define AT91_US_MR_USART_MODE 0
+#define AT91_US_MR_USART_MODE_NORMAL (0<<AT91_US_MR_USART_MODE)
+#define AT91_US_MR_USART_MODE_RS485 (1<<AT91_US_MR_USART_MODE)
+#define AT91_US_MR_USART_MODE_HW_HNDSHAKE (2<<AT91_US_MR_USART_MODE)
+#define AT91_US_MR_USART_MODE_MODEM (3<<AT91_US_MR_USART_MODE)
+#define AT91_US_MR_USART_MODE_ISO7816T0 (4<<AT91_US_MR_USART_MODE)
+#define AT91_US_MR_USART_MODE_RESERVED (5<<AT91_US_MR_USART_MODE)
+#define AT91_US_MR_USART_MODE_ISO7816T1 (6<<AT91_US_MR_USART_MODE)
+#define AT91_US_MR_USART_MODE_RESERVED (7<<AT91_US_MR_USART_MODE)
+#define AT91_US_MR_USART_MODE_IrDA (8<<AT91_US_MR_USART_MODE)
#define AT91_US_MR_CLOCK 4
#define AT91_US_MR_CLOCK_MCK (0<<AT91_US_MR_CLOCK)
#define AT91_US_MR_CLOCK_MCK8 (1<<AT91_US_MR_CLOCK)
#define AT91_US_MR_CLOCK_SCK (2<<AT91_US_MR_CLOCK)
#define AT91_US_MR_LENGTH 6