00001 /* 00002 * Copyright (C) 2005 by egnite Software GmbH. All rights reserved. 00003 * 00004 * Redistribution and use in source and binary forms, with or without 00005 * modification, are permitted provided that the following conditions 00006 * are met: 00007 * 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the copyright holders nor the names of 00014 * contributors may be used to endorse or promote products derived 00015 * from this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS 00018 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00019 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00020 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE 00021 * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00022 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00023 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 00024 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 00025 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00026 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 00027 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00028 * SUCH DAMAGE. 00029 * 00030 * For additional information see http://www.ethernut.de/ 00031 */ 00032 00033 /* 00034 * $Log: usart1at91.c,v $ 00035 * Revision 1.3 2006/07/05 07:55:23 haraldkipp 00036 * Daidai's support for AT91SAM7X added. 00037 * 00038 * Revision 1.2 2006/01/05 16:47:08 haraldkipp 00039 * Baudrate calculation is now based on NutGetCpuClock(). 00040 * 00041 * Revision 1.1 2005/11/20 14:40:28 haraldkipp 00042 * Added interrupt driven UART driver for AT91. 00043 * 00044 */ 00045 00046 #include <cfg/os.h> 00047 #include <cfg/clock.h> 00048 #include <arch/arm.h> 00049 00050 #include <string.h> 00051 00052 #include <sys/atom.h> 00053 #include <sys/event.h> 00054 #include <sys/timer.h> 00055 00056 #include <dev/irqreg.h> 00057 #include <dev/usartat91.h> 00058 00059 #ifndef NUT_CPU_FREQ 00060 #ifdef NUT_PLL_CPUCLK 00061 #include <dev/cy2239x.h> 00062 #else /* !NUT_PLL_CPUCLK */ 00063 #define NUT_CPU_FREQ 73728000UL 00064 #endif /* !NUT_PLL_CPUCLK */ 00065 #endif /* !NUT_CPU_FREQ */ 00066 00067 /* 00068 * Local function prototypes. 00069 */ 00070 static u_long At91UsartGetSpeed(void); 00071 static int At91UsartSetSpeed(u_long rate); 00072 static u_char At91UsartGetDataBits(void); 00073 static int At91UsartSetDataBits(u_char bits); 00074 static u_char At91UsartGetParity(void); 00075 static int At91UsartSetParity(u_char mode); 00076 static u_char At91UsartGetStopBits(void); 00077 static int At91UsartSetStopBits(u_char bits); 00078 static u_long At91UsartGetFlowControl(void); 00079 static int At91UsartSetFlowControl(u_long flags); 00080 static u_long At91UsartGetStatus(void); 00081 static int At91UsartSetStatus(u_long flags); 00082 static u_char At91UsartGetClockMode(void); 00083 static int At91UsartSetClockMode(u_char mode); 00084 static void At91UsartTxStart(void); 00085 static void At91UsartRxStart(void); 00086 static int At91UsartInit(void); 00087 static int At91UsartDeinit(void); 00088 00093 00097 static USARTDCB dcb_usart1 = { 00098 0, /* dcb_modeflags */ 00099 0, /* dcb_statusflags */ 00100 0, /* dcb_rtimeout */ 00101 0, /* dcb_wtimeout */ 00102 {0, 0, 0, 0, 0, 0, 0, 0}, /* dcb_tx_rbf */ 00103 {0, 0, 0, 0, 0, 0, 0, 0}, /* dcb_rx_rbf */ 00104 0, /* dbc_last_eol */ 00105 At91UsartInit, /* dcb_init */ 00106 At91UsartDeinit, /* dcb_deinit */ 00107 At91UsartTxStart, /* dcb_tx_start */ 00108 At91UsartRxStart, /* dcb_rx_start */ 00109 At91UsartSetFlowControl, /* dcb_set_flow_control */ 00110 At91UsartGetFlowControl, /* dcb_get_flow_control */ 00111 At91UsartSetSpeed, /* dcb_set_speed */ 00112 At91UsartGetSpeed, /* dcb_get_speed */ 00113 At91UsartSetDataBits, /* dcb_set_data_bits */ 00114 At91UsartGetDataBits, /* dcb_get_data_bits */ 00115 At91UsartSetParity, /* dcb_set_parity */ 00116 At91UsartGetParity, /* dcb_get_parity */ 00117 At91UsartSetStopBits, /* dcb_set_stop_bits */ 00118 At91UsartGetStopBits, /* dcb_get_stop_bits */ 00119 At91UsartSetStatus, /* dcb_set_status */ 00120 At91UsartGetStatus, /* dcb_get_status */ 00121 At91UsartSetClockMode, /* dcb_set_clock_mode */ 00122 At91UsartGetClockMode, /* dcb_get_clock_mode */ 00123 }; 00124 00140 NUTDEVICE devUsartAt911 = { 00141 0, /* Pointer to next device, dev_next. */ 00142 {'u', 'a', 'r', 't', '1', 0, 0, 0, 0}, /* Unique device name, dev_name. */ 00143 IFTYP_CHAR, /* Type of device, dev_type. */ 00144 1, /* Base address, dev_base (not used). */ 00145 0, /* First interrupt number, dev_irq (not used). */ 00146 0, /* Interface control block, dev_icb (not used). */ 00147 &dcb_usart1, /* Driver control block, dev_dcb. */ 00148 UsartInit, /* Driver initialization routine, dev_init. */ 00149 UsartIOCtl, /* Driver specific control function, dev_ioctl. */ 00150 UsartRead, /* Read from device, dev_read. */ 00151 UsartWrite, /* Write to device, dev_write. */ 00152 UsartOpen, /* Open a device or file, dev_open. */ 00153 UsartClose, /* Close a device or file, dev_close. */ 00154 UsartSize /* Request file size, dev_size. */ 00155 }; 00156 00160 00161 #define USARTn_BASE USART1_BASE 00162 #define US_ID US1_ID 00163 #ifdef MCU_AT91SAM7X256 00164 #define US_GPIO_PINS 0x00000060 00165 #else 00166 #define US_GPIO_PINS 0x00600000 00167 #endif 00168 #define SIG_UART sig_UART1 00169 #define dcb_usart dcb_usart1 00170 00171 #include "usartat91.c"