diff --git a/ChangeLog b/ChangeLog index d8fc1d643b0446452584a1a167fa1ebc0db3989f..188d2f606918c900136d5623432ea55b99e5c0a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2009,3 +2009,5 @@ * confgs/twr-k60n512: Add Kinetics TWR-K60N512 NSH configuration. * drivers/analog and include/nuttx/analog: Add ADC driver infrastructure and TI ADS1255 driver developed and submitted by Li Zhouy (Lzzy)). + * arch/arm/stm32/stm32_sdio.h and drvers/mmcsd/mmcsd.c: Add logic to + multiplex usage of the GPIO pins. \ No newline at end of file diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html index c854fd8b7186972f4289f1dfbd4a2f3f70115aa3..4b86fc39cb4d46f665a2c9fde6efb6b8dd26d316 100644 --- a/Documentation/NuttX.html +++ b/Documentation/NuttX.html @@ -8,7 +8,7 @@ <tr align="center" bgcolor="#e4e4e4"> <td> <h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1> - <p>Last Updated: August 18, 2011</p> + <p>Last Updated: August 19, 2011</p> </td> </tr> </table> @@ -678,6 +678,21 @@ </tr> </table></center> +<tr> + <td valign="top" width="22"><img height="20" width="20" src="favicon.ico"></td> + <td bgcolor="#5eaee1"> + <b>Analog Devices</b> + </td> +</tr> +<tr> + <td><br></td> + <td> + <p> + <li>Support for Analog-to-Digital converters.</li> + </p> +</tr> +</table></center> + <p> <b>NuttX Add-Ons</b>. The following packages are available to extend the basic NuttX feature set: @@ -2700,6 +2715,9 @@ nuttx-6.8 2011-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> (reported by Li Zhouy (Lzzy)). * 8/18/2011: The basic port to the FreeScale Kinetics TWR-K60N512 board is now functional. + * confgs/twr-k60n512: Add Kinetics TWR-K60N512 NSH configuration. + * drivers/analog and include/nuttx/analog: Add ADC driver infrastructure + and TI ADS1255 driver developed and submitted by Li Zhouy (Lzzy)). apps-6.8 2011-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> diff --git a/Documentation/NuttxPortingGuide.html b/Documentation/NuttxPortingGuide.html index a2b17b108cbc07ee4a8f4958c73501d090e1d61e..2fda4d612b8ea4f6d2c1005be26c6dd9b6001ce1 100644 --- a/Documentation/NuttxPortingGuide.html +++ b/Documentation/NuttxPortingGuide.html @@ -12,7 +12,7 @@ <h1><big><font color="#3c34ec"> <i>NuttX RTOS Porting Guide</i> </font></big></h1> - <p>Last Updated: July 27, 2011</p> + <p>Last Updated: August 19, 2011</p> </td> </tr> </table> @@ -730,6 +730,8 @@ <code>setenv.sh</code>: This is a script that you can include that will be installed at the top level of the directory structure and can be sourced to set any necessary environment variables. + You will most likely have to customize the default <code>setenv.sh</code> script in order + for it to work correctly in your environment. </p> </li> </ul> @@ -863,8 +865,8 @@ </li> <li><code>configs/olimex-lpc2378</code>: - This port uses the Olimex-lpc2378 board and a GNU arm-elf toolchain under - Linux or Cygwin. STATUS: ostest and NSH configurations available. + This port uses the Olimex-lpc2378 board and a GNU arm-elf toolchain under + Linux or Cygwin. STATUS: ostest and NSH configurations available. </li> <li><code>configs/olimex-strp711</code>: @@ -904,12 +906,12 @@ </li> <li><code>configs/sam3u-ek</code>: - The port of NuttX to the Atmel SAM3U-EK development board. + The port of NuttX to the Atmel SAM3U-EK development board. </li> <li><code>configs/skp16c26</code>: - Renesas M16C processor on the Renesas SKP16C26 StarterKit. This port - uses the GNU m32c toolchain. STATUS: The port is complete but untested + Renesas M16C processor on the Renesas SKP16C26 StarterKit. This port + uses the GNU m32c toolchain. STATUS: The port is complete but untested due to issues with compiler internal errors. </li> @@ -3847,6 +3849,21 @@ build </li> </ul> +<h3>SDIO/SDHC driver</h3> +<ul> + <li> + <code>CONFIG_SDIO_DMA</code>: SDIO driver supports DMA + </li> + <li> + <code>CONFIG_SDIO_MUXBUS</code>: Set this SDIO interface if the SDIO interface + or hardware resources are shared with other drivers. + </li> + <li> + <code>CONFIG_SDIO_WIDTH_D1_ONLY</code>: Select 1-bit transfer mode. Default: + 4-bit transfer mode. + </li> +</ul> + <h3>SDIO-based MMC/SD driver</h3> <ul> <li> @@ -3977,6 +3994,22 @@ build </li> </ul> +<h3>Analog Devices</h3> +<ul> + <li> + <code>CONFIG_DAC</code>: + Enables general support for Digital-to-Analog conversion devices. + </li> + <li> + <code>CONFIG_ADC</code>: + Enables general support for Analog-to-Digital conversion devices. + </li> + <li> + <code>CONFIG_ADC_ADS125X</code>: + Adds support for the TI ADS 125x ADC. + </li> +</ul> + <h3>ENC28J60 Ethernet Driver Configuration Settings</h3> <ul> <li> diff --git a/arch/arm/src/stm32/stm32_rcc.c b/arch/arm/src/stm32/stm32_rcc.c index f39aa0d429213eb629808e13ef51b6a25201e289..a9155f1a268345acd955bbe82bc91fe62c98169d 100755 --- a/arch/arm/src/stm32/stm32_rcc.c +++ b/arch/arm/src/stm32/stm32_rcc.c @@ -59,6 +59,22 @@ #define HSERDY_TIMEOUT 256 +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Activity reference count, showing inactivity after start-up. + * Device drivers increment this count using rcclock() and rccunlock() + * + * If this value goes beyond the range [0, MAX_RCCs] indicates + * reference count leakage (asymetric number of locks vs. unlocks) and + * system enters permanent active state. + */ + +#ifdef CONFIG_STM32_RCCLOCK +static int stm32_rcclock_count = 0; +#endif + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -98,7 +114,6 @@ static inline void rcc_reset(void) putreg32(0, STM32_RCC_CIR); /* Disable all interrupts */ } - static inline void rcc_enableahb(void) { uint32_t regval; @@ -140,7 +155,6 @@ static inline void rcc_enableahb(void) putreg32(regval, STM32_RCC_AHBENR); /* Enable peripherals */ } - static inline void rcc_enableapb1(void) { uint32_t regval; @@ -292,7 +306,6 @@ static inline void rcc_enableapb1(void) putreg32(regval, STM32_RCC_APB1ENR); } - static inline void rcc_enableapb2(void) { uint32_t regval; @@ -374,14 +387,14 @@ static inline void rcc_enableapb2(void) putreg32(regval, STM32_RCC_APB2ENR); } - #if !defined(CONFIG_ARCH_BOARD_STM32_CUSTOM_CLOCKCONFIG) -/** Called to change to new clock based on settings in board.h +/* Called to change to new clock based on settings in board.h * - * NOTE: This logic would need to be extended if you need to select low- - * power clocking modes! - **/ + * NOTE: This logic would need to be extended if you need to select low- + * power clocking modes! + */ + static inline void stm32_stdclockconfig(void) { uint32_t regval; @@ -469,7 +482,6 @@ static inline void stm32_stdclockconfig(void) } #endif - /**************************************************************************** * Public Functions ****************************************************************************/ @@ -501,22 +513,66 @@ void stm32_clockconfig(void) rcc_enableapb1(); } - -/** +/* * \todo Check for LSE good timeout and return with -1, * possible ISR optimization? or at least ISR should be cough in case of failure */ + void stm32_rcc_enablelse(void) { - /* Enable LSE */ - modifyreg16(STM32_RCC_BDCR, 0, RCC_BDCR_LSEON); + /* Enable LSE */ + + modifyreg16(STM32_RCC_BDCR, 0, RCC_BDCR_LSEON); - /* We could wait for ISR here ... */ - while( !(getreg16(STM32_RCC_BDCR) & RCC_BDCR_LSERDY) ) up_waste(); + /* We could wait for ISR here ... */ + + while( !(getreg16(STM32_RCC_BDCR) & RCC_BDCR_LSERDY) ) up_waste(); - /* Select LSE as RTC Clock Source */ - modifyreg16(STM32_RCC_BDCR, RCC_BDCR_RTCSEL_MASK, RCC_BDCR_RTCSEL_LSE); + /* Select LSE as RTC Clock Source */ + + modifyreg16(STM32_RCC_BDCR, RCC_BDCR_RTCSEL_MASK, RCC_BDCR_RTCSEL_LSE); - /* Enable Clock */ - modifyreg16(STM32_RCC_BDCR, 0, RCC_BDCR_RTCEN); + /* Enable Clock */ + + modifyreg16(STM32_RCC_BDCR, 0, RCC_BDCR_RTCEN); +} + +#ifdef CONFIG_STM32_RCCLOCK +uint32_t stm32_rcclock(uint8_t domain_id) +{ + // THINK: + // maybe just shift domain_id into 32-bit or 64-bit register + // and if there value of this var != 0, we are active... + // increment some variable, so it is possible to test leakage + // multiple locks or multiple unlocks + + if (stm32_rcclock_count >= 0) + { + stm32_rcclock_count++; + if (stm32_rcclock_count > 64) + { + stm32_rcclock_count = -1; /* capture error */ + } + } + + return 0; } + +uint32_t stm32_rccunlock(uint8_t domain_id) +{ + if (stm32_rcclock_count > -1) + { + stm32_rcclock_count--; + } + return 0; +} + +uint32_t stm32_setrccoptions(uint8_t domain_id, uint32_t options) +{ +} + +int stm32_getrccactivity(void) +{ + return stm32_rcclock_count; +} +#endif diff --git a/arch/arm/src/stm32/stm32_rcc.h b/arch/arm/src/stm32/stm32_rcc.h index 1c0020a21dbb47a593cd08f5438e50e35a08e18d..a224447a1b58ed2922e2707c2e3c36df53531cdb 100755 --- a/arch/arm/src/stm32/stm32_rcc.h +++ b/arch/arm/src/stm32/stm32_rcc.h @@ -72,22 +72,21 @@ extern "C" { extern uint32_t stm32_vectors[]; /* See stm32_vectors.S */ - /************************************************************************************ * Public Function Prototypes ************************************************************************************/ -/** Called to change to new clock based on settings in board.h +/* Called to change to new clock based on settings in board.h * - * NOTE: This logic needs to be extended so that we can selected low-power - * clocking modes as well! - **/ + * NOTE: This logic needs to be extended so that we can selected low-power + * clocking modes as well! + */ + EXTERN void stm32_clockconfig(void); -/** Enable LSE Clock - **/ -EXTERN void stm32_rcc_enablelse(void); +/* Enable LSE Clock */ +EXTERN void stm32_rcc_enablelse(void); #undef EXTERN #if defined(__cplusplus) diff --git a/arch/arm/src/stm32/stm32_sdio.c b/arch/arm/src/stm32/stm32_sdio.c index 63930ef8bcca67e424a4c3722ea7ea6c03cc5852..1bd2b8c9767a2c4de09f9f893074d483f823ee09 100644 --- a/arch/arm/src/stm32/stm32_sdio.c +++ b/arch/arm/src/stm32/stm32_sdio.c @@ -317,6 +317,12 @@ static int stm32_interrupt(int irq, void *context); /* SDIO interface methods ***************************************************/ +/* Mutual exclusion */ + +#ifdef CONFIG_SDIO_MUXBUS +static int stm32_lock(FAR struct sdio_dev_s *dev, bool lock); +#endif + /* Initialization/setup */ static void stm32_reset(FAR struct sdio_dev_s *dev); @@ -380,6 +386,9 @@ struct stm32_dev_s g_sdiodev = { .dev = { +#ifdef CONFIG_SDIO_MUXBUS + .lock = stm32_lock, +#endif .reset = stm32_reset, .status = stm32_status, .widebus = stm32_widebus, @@ -1312,6 +1321,35 @@ static int stm32_interrupt(int irq, void *context) /**************************************************************************** * SDIO Interface Methods ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_lock + * + * Description: + * Locks the bus. Function calls low-level multiplexed bus routines to + * resolve bus requests and acknowledgment issues. + * + * Input Parameters: + * dev - An instance of the SDIO device interface + * lock - TRUE to lock, FALSE to unlock. + * + * Returned Value: + * OK on success; a negated errno on failure + * + ****************************************************************************/ + +#ifdef CONFIG_SDIO_MUXBUS +static int stm32_lock(FAR struct sdio_dev_s *dev, bool lock) +{ + /* Single SDIO instance so there is only one possibility. The multiplex + * bus is part of board support package. + */ + + stm32_muxbus_sdio_lock(lock); + return OK; +} +#endif + /**************************************************************************** * Name: stm32_reset * @@ -2574,8 +2612,12 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno) /* Configure GPIOs for 4-bit, wide-bus operation (the chip is capable of * 8-bit wide bus operation but D4-D7 are not configured). + * + * If bus is multiplexed then there is a custom bus configuration utility + * in the scope of the board support package. */ +#ifndef CONFIG_SDIO_MUXBUS stm32_configgpio(GPIO_SDIO_D0); #ifndef CONFIG_SDIO_WIDTH_D1_ONLY stm32_configgpio(GPIO_SDIO_D1); @@ -2584,6 +2626,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno) #endif stm32_configgpio(GPIO_SDIO_CK); stm32_configgpio(GPIO_SDIO_CMD); +#endif /* Reset the card and assure that it is in the initial, unconfigured * state. diff --git a/configs/README.txt b/configs/README.txt index d90d4c655a1679a98b30d413f7254d2ce86bd2ef..f958e30857c76e3ce488d3e9d90ca0ab7f1b4450 100644 --- a/configs/README.txt +++ b/configs/README.txt @@ -562,6 +562,7 @@ defconfig -- This is a configuration file similar to the Linux for pipe and FIFO support Filesystem configuration + CONFIG_FS_FAT - Enable FAT filesystem support CONFIG_FAT_SECTORSIZE - Max supported sector size CONFIG_FAT_LCNAMES - Enable use of the NT-style upper/lower case 8.3 @@ -604,6 +605,7 @@ defconfig -- This is a configuration file similar to the Linux implemented by copying whole files into memory. SPI driver + CONFIG_SPI_OWNBUS - Set if there is only one active device on the SPI bus. No locking or SPI configuration will be performed. It is not necessary for clients to lock, re-configure, etc.. @@ -611,6 +613,7 @@ defconfig -- This is a configuration file similar to the Linux (vs a recvblock() and sndblock ()methods) SPI-based MMC/SD driver + CONFIG_MMCSD_NSLOTS - Number of MMC/SD slots supported by the driver. Default is one. CONFIG_MMCSD_READONLY - Provide read-only access. Default is @@ -618,17 +621,24 @@ defconfig -- This is a configuration file similar to the Linux CONFIG_MMCSD_SPICLOCK - Maximum SPI clock to drive MMC/SD card. Default is 20MHz. + SDIO/SDHC driver: + + CONFIG_SDIO_DMA - SDIO driver supports DMA + CONFIG_SDIO_MUXBUS - Set this SDIO interface if the SDIO interface + or hardware resources are shared with other drivers. + CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default: + 4-bit transfer mode. + SDIO-based MMC/SD driver + CONFIG_FS_READAHEAD - Enable read-ahead buffering CONFIG_FS_WRITEBUFFER - Enable write buffering - CONFIG_SDIO_DMA - SDIO driver supports DMA CONFIG_MMCSD_MMCSUPPORT - Enable support for MMC cards CONFIG_MMCSD_HAVECARDDETECT - SDIO driver card detection is 100% accurate - CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default: - 4-bit transfer mode. RiT P14201 OLED driver + CONFIG_LCD_P14201 - Enable P14201 support CONFIG_P14201_SPIMODE - Controls the SPI mode CONFIG_P14201_FREQUENCY - Define to use a different bus frequency @@ -683,7 +693,17 @@ defconfig -- This is a configuration file similar to the Linux there are multiple TSC2007 touchscreens, this setting will enable multiple touchscreens with the same driver. + Analog Devices + + CONFIG_DAC + Enables general support for Digital-to-Analog conversion devices. + CONFIG_ADC + Enables general support for Analog-to-Digital conversion devices. + CONFIG_ADC_ADS125X + Adds support for the TI ADS 125x ADC. + ENC28J60 Ethernet Driver Configuration Settings: + CONFIG_NET_ENC28J60 - Enabled ENC28J60 support CONFIG_ENC28J60_SPIMODE - Controls the SPI mode CONFIG_ENC28J60_FREQUENCY - Define to use a different bus frequency @@ -693,6 +713,7 @@ defconfig -- This is a configuration file similar to the Linux CONFIG_ENC28J60_HALFDUPPLEX - Default is full duplex Networking support via uIP + CONFIG_NET - Enable or disable all network features CONFIG_NET_NOINTS -- CONFIG_NET_NOINT indicates that uIP not called from the interrupt level. If CONFIG_NET_NOINTS is defined, critical sections @@ -782,10 +803,12 @@ defconfig -- This is a configuration file similar to the Linux Default: 128 UIP Network Utilities + CONFIG_NET_DHCP_LIGHT - Reduces size of DHCP CONFIG_NET_RESOLV_ENTRIES - Number of resolver entries - THTTPD: + THTTPD + CONFIG_THTTPD_PORT - THTTPD Server port number CONFIG_THTTPD_IPADDR - Server IP address (no host name) CONFIG_THTTPD_SERVER_ADDRESS - SERVER_ADDRESS: response @@ -842,6 +865,7 @@ defconfig -- This is a configuration file similar to the Linux and verify referrers. USB device controller driver + CONFIG_USBDEV - Enables USB device support CONFIG_USBDEV_ISOCHRONOUS - Build in extra support for isochronous endpoints @@ -854,6 +878,7 @@ defconfig -- This is a configuration file similar to the Linux CONFIG_USBDEV_TRACE_NRECORDS - Number of trace entries to remember USB host controller driver + CONFIG_USBHOST Enables USB host support CONFIG_USBHOST_NPREALLOC @@ -1073,7 +1098,9 @@ appconfig -- This is another configuration file that is specific to the setenv.sh -- This is a script that you can include that will be installed at the toplevel of the directory structure and can be sourced to set any - necessary environment variables. + necessary environment variables. You will most likely have to customize the + default setenv.sh script in order for it to work correctly in your + environment. Supported Boards ^^^^^^^^^^^^^^^^ diff --git a/configs/vsn/README.txt b/configs/vsn/README.txt index f76cac1d5e67699540a14b1034b77bcfcd789fc1..9613c12ef75935097d6b51121ff98206f21b8758 100644 --- a/configs/vsn/README.txt +++ b/configs/vsn/README.txt @@ -3,6 +3,7 @@ README This README discusses issues unique to NuttX configurations for the ISOTEL NetClamps VSN V1.2 ready2go sensor network platform. +More information can be found at http://www.netclamps.com Contents ^^^^^^^^ @@ -164,77 +165,6 @@ NuttX buildroot Toolchain detailed PLUS some special instructions that you will need to follow if you are building a Cortex-M3 toolchain for Cygwin under Windows. -DFU -^^^ - - The linker files in these projects can be configured to indicate that you - will be loading code using STMicro built-in USB Device Firmware Upgrade (DFU) - loader or via some JTAG emulator. You can specify the DFU bootloader by - adding the following line: - - CONFIG_STM32_DFU=y - - to your .config file. Most of the configurations in this directory are set - up to use the DFU loader. - - If CONFIG_STM32_DFU is defined, the code will not be positioned at the beginning - of FLASH (0x08000000) but will be offset to 0x08003000. This offset is needed - to make space for the DFU loader and 0x08003000 is where the DFU loader expects - to find new applications at boot time. If you need to change that origin for some - other bootloader, you will need to edit the file(s) ld.script.dfu for each - configuration. - - The DFU SE PC-based software is available from the STMicro website, - http://www.st.com. General usage instructions: - - 1. Convert the NuttX Intel Hex file (nuttx.ihx) into a special DFU - file (nuttx.dfu)... see below for details. - 2. Connect the VSN board to your computer using a USB - cable. - 3. Start the DFU loader on the VSN board. You do this by - resetting the board while holding the "Key" button. Windows should - recognize that the DFU loader has been installed. - 3. Run the DFU SE program to load nutt.dfu into FLASH. - - What if the DFU loader is not in FLASH? The loader code is available - inside of the Demo dirctory of the USBLib ZIP file that can be downloaded - from the STMicro Website. You can build it using RIDE (or other toolchains); - you will need a JTAG emulator to burn it into FLASH the first time. - - In order to use STMicro's built-in DFU loader, you will have to get - the NuttX binary into a special format with a .dfu extension. The - DFU SE PC_based software installation includes a file "DFU File Manager" - conversion program that a file in Intel Hex format to the special DFU - format. When you successfully build NuttX, you will find a file called - nutt.ihx in the top-level directory. That is the file that you should - provide to the DFU File Manager. You will need to rename it to nuttx.hex - in order to find it with the DFU File Manager. You will end up with - a file called nuttx.dfu that you can use with the STMicro DFU SE program. - -LEDs -^^^^ - -The VSN board has four LEDs labeled LD1, LD2, LD3 and LD4 on the -the board. Usage of these LEDs is defined in include/board.h and src/up_leds.c. -They are encoded as follows: - - SYMBOL Meaning LED1* LED2 LED3 LED4 - ------------------- ----------------------- ------- ------- ------- ------ - LED_STARTED NuttX has been started ON OFF OFF OFF - LED_HEAPALLOCATE Heap has been allocated OFF ON OFF OFF - LED_IRQSENABLED Interrupts enabled ON ON OFF OFF - LED_STACKCREATED Idle stack created OFF OFF ON OFF - LED_INIRQ In an interrupt** ON N/C N/C OFF - LED_SIGNAL In a signal handler*** N/C ON N/C OFF - LED_ASSERTION An assertion failed ON ON N/C OFF - LED_PANIC The system has crashed N/C N/C N/C ON - - * If LED1, LED2, LED3 are statically on, then NuttX probably failed to boot - and these LEDs will give you some indication of where the failure was - ** The normal state is LED3 ON and LED1 faintly glowing. This faint glow - is because of timer interupts that result in the LED being illuminated - on a small proportion of the time. -*** LED2 may also flicker normally if signals are processed. VSN-specific Configuration Options ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -259,7 +189,7 @@ VSN-specific Configuration Options CONFIG_ARCH_CHIP_name - For use in C code to identify the exact chip: - CONFIG_ARCH_CHIP_STM32F103ZET6 + CONFIG_ARCH_CHIP_STM32F103RET6 CONFIG_ARCH_BOARD - Identifies the configs subdirectory and hence, the board that supports the particular chip or SoC. @@ -292,9 +222,6 @@ VSN-specific Configuration Options CONFIG_ARCH_IRQPRIO=y - CONFIG_ARCH_LEDS - Use LEDs to show state. Unique to boards that - have LEDs - CONFIG_ARCH_INTERRUPTSTACK - This architecture supports an interrupt stack. If defined, this symbol is the size of the interrupt stack in bytes. If not defined, the user task stacks will be @@ -311,96 +238,6 @@ VSN-specific Configuration Options the 100 second delay then adjust CONFIG_ARCH_LOOPSPERMSEC until the delay actually is 100 seconds. - Individual subsystems can be enabled: - AHB - --- - CONFIG_STM32_DMA1 - CONFIG_STM32_DMA2 - CONFIG_STM32_CRC - CONFIG_STM32_FSMC - CONFIG_STM32_SDIO - - APB1 - ---- - CONFIG_STM32_TIM2 - CONFIG_STM32_TIM3 - CONFIG_STM32_TIM4 - CONFIG_STM32_TIM5 - CONFIG_STM32_TIM6 - CONFIG_STM32_TIM7 - CONFIG_STM32_WWDG - CONFIG_STM32_SPI2 - CONFIG_STM32_SPI4 - CONFIG_STM32_USART2 - CONFIG_STM32_USART3 - CONFIG_STM32_UART4 - CONFIG_STM32_UART5 - CONFIG_STM32_I2C1 - CONFIG_STM32_I2C2 - CONFIG_STM32_USB - CONFIG_STM32_CAN - CONFIG_STM32_BKP - CONFIG_STM32_PWR - CONFIG_STM32_DAC - CONFIG_STM32_USB - - APB2 - ---- - CONFIG_STM32_ADC1 - CONFIG_STM32_ADC2 - CONFIG_STM32_TIM1 - CONFIG_STM32_SPI1 - CONFIG_STM32_TIM8 - CONFIG_STM32_USART1 - CONFIG_STM32_ADC3 - - Alternate pin mappings (should not be used with the VSN board): - - CONFIG_STM32_TIM1_FULL_REMAP - CONFIG_STM32_TIM1_PARTIAL_REMAP - CONFIG_STM32_TIM2_FULL_REMAP - CONFIG_STM32_TIM2_PARTIAL_REMAP_1 - CONFIG_STM32_TIM2_PARTIAL_REMAP_2 - CONFIG_STM32_TIM3_FULL_REMAP - CONFIG_STM32_TIM3_PARTIAL_REMAP - CONFIG_STM32_TIM4_REMAP - CONFIG_STM32_USART1_REMAP - CONFIG_STM32_USART2_REMAP - CONFIG_STM32_USART3_FULL_REMAP - CONFIG_STM32_USART3_PARTIAL_REMAP - CONFIG_STM32_SPI1_REMAP - CONFIG_STM32_SPI3_REMAP - CONFIG_STM32_I2C1_REMAP - CONFIG_STM32_CAN1_FULL_REMAP - CONFIG_STM32_CAN1_PARTIAL_REMAP - CONFIG_STM32_CAN2_REMAP - - STM32F103Z specific device driver settings - - CONFIG_U[S]ARTn_SERIAL_CONSOLE - selects the USARTn (n=1,2,3) or UART - m (m=4,5) for the console and ttys0 (default is the USART1). - CONFIG_U[S]ARTn_RXBUFSIZE - Characters are buffered as received. - This specific the size of the receive buffer - CONFIG_U[S]ARTn_TXBUFSIZE - Characters are buffered before - being sent. This specific the size of the transmit buffer - CONFIG_U[S]ARTn_BAUD - The configure BAUD of the UART. Must be - CONFIG_U[S]ARTn_BITS - The number of bits. Must be either 7 or 8. - CONFIG_U[S]ARTn_PARTIY - 0=no parity, 1=odd parity, 2=even parity - CONFIG_U[S]ARTn_2STOP - Two stop bits - - CONFIG_STM32_SPI_INTERRUPTS - Select to enable interrupt driven SPI - support. Non-interrupt-driven, poll-waiting is recommended if the - interrupt rate would be to high in the interrupt driven case. - CONFIG_STM32_SPI_DMA - Use DMA to improve SPI transfer performance. - Cannot be used with CONFIG_STM32_SPI_INTERRUPT. - - CONFIG_SDIO_DMA - Support DMA data transfers. Requires CONFIG_STM32_SDIO - and CONFIG_STM32_DMA2. - CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128 - CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority. - Default: Medium - CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default: - 4-bit transfer mode. Configurations ^^^^^^^^^^^^^^ @@ -418,3 +255,7 @@ Where <subdir> is one of the following: nsh: Configures the NuttShell (nsh) located at examples/nsh. The Configuration enables both the serial and telnetd NSH interfaces. + +The default configuration sets up a console on front-panel RS-232 +interface, sets up device driver of all supported equipment and +links in VSN default applications. diff --git a/configs/vsn/include/board.h b/configs/vsn/include/board.h index a1a30c4b198f6e47ca47ad2175be11e79e767b06..9f7ec075650b69c40221597e0cd670b83411a2ab 100644 --- a/configs/vsn/include/board.h +++ b/configs/vsn/include/board.h @@ -52,6 +52,9 @@ #include "stm32_sdio.h" #include "stm32_internal.h" +#include "muxbus.h" + + /************************************************************************************ * Definitions ************************************************************************************/ diff --git a/configs/vsn/include/muxbus.h b/configs/vsn/include/muxbus.h new file mode 100644 index 0000000000000000000000000000000000000000..595ded46ffe38d282e8b82c5aad34c41daa3d39e --- /dev/null +++ b/configs/vsn/include/muxbus.h @@ -0,0 +1,84 @@ +/************************************************************************************ + * configs/vsn/include/muxbus.h + * include/arch/board/muxbus.h + * + * Copyright (C) 2011 Uros Platise. All rights reserved + * + * Authors: Uros Platise <uros.platise@isotel.eu> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ + +#ifndef __ARCH_BOARD_MUXBUS_H +#define __ARCH_BOARD_MUXBUS_H + +#ifndef __ASSEMBLY__ +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" { +#else +#define EXTERN extern +#endif + +/************************************************************************************ + * Public Functions + ************************************************************************************/ + +/** + * Initialization of the semaphore and initial bus state. + */ +void vsn_muxbus_init(void); + +/** + * Simple Lock / Unlock Mechanism for the SDIO Interface + * + * NOTE: This function is provided for the stm32_sdio driver. + */ +extern void stm32_muxbus_sdio_lock(bool lock); + +/** + * Set PGA Gain of the Analog Devices AD8231 on bus shared with the + * SDIO interface + * + * \param gain sets the front-end gain as 2^{gain}, where gain = 0..7. + * Setting gain outside that range shutdowns the front-end. + * + * \return gain set or -1 if front end is put into shutdown. + */ +extern int vsn_muxbus_setpgagain(int gain); + + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_BOARD_MUXBUS_H */ diff --git a/configs/vsn/src/Makefile b/configs/vsn/src/Makefile index 89ff9b83889838d5bb58810903b177f5013b5a1d..ec360f8f66bfd77e03427564b14859bcb84d5d4a 100644 --- a/configs/vsn/src/Makefile +++ b/configs/vsn/src/Makefile @@ -53,7 +53,7 @@ ASRCS = AOBJS = $(ASRCS:.S=$(OBJEXT)) CSRCS = sysclock.c boot.c leds.c buttons.c spi.c \ - usbdev.c power.c sif.c + usbdev.c power.c muxbus.c sif.c ifeq ($(CONFIG_USBSTRG),y) CSRCS += usbstrg.c diff --git a/configs/vsn/src/boot.c b/configs/vsn/src/boot.c index 501bb07b5a593c21a5a0ac35100677de4d29b612..846f707b76e88ee95949e49b34128b1d1ff0398d 100644 --- a/configs/vsn/src/boot.c +++ b/configs/vsn/src/boot.c @@ -63,6 +63,7 @@ void stm32_boardinitialize(void) /* Set start-up board voltage */ board_power_init(); + vsn_muxbus_init(); /* Configure SPI chip selects if 1) SPI is not disabled, and 2) the weak function * stm32_spiinitialize() has been brought into the link. diff --git a/configs/vsn/src/muxbus.c b/configs/vsn/src/muxbus.c new file mode 100644 index 0000000000000000000000000000000000000000..76304d67d2ee9c8fa93742436d009b69c2cfbdf5 --- /dev/null +++ b/configs/vsn/src/muxbus.c @@ -0,0 +1,198 @@ +/**************************************************************************** + * config/vsn/src/muxbus.c + * arch/arm/src/board/muxbus.c + * + * Copyright (C) 2011 Uros Platise. All rights reserved. + * + * Authors: Uros Platise <uros.platise@isotel.eu> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** \file + * \author Uros Platise + * \brief VSN Multiplexed Bus, SDIO Interface and the Analog Front-End + */ + +#include <nuttx/config.h> +#include <semaphore.h> +#include <errno.h> + +#include "vsn.h" +#include "stm32_gpio.h" + + +/**************************************************************************** + * Private data + ****************************************************************************/ + +/** Set true when the bus has been locked by the SDIO interface */ +bool vsn_muxbus_ownedbysdio; + +/** Semaphore to resolve conflicts between muxbus locks */ +sem_t vsn_muxbus_sem; + + +/**************************************************************************** + * Private functions + ****************************************************************************/ + +void vsn_muxbus_takeownership(void) +{ + while (sem_wait(&vsn_muxbus_sem) != 0) { + + /* The only case that an error should occr here is if the wait was + * awakened by a signal. + */ + + ASSERT(errno == EINTR); + } +} + + +void vsn_muxbus_sdio_release(void) +{ + stm32_unconfiggpio(GPIO_SDIO_D0); + stm32_unconfiggpio(GPIO_SDIO_CK); + stm32_unconfiggpio(GPIO_SDIO_CMD); + + vsn_muxbus_ownedbysdio = FALSE; +} + + +void vsn_muxbus_sdio_access(void) +{ + stm32_configgpio(GPIO_SDIO_D0); + stm32_configgpio(GPIO_SDIO_CK); + stm32_configgpio(GPIO_SDIO_CMD); + + vsn_muxbus_ownedbysdio = TRUE; +} + + +/**************************************************************************** + * Public functions + ****************************************************************************/ + + +void vsn_muxbus_init(void) +{ + /* Put the PGA in default shut-down state */ + + stm32_configgpio(GPIO_PGIA_AEN); + + /* setup semaphore in non-locked condition */ + + sem_init(&vsn_muxbus_sem, 0, 1); + + /* by default give the bus to the SDIO */ + + vsn_muxbus_sdio_access(); +} + + +/** + * We could do extra checks: who is the owner to prevent + * unlocking from SDIO side eventhough it was not locked + * by him, but temporarily by the PGA + */ +void stm32_muxbus_sdio_lock(bool lock) +{ + if ( lock ) + vsn_muxbus_takeownership(); + else + sem_post(&vsn_muxbus_sem); +} + + +/** + * The following rules apply for the SDcard: + * + * - CMD serial line always starts with 0 (start-bit) and ends with 1 (stop-bit) + * The total length is always 48 bits protected by CRCs. When changing the + * gain, CMD must be seen as 1 on CK changes. + * + * - An alternative mechanism would be to use suspend/resume commands + * + * - If SDcard internal shift-register is 8-bit oriented there might be a need + * to shift 7 dummy bits to properly detect invalid start of packet + * (with start bit set as 1) to invalidate bus transitions (in case CK + * is changing). + * + * SDIO returns the bus in HiZ states, where CLK = 0, D = CMD = external pull-up + */ +int vsn_muxbus_setpgagain(int gain) +{ + /* Shutdown the Analog Devices AD8231 and exit if gain is invalid */ + + stm32_gpiowrite(GPIO_PGIA_AEN, FALSE); + + if (gain < 0 || gain > 7) + return -1; + + vsn_muxbus_takeownership(); + vsn_muxbus_sdio_release(); + + /* If we have to set CLK = 1, made that first as D, CMD are 1 by pull-ups */ + + if (gain & 2) + stm32_configgpio(GPIO_PGIA_A1_H); + else stm32_configgpio(GPIO_PGIA_A1_L); + + /* Set the D and CMD bits */ + + if (gain & 1) + stm32_configgpio(GPIO_PGIA_A0_H); + else stm32_configgpio(GPIO_PGIA_A0_L); + + if (gain & 4) + stm32_configgpio(GPIO_PGIA_A2_H); + else stm32_configgpio(GPIO_PGIA_A2_L); + + /* Sample GAIN on rising edge */ + + stm32_gpiowrite(GPIO_PGIA_AEN, TRUE); + + /* Release D and CMD pins to 1; however shorten rising edge actively */ + + stm32_gpiowrite(GPIO_PGIA_A0_H, TRUE); + stm32_gpiowrite(GPIO_PGIA_A2_H, TRUE); + + stm32_unconfiggpio(GPIO_PGIA_A0_H); + stm32_unconfiggpio(GPIO_PGIA_A2_H); + + /* Release CLK by going down and return the bus */ + + stm32_unconfiggpio(GPIO_PGIA_A1_L); + + vsn_muxbus_sdio_access(); + sem_post(&vsn_muxbus_sem); + + return gain; +} diff --git a/configs/vsn/src/sif.c b/configs/vsn/src/sif.c index 0e08280dec97c1075c0e7257e658ec162d1806f5..535a09829a8ab03fc76fe0f7587fee37d8117702 100644 --- a/configs/vsn/src/sif.c +++ b/configs/vsn/src/sif.c @@ -313,12 +313,12 @@ int sif_anout_init(void) // Use the TIM3 as PWM modulated analogue output - STM32_TIM_SETPERIOD(vsn_sif.tim3, 4096); - STM32_TIM_SETCOMPARE(vsn_sif.tim3, GPIO_OUT_PWM_TIM3_CH, 1024); + STM32_TIM_SETPERIOD(vsn_sif.tim3, 5); + STM32_TIM_SETCOMPARE(vsn_sif.tim3, GPIO_OUT_PWM_TIM3_CH, 3); STM32_TIM_SETCLOCK(vsn_sif.tim3, 36e6); STM32_TIM_SETMODE(vsn_sif.tim3, STM32_TIM_MODE_UP); - //STM32_TIM_SETCHANNEL(vsn_sif.tim3, GPIO_OUT_PWM_TIM3_CH, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); + STM32_TIM_SETCHANNEL(vsn_sif.tim3, GPIO_OUT_PWM_TIM3_CH, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); // Use the TIM8 to drive the upper power mosfet @@ -330,7 +330,7 @@ int sif_anout_init(void) STM32_TIM_SETCLOCK(vsn_sif.tim8, 36e6); STM32_TIM_SETMODE(vsn_sif.tim8, STM32_TIM_MODE_UP); - STM32_TIM_SETCHANNEL(vsn_sif.tim8, GPIO_OUT_PWRPWM_TIM8_CH, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); + //STM32_TIM_SETCHANNEL(vsn_sif.tim8, GPIO_OUT_PWRPWM_TIM8_CH, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); vsn_sif.i2c1 = up_i2cinitialize(1); vsn_sif.i2c2 = up_i2cinitialize(2); @@ -366,9 +366,77 @@ void sif_anref_init(void) * Analog Input Sampler Unit ****************************************************************************/ +#if 0 +/** + * Gain is set using the shared multiplexed bus with the SDIO card. + * The following rules apply for the SDcard: + * + * - CMD serial line always starts with 0 (start-bit) and ends with 1 (stop-bit) + * The total length is always 48 bits protected by CRCs. When changing the + * gain, CMD must be seen as 1 on CK changes. + * + * - An alternative mechanism would be to use suspend/resume commands + * + * - If SDcard internal shift-register is 8-bit oriented there might be a need + * to shift 7 dummy bits to properly detect invalid start of packet + * (with start bit set as 1) to invalidate bus transitions (in case CK + * is changing). + * + * SDIO returns the bus in HiZ states, where CLK = 0, D = CMD = external pull-up + */ +int sif_anin_setgain(int gain) +{ + /* Shutdown the PGA and exit if gain is invalid */ + + stm32_gpiowrite(GPIO_PGIA_AEN, FALSE); + + if (gain < 0 || gain > 7) + return -1; + + sdio_gpio_request(); + + /* If we have to set CLK = 1, made that first as D, CMD are 1 by pull-ups */ + + if (gain & 2) + stm32_configgpio(GPIO_PGIA_A1_H); + else stm32_configgpio(GPIO_PGIA_A1_L); + + /* Set the D and CMD bits */ + + if (gain & 1) + stm32_configgpio(GPIO_PGIA_A0_H); + else stm32_configgpio(GPIO_PGIA_A0_L); + + if (gain & 4) + stm32_configgpio(GPIO_PGIA_A2_H); + else stm32_configgpio(GPIO_PGIA_A2_L); + + /* Sample GAIN on rising edge */ + + stm32_gpiowrite(GPIO_PGIA_AEN, TRUE); + + /* Release D and CMD pins to 1; however shorten rising edge actively */ + + stm32_gpiowrite(GPIO_PGIA_A0_H, TRUE); + stm32_gpiowrite(GPIO_PGIA_A2_H, TRUE); + + stm32_unconfiggpio(GPIO_PGIA_A0_H); + stm32_unconfiggpio(GPIO_PGIA_A2_H); + + /* Release CLK by going down */ + + stm32_unconfiggpio(GPIO_PGIA_A1_L); + + sdio_gpio_release(); + + return gain; +} +#endif + -void sif_anin_reset(void) +int sif_anin_reset(void) { + return OK; } @@ -483,6 +551,7 @@ int sif_init(void) sif_gpios_reset(); if ( sif_anout_init() != OK ) return -1; + if ( sif_anin_reset() != OK ) return -1; /* If everything is okay, register the driver */ @@ -514,7 +583,8 @@ int sif_main(int argc, char *argv[]) } else if (!strcmp(argv[1], "pwr") && argc == 3) { int val = atoi(argv[2]); - STM32_TIM_SETCOMPARE(vsn_sif.tim8, GPIO_OUT_PWRPWM_TIM8_CH, val); + //STM32_TIM_SETCOMPARE(vsn_sif.tim8, GPIO_OUT_PWRPWM_TIM8_CH, val); + STM32_TIM_SETCOMPARE(vsn_sif.tim3, GPIO_OUT_PWM_TIM3_CH, val); return 0; } else if (!strcmp(argv[1], "time") && argc == 3) { @@ -592,6 +662,14 @@ int sif_main(int argc, char *argv[]) return 0; } + else if (!strcmp(argv[1], "pga")) { + int gain = atoi(argv[2]); + + gain = vsn_muxbus_setpgagain(gain); + + printf("Gain changed: %d\n", gain); + return 0; + } else if (!strcmp(argv[1], "cc")) { struct cc1101_dev_s * cc; uint8_t buf[64]; diff --git a/configs/vsn/src/vsn.h b/configs/vsn/src/vsn.h index 0b1d5dbc335b5914c8e95cc6bed40f3a9f442216..eb999f24661ecce981c201eaeca5de7ab05d54a9 100644 --- a/configs/vsn/src/vsn.h +++ b/configs/vsn/src/vsn.h @@ -150,6 +150,14 @@ #define GPIO_OUT_PWM (GPIO_ALT |GPIO_CNF_AFPP |GPIO_MODE_10MHz|GPIO_PORTB|GPIO_PIN1 ) #define GPIO_OUT_PWM_TIM3_CH 4 /* TIM3.CH4 */ +#define GPIO_PGIA_A0_H (GPIO_OUTPUT|GPIO_CNF_OUTPP |GPIO_MODE_2MHz |GPIO_PORTC|GPIO_PIN8 |GPIO_OUTPUT_SET) +#define GPIO_PGIA_A0_L (GPIO_OUTPUT|GPIO_CNF_OUTPP |GPIO_MODE_2MHz |GPIO_PORTC|GPIO_PIN8 |GPIO_OUTPUT_CLEAR) +#define GPIO_PGIA_A1_L (GPIO_OUTPUT|GPIO_CNF_OUTPP |GPIO_MODE_2MHz |GPIO_PORTC|GPIO_PIN12|GPIO_OUTPUT_CLEAR) +#define GPIO_PGIA_A1_H (GPIO_OUTPUT|GPIO_CNF_OUTPP |GPIO_MODE_2MHz |GPIO_PORTC|GPIO_PIN12|GPIO_OUTPUT_SET) +#define GPIO_PGIA_A2_H (GPIO_OUTPUT|GPIO_CNF_OUTPP |GPIO_MODE_2MHz |GPIO_PORTD|GPIO_PIN2 |GPIO_OUTPUT_SET) +#define GPIO_PGIA_A2_L (GPIO_OUTPUT|GPIO_CNF_OUTPP |GPIO_MODE_2MHz |GPIO_PORTD|GPIO_PIN2 |GPIO_OUTPUT_CLEAR) +#define GPIO_PGIA_AEN (GPIO_OUTPUT|GPIO_CNF_OUTPP |GPIO_MODE_2MHz |GPIO_PORTC|GPIO_PIN1 |GPIO_OUTPUT_CLEAR) + /* Radio Connector */ diff --git a/drivers/mmcsd/mmcsd_sdio.c b/drivers/mmcsd/mmcsd_sdio.c index 1434c440c6ee61ace134ae33a18a50b0b45404c8..27232983ef1b4f3b5c9ba12b3d40c02e2db1a2ee 100644 --- a/drivers/mmcsd/mmcsd_sdio.c +++ b/drivers/mmcsd/mmcsd_sdio.c @@ -148,7 +148,10 @@ struct mmcsd_state_s /* Misc Helpers *************************************************************/ static void mmcsd_takesem(FAR struct mmcsd_state_s *priv); -#define mmcsd_givesem(p) sem_post(&priv->sem); + +#ifndef CONFIG_SDIO_MUXBUS +# define mmcsd_givesem(p) sem_post(&priv->sem); +#endif /* Command/response helpers *************************************************/ @@ -261,18 +264,41 @@ static const struct block_operations g_bops = static void mmcsd_takesem(FAR struct mmcsd_state_s *priv) { - /* Take the semaphore (perhaps waiting) */ + /* Take the semaphore, giving exclusive access to the driver (perhaps + * waiting) + */ while (sem_wait(&priv->sem) != 0) { - /* The only case that an error should occr here is if the wait was + /* The only case that an error should occur here is if the wait was * awakened by a signal. */ ASSERT(errno == EINTR); } + + /* Lock the bus if mutually exclusive access to the SDIO bus is required + * on this platform. + */ + +#ifdef CONFIG_SDIO_MUXBUS + SDIO_LOCK(priv->dev, TRUE); +#endif } +#ifdef CONFIG_SDIO_MUXBUS +static void mmcsd_givesem(FAR struct mmcsd_state_s *priv) +{ + /* Release the SDIO bus lock, then the MMC/SD driver semaphore in the + * opposite order that they were taken to assure that no deadlock + * conditions will arise. + */ + + SDIO_LOCK(priv->dev, FALSE); + sem_post(&priv->sem); +} +#endif + /**************************************************************************** * Command/Response Helpers ****************************************************************************/ diff --git a/drivers/wireless/cc1101/cc1101.c b/drivers/wireless/cc1101/cc1101.c index e2fae962030c3f7be8a4b8f8b4e64b136187a9cb..a35575690320604be4c8df93e0c43d0d074cd2d3 100755 --- a/drivers/wireless/cc1101/cc1101.c +++ b/drivers/wireless/cc1101/cc1101.c @@ -55,6 +55,45 @@ * - Power up/down modes * - Sequencing between states or add protection for correct termination of * various different state (so that CC1101 does not block in case of improper use) + * + * \par RSSI and LQI value interpretation + * + * The LQI can be read from the LQI status register or it can be appended + * to the received packet in the RX FIFO. LQI is a metric of the current + * quality of the received signal. The LQI gives an estimate of how easily + * a received signal can be demodulated by accumulating the magnitude of + * the error between ideal constellations and the received signal over + * the 64 symbols immediately following the sync word. LQI is best used + * as a relative measurement of the link quality (a high value indicates + * a better link than what a low value does), since the value is dependent + * on the modulation format. + * + * To simplify: If the received modulation is FSK or GFSK, the receiver + * will measure the frequency of each "bit" and compare it with the + * expected frequency based on the channel frequency and the deviation + * and the measured frequency offset. If other modulations are used, the + * error of the modulated parameter (frequency for FSK/GFSK, phase for + * MSK, amplitude for ASK etc) will be measured against the expected + * ideal value + * + * RSSI (Received Signal Strength Indicator) is a signal strength + * indication. It does not care about the "quality" or "correctness" of + * the signal. LQI does not care about the actual signal strength, but + * the signal quality often is linked to signal strength. This is because + * a strong signal is likely to be less affected by noise and thus will + * be seen as "cleaner" or more "correct" by the receiver. + * + * There are four to five "extreme cases" that can be used to illustrate + * how RSSI and LQI work: + * 1. A weak signal in the presence of noise may give low RSSI and low LQI. + * 2. A weak signal in "total" absence of noise may give low RSSI and high LQI. + * 3. Strong noise (usually coming from an interferer) may give high RSSI and low LQI. + * 4. A strong signal without much noise may give high RSSI and high LQI. + * 5. A very strong signal that causes the receiver to saturate may give + * high RSSI and low LQI. + * + * Note that both RSSI and LQI are best used as relative measurements since + * the values are dependent on the modulation format. **/ #include <nuttx/config.h> diff --git a/include/nuttx/sdio.h b/include/nuttx/sdio.h index 232cdb3f3ec2bc76d7d9020cd6221b59153cb02b..d1642b62c6b2bf62baa3506df91611dd9b3553fa 100644 --- a/include/nuttx/sdio.h +++ b/include/nuttx/sdio.h @@ -310,6 +310,24 @@ #define SDIO_ACMD52 (SDIO_ACMDIDX52|MMCSD_R5_RESPONSE |MMCSD_NODATAXFR) #define SDIO_ACMD53 (SDIO_ACMDIDX53|MMCSD_R5_RESPONSE |MMCSD_NODATAXFR) +/**************************************************************************** + * Name: SDIO_LOCK + * + * Description: + * Lock/unlock the SDIO bus, preventing it from any other transaction + * while locked. + * + * Input Parameters: + * dev - An instance of the SDIO device interface + * state - TRUE/FALSE + * + * Returned Value: + * OK on success. + * + ****************************************************************************/ + +#define SDIO_LOCK(dev,state) ((dev)->lock(dev,state)) + /**************************************************************************** * Name: SDIO_RESET * @@ -756,6 +774,12 @@ struct sdio_dev_s * above. */ + /* Mutual exclusion */ + +#ifdef CONFIG_SDIO_MUXBUS + int (*lock)(FAR struct sdio_dev_s *dev, bool lock); +#endif + /* Initialization/setup */ void (*reset)(FAR struct sdio_dev_s *dev);