Move driver files and update it SConscript
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2088 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
74722177f3
commit
c6604c7563
|
@ -0,0 +1,24 @@
|
||||||
|
Import('RTT_ROOT')
|
||||||
|
Import('rtconfig')
|
||||||
|
from building import *
|
||||||
|
|
||||||
|
cwd = os.path.join(str(Dir('#')), 'drivers')
|
||||||
|
src = Glob('*.c')
|
||||||
|
CPPPATH = [cwd]
|
||||||
|
|
||||||
|
# remove no need file.
|
||||||
|
if GetDepend('RT_USING_LWIP') == False:
|
||||||
|
SrcRemove(src, 'stm32f2_eth.c')
|
||||||
|
if GetDepend('RT_USING_DFS') == False:
|
||||||
|
SrcRemove(src, 'sdio_sd.c')
|
||||||
|
|
||||||
|
#remove other no use files
|
||||||
|
#SrcRemove(src, 'FM25Lx.c')
|
||||||
|
#SrcRemove(src, '24LCxx.c')
|
||||||
|
|
||||||
|
#MDK platform retarget. Not yet tested
|
||||||
|
SrcRemove(src, 'stdio_Retarget.c')
|
||||||
|
|
||||||
|
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
|
||||||
|
|
||||||
|
Return('group')
|
|
@ -0,0 +1,286 @@
|
||||||
|
/*
|
||||||
|
* File : board.c
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2009 RT-Thread Develop Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-01-05 Bernard first implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rthw.h>
|
||||||
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
#include "board.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup STM32
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*@{*/
|
||||||
|
|
||||||
|
#if STM32_USE_SDIO
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DeInitializes the SDIO interface.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SD_LowLevel_DeInit(void)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
|
||||||
|
/*!< Disable SDIO Clock */
|
||||||
|
SDIO_ClockCmd(DISABLE);
|
||||||
|
|
||||||
|
/*!< Set Power State to OFF */
|
||||||
|
SDIO_SetPowerState(SDIO_PowerState_OFF);
|
||||||
|
|
||||||
|
/*!< DeInitializes the SDIO peripheral */
|
||||||
|
SDIO_DeInit();
|
||||||
|
|
||||||
|
/* Disable the SDIO APB2 Clock */
|
||||||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, DISABLE);
|
||||||
|
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_MCO);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_MCO);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_MCO);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_MCO);
|
||||||
|
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_MCO);
|
||||||
|
|
||||||
|
/* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
|
||||||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
|
||||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||||
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
/* Configure PD.02 CMD line */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
|
||||||
|
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
/* Configure PC.12 pin: CLK pin */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
|
||||||
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the SD Card and put it into StandBy State (Ready for
|
||||||
|
* data transfer).
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SD_LowLevel_Init(void)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
|
||||||
|
/* GPIOC and GPIOD Periph clock enable */
|
||||||
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | SD_DETECT_GPIO_CLK, ENABLE);
|
||||||
|
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
|
||||||
|
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);
|
||||||
|
|
||||||
|
/* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
|
||||||
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
|
||||||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||||
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||||
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
/* Configure PD.02 CMD line */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
|
||||||
|
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
/* Configure PC.12 pin: CLK pin */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
|
||||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||||
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
/*!< Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN;
|
||||||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
|
||||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||||
|
GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
/* Enable the SDIO APB2 Clock */
|
||||||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);
|
||||||
|
|
||||||
|
/* Enable the DMA2 Clock */
|
||||||
|
RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures the DMA2 Channel4 for SDIO Tx request.
|
||||||
|
* @param BufferSRC: pointer to the source buffer
|
||||||
|
* @param BufferSize: buffer size
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize)
|
||||||
|
{
|
||||||
|
DMA_InitTypeDef SDDMA_InitStructure;
|
||||||
|
|
||||||
|
DMA_ClearFlag(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_FEIF | SD_SDIO_DMA_FLAG_DMEIF | SD_SDIO_DMA_FLAG_TEIF | SD_SDIO_DMA_FLAG_HTIF | SD_SDIO_DMA_FLAG_TCIF);
|
||||||
|
|
||||||
|
/* DMA2 Stream3 or Stream6 disable */
|
||||||
|
DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);
|
||||||
|
|
||||||
|
/* DMA2 Stream3 or Stream6 Config */
|
||||||
|
DMA_DeInit(SD_SDIO_DMA_STREAM);
|
||||||
|
|
||||||
|
SDDMA_InitStructure.DMA_Channel = SD_SDIO_DMA_CHANNEL;
|
||||||
|
SDDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
|
||||||
|
SDDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)BufferSRC;
|
||||||
|
SDDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
|
||||||
|
SDDMA_InitStructure.DMA_BufferSize = 0;
|
||||||
|
SDDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
||||||
|
SDDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
||||||
|
SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
|
||||||
|
SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
|
||||||
|
SDDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
||||||
|
SDDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
||||||
|
SDDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
|
||||||
|
SDDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
|
||||||
|
SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
|
||||||
|
SDDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
|
||||||
|
DMA_Init(SD_SDIO_DMA_STREAM, &SDDMA_InitStructure);
|
||||||
|
|
||||||
|
DMA_FlowControllerConfig(SD_SDIO_DMA_STREAM, DMA_FlowCtrl_Peripheral);
|
||||||
|
|
||||||
|
/* DMA2 Stream3 or Stream6 enable */
|
||||||
|
DMA_Cmd(SD_SDIO_DMA_STREAM, ENABLE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures the DMA2 Channel4 for SDIO Rx request.
|
||||||
|
* @param BufferDST: pointer to the destination buffer
|
||||||
|
* @param BufferSize: buffer size
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize)
|
||||||
|
{
|
||||||
|
DMA_InitTypeDef SDDMA_InitStructure;
|
||||||
|
|
||||||
|
DMA_ClearFlag(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_FEIF | SD_SDIO_DMA_FLAG_DMEIF | SD_SDIO_DMA_FLAG_TEIF | SD_SDIO_DMA_FLAG_HTIF | SD_SDIO_DMA_FLAG_TCIF);
|
||||||
|
|
||||||
|
/* DMA2 Stream3 or Stream6 disable */
|
||||||
|
DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);
|
||||||
|
|
||||||
|
/* DMA2 Stream3 or Stream6 Config */
|
||||||
|
DMA_DeInit(SD_SDIO_DMA_STREAM);
|
||||||
|
|
||||||
|
SDDMA_InitStructure.DMA_Channel = SD_SDIO_DMA_CHANNEL;
|
||||||
|
SDDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
|
||||||
|
SDDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)BufferDST;
|
||||||
|
SDDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
|
||||||
|
SDDMA_InitStructure.DMA_BufferSize = 0;
|
||||||
|
SDDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
||||||
|
SDDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
||||||
|
SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
|
||||||
|
SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
|
||||||
|
SDDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
||||||
|
SDDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
||||||
|
SDDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
|
||||||
|
SDDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
|
||||||
|
SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
|
||||||
|
SDDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
|
||||||
|
DMA_Init(SD_SDIO_DMA_STREAM, &SDDMA_InitStructure);
|
||||||
|
|
||||||
|
DMA_FlowControllerConfig(SD_SDIO_DMA_STREAM, DMA_FlowCtrl_Peripheral);
|
||||||
|
|
||||||
|
/* DMA2 Stream3 or Stream6 enable */
|
||||||
|
DMA_Cmd(SD_SDIO_DMA_STREAM, ENABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the DMA End Of Transfer Status.
|
||||||
|
* @param None
|
||||||
|
* @retval DMA SDIO Stream Status.
|
||||||
|
*/
|
||||||
|
uint32_t SD_DMAEndOfTransferStatus(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)DMA_GetFlagStatus(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_TCIF);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : NVIC_Configuration
|
||||||
|
* Description : Configures Vector Table base location.
|
||||||
|
* Input : None
|
||||||
|
* Output : None
|
||||||
|
* Return : None
|
||||||
|
*******************************************************************************/
|
||||||
|
void NVIC_Configuration(void)
|
||||||
|
{
|
||||||
|
#ifdef VECT_TAB_RAM
|
||||||
|
/* Set the Vector Table base location at 0x20000000 */
|
||||||
|
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
|
||||||
|
#else /* VECT_TAB_FLASH */
|
||||||
|
/* Set the Vector Table base location at 0x08000000 */
|
||||||
|
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : SysTick_Configuration
|
||||||
|
* Description : Configures the SysTick for OS tick.
|
||||||
|
* Input : None
|
||||||
|
* Output : None
|
||||||
|
* Return : None
|
||||||
|
*******************************************************************************/
|
||||||
|
void SysTick_Configuration(void)
|
||||||
|
{
|
||||||
|
RCC_ClocksTypeDef rcc_clocks;
|
||||||
|
rt_uint32_t cnts;
|
||||||
|
|
||||||
|
RCC_GetClocksFreq(&rcc_clocks);
|
||||||
|
|
||||||
|
cnts = (rt_uint32_t)rcc_clocks.HCLK_Frequency / RT_TICK_PER_SECOND;
|
||||||
|
|
||||||
|
SysTick_Config(cnts);
|
||||||
|
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the timer interrupt service routine.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void SysTick_Handler(void)
|
||||||
|
{
|
||||||
|
/* enter interrupt */
|
||||||
|
rt_interrupt_enter();
|
||||||
|
|
||||||
|
rt_tick_increase();
|
||||||
|
|
||||||
|
/* leave interrupt */
|
||||||
|
rt_interrupt_leave();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function will initial STM32 board.
|
||||||
|
*/
|
||||||
|
void rt_hw_board_init()
|
||||||
|
{
|
||||||
|
/* NVIC Configuration */
|
||||||
|
NVIC_Configuration();
|
||||||
|
|
||||||
|
/* Configure the SysTick */
|
||||||
|
SysTick_Configuration();
|
||||||
|
|
||||||
|
rt_hw_usart_init();
|
||||||
|
#ifdef RT_USING_CONSOLE
|
||||||
|
rt_console_set_device(CONSOLE_DEVICE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@}*/
|
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
* File : board.h
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-09-22 Bernard add board.h to this bsp
|
||||||
|
*/
|
||||||
|
|
||||||
|
// <<< Use Configuration Wizard in Context Menu >>>
|
||||||
|
#ifndef __BOARD_H__
|
||||||
|
#define __BOARD_H__
|
||||||
|
|
||||||
|
#include <stm32f2xx.h>
|
||||||
|
|
||||||
|
/* board configuration */
|
||||||
|
// <o> SDCard Driver <1=>SDIO sdcard <0=>SPI MMC card
|
||||||
|
// <i>Default: 1
|
||||||
|
#define STM32_USE_SDIO 1
|
||||||
|
|
||||||
|
/* whether use board external SRAM memory */
|
||||||
|
// <e>Use external SRAM memory on the board
|
||||||
|
// <i>Enable External SRAM memory
|
||||||
|
#define STM32_EXT_SRAM 0
|
||||||
|
// <o>Begin Address of External SRAM
|
||||||
|
// <i>Default: 0x68000000
|
||||||
|
#define STM32_EXT_SRAM_BEGIN 0x68000000 /* the begining address of external SRAM */
|
||||||
|
// <o>End Address of External SRAM
|
||||||
|
// <i>Default: 0x68080000
|
||||||
|
#define STM32_EXT_SRAM_END 0x68080000 /* the end address of external SRAM */
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <o> Internal SRAM memory size[Kbytes] <8-128>
|
||||||
|
// <i>Default: 64
|
||||||
|
#define STM32_SRAM_SIZE 128
|
||||||
|
#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)
|
||||||
|
|
||||||
|
// <o> Console on USART: <0=> no console <1=>USART 1 <2=>USART 2 <3=> USART 3
|
||||||
|
// <i>Default: 1
|
||||||
|
#define STM32_CONSOLE_USART 1
|
||||||
|
|
||||||
|
// <o> Ethernet Interface: <0=> Microchip ENC28J60
|
||||||
|
#define STM32_ETH_IF 0
|
||||||
|
|
||||||
|
void rt_hw_board_led_on(int n);
|
||||||
|
void rt_hw_board_led_off(int n);
|
||||||
|
void rt_hw_board_init(void);
|
||||||
|
|
||||||
|
#if STM32_CONSOLE_USART == 0
|
||||||
|
#define CONSOLE_DEVICE "no"
|
||||||
|
#elif STM32_CONSOLE_USART == 1
|
||||||
|
#define CONSOLE_DEVICE "uart1"
|
||||||
|
#elif STM32_CONSOLE_USART == 2
|
||||||
|
#define CONSOLE_DEVICE "uart2"
|
||||||
|
#elif STM32_CONSOLE_USART == 3
|
||||||
|
#define CONSOLE_DEVICE "uart3"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if STM32_USE_SDIO
|
||||||
|
/**
|
||||||
|
* @brief SD FLASH SDIO Interface
|
||||||
|
*/
|
||||||
|
#define SD_DETECT_PIN GPIO_Pin_0 /* PB.0 */
|
||||||
|
#define SD_DETECT_GPIO_PORT GPIOB /* GPIOB */
|
||||||
|
#define SD_DETECT_GPIO_CLK RCC_AHB1Periph_GPIOB
|
||||||
|
|
||||||
|
#define SDIO_FIFO_ADDRESS ((uint32_t)0x40012C80)
|
||||||
|
/**
|
||||||
|
* @brief SDIO Intialization Frequency (400KHz max)
|
||||||
|
*/
|
||||||
|
#define SDIO_INIT_CLK_DIV ((uint8_t)0x76)
|
||||||
|
/**
|
||||||
|
* @brief SDIO Data Transfer Frequency (25MHz max)
|
||||||
|
*/
|
||||||
|
#define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x0)
|
||||||
|
|
||||||
|
#define SD_SDIO_DMA DMA2
|
||||||
|
#define SD_SDIO_DMA_CLK RCC_AHB1Periph_DMA2
|
||||||
|
|
||||||
|
#define SD_SDIO_DMA_STREAM3 3
|
||||||
|
//#define SD_SDIO_DMA_STREAM6 6
|
||||||
|
|
||||||
|
#ifdef SD_SDIO_DMA_STREAM3
|
||||||
|
#define SD_SDIO_DMA_STREAM DMA2_Stream3
|
||||||
|
#define SD_SDIO_DMA_CHANNEL DMA_Channel_4
|
||||||
|
#define SD_SDIO_DMA_FLAG_FEIF DMA_FLAG_FEIF3
|
||||||
|
#define SD_SDIO_DMA_FLAG_DMEIF DMA_FLAG_DMEIF3
|
||||||
|
#define SD_SDIO_DMA_FLAG_TEIF DMA_FLAG_TEIF3
|
||||||
|
#define SD_SDIO_DMA_FLAG_HTIF DMA_FLAG_HTIF3
|
||||||
|
#define SD_SDIO_DMA_FLAG_TCIF DMA_FLAG_TCIF3
|
||||||
|
#elif defined SD_SDIO_DMA_STREAM6
|
||||||
|
#define SD_SDIO_DMA_STREAM DMA2_Stream6
|
||||||
|
#define SD_SDIO_DMA_CHANNEL DMA_Channel_4
|
||||||
|
#define SD_SDIO_DMA_FLAG_FEIF DMA_FLAG_FEIF6
|
||||||
|
#define SD_SDIO_DMA_FLAG_DMEIF DMA_FLAG_DMEIF6
|
||||||
|
#define SD_SDIO_DMA_FLAG_TEIF DMA_FLAG_TEIF6
|
||||||
|
#define SD_SDIO_DMA_FLAG_HTIF DMA_FLAG_HTIF6
|
||||||
|
#define SD_SDIO_DMA_FLAG_TCIF DMA_FLAG_TCIF6
|
||||||
|
#endif /* SD_SDIO_DMA_STREAM3 */
|
||||||
|
|
||||||
|
void SD_LowLevel_DeInit(void);
|
||||||
|
void SD_LowLevel_Init(void);
|
||||||
|
void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize);
|
||||||
|
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
void rt_hw_usart_init(void);
|
||||||
|
|
||||||
|
/* SD Card init function */
|
||||||
|
void rt_hw_msd_init(void);
|
||||||
|
|
||||||
|
/* ETH interface init function */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <<< Use Configuration Wizard in Context Menu >>>
|
|
@ -0,0 +1,343 @@
|
||||||
|
/*
|
||||||
|
* File : rtc.c
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-01-05 Bernard the first version
|
||||||
|
* 2011-11-26 aozima implementation time.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <stm32f2xx.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
__IO uint32_t AsynchPrediv = 0, SynchPrediv = 0;
|
||||||
|
RTC_TimeTypeDef RTC_TimeStructure;
|
||||||
|
RTC_InitTypeDef RTC_InitStructure;
|
||||||
|
RTC_AlarmTypeDef RTC_AlarmStructure;
|
||||||
|
RTC_DateTypeDef RTC_DateStructure;
|
||||||
|
|
||||||
|
#define MINUTE 60
|
||||||
|
#define HOUR (60*MINUTE)
|
||||||
|
#define DAY (24*HOUR)
|
||||||
|
#define YEAR (365*DAY)
|
||||||
|
|
||||||
|
static int month[12] =
|
||||||
|
{
|
||||||
|
0,
|
||||||
|
DAY*(31),
|
||||||
|
DAY*(31+29),
|
||||||
|
DAY*(31+29+31),
|
||||||
|
DAY*(31+29+31+30),
|
||||||
|
DAY*(31+29+31+30+31),
|
||||||
|
DAY*(31+29+31+30+31+30),
|
||||||
|
DAY*(31+29+31+30+31+30+31),
|
||||||
|
DAY*(31+29+31+30+31+30+31+31),
|
||||||
|
DAY*(31+29+31+30+31+30+31+31+30),
|
||||||
|
DAY*(31+29+31+30+31+30+31+31+30+31),
|
||||||
|
DAY*(31+29+31+30+31+30+31+31+30+31+30)
|
||||||
|
};
|
||||||
|
static struct rt_device rtc;
|
||||||
|
|
||||||
|
static time_t rt_mktime(struct tm *tm)
|
||||||
|
{
|
||||||
|
long res;
|
||||||
|
int year;
|
||||||
|
year = tm->tm_year - 70;
|
||||||
|
|
||||||
|
res = YEAR * year + DAY * ((year + 1) / 4);
|
||||||
|
res += month[tm->tm_mon];
|
||||||
|
|
||||||
|
if (tm->tm_mon > 1 && ((year + 2) % 4))
|
||||||
|
res -= DAY;
|
||||||
|
res += DAY * (tm->tm_mday - 1);
|
||||||
|
res += HOUR * tm->tm_hour;
|
||||||
|
res += MINUTE * tm->tm_min;
|
||||||
|
res += tm->tm_sec;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static rt_err_t rt_rtc_open(rt_device_t dev, rt_uint16_t oflag)
|
||||||
|
{
|
||||||
|
if (dev->rx_indicate != RT_NULL)
|
||||||
|
{
|
||||||
|
/* Open Interrupt */
|
||||||
|
}
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_size_t rt_rtc_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t rt_rtc_control(rt_device_t dev, rt_uint8_t cmd, void *args)
|
||||||
|
{
|
||||||
|
time_t *time;
|
||||||
|
struct tm ti,*to;
|
||||||
|
RT_ASSERT(dev != RT_NULL);
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case RT_DEVICE_CTRL_RTC_GET_TIME:
|
||||||
|
time = (time_t *)args;
|
||||||
|
/* read device */
|
||||||
|
//RTC_GetTimeStamp(RTC_Format_BIN, &RTC_TimeStructure, &RTC_DateStructure);
|
||||||
|
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
|
||||||
|
RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);
|
||||||
|
ti.tm_sec = RTC_TimeStructure.RTC_Seconds;
|
||||||
|
ti.tm_min = RTC_TimeStructure.RTC_Minutes;
|
||||||
|
ti.tm_hour = RTC_TimeStructure.RTC_Hours;
|
||||||
|
//ti.tm_wday = (RTC_DateStructure.RTC_WeekDay==7)?0:RTC_DateStructure.RTC_WeekDay;
|
||||||
|
ti.tm_mon = RTC_DateStructure.RTC_Month -1;
|
||||||
|
ti.tm_mday = RTC_DateStructure.RTC_Date;
|
||||||
|
ti.tm_year = RTC_DateStructure.RTC_Year + 70;
|
||||||
|
*time = rt_mktime(&ti);
|
||||||
|
//*time = RTC_GetCounter();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RT_DEVICE_CTRL_RTC_SET_TIME:
|
||||||
|
{
|
||||||
|
time = (time_t *)args;
|
||||||
|
|
||||||
|
/* Enable the PWR clock */
|
||||||
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
|
||||||
|
|
||||||
|
/* Allow access to RTC */
|
||||||
|
PWR_BackupAccessCmd(ENABLE);
|
||||||
|
|
||||||
|
/* Wait until last write operation on RTC registers has finished */
|
||||||
|
//RTC_WaitForLastTask();
|
||||||
|
|
||||||
|
/* Change the current time */
|
||||||
|
//RTC_SetCounter(*time);
|
||||||
|
|
||||||
|
to = localtime(time);
|
||||||
|
RTC_TimeStructure.RTC_Seconds = to->tm_sec;
|
||||||
|
RTC_TimeStructure.RTC_Minutes = to->tm_min;
|
||||||
|
RTC_TimeStructure.RTC_Hours = to->tm_hour;
|
||||||
|
//RTC_DateStructure.RTC_WeekDay =(ti->tm_wday==0)?7:ti->tm_wday;
|
||||||
|
RTC_DateStructure.RTC_Month = to->tm_mon + 1;
|
||||||
|
RTC_DateStructure.RTC_Date = to->tm_mday;
|
||||||
|
RTC_DateStructure.RTC_Year = to->tm_year - 70;
|
||||||
|
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure);
|
||||||
|
RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure);
|
||||||
|
|
||||||
|
/* Wait until last write operation on RTC registers has finished */
|
||||||
|
//RTC_WaitForLastTask();
|
||||||
|
|
||||||
|
RTC_WriteBackupRegister(RTC_BKP_DR1, 0xA5A5);
|
||||||
|
//BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : RTC_Configuration
|
||||||
|
* Description : Configures the RTC.
|
||||||
|
* Input : None
|
||||||
|
* Output : None
|
||||||
|
* Return : 0 reday,-1 error.
|
||||||
|
*******************************************************************************/
|
||||||
|
int RTC_Config(void)
|
||||||
|
{
|
||||||
|
u32 count=0x200000;
|
||||||
|
/* Enable the PWR clock */
|
||||||
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
|
||||||
|
|
||||||
|
/* Allow access to RTC */
|
||||||
|
PWR_BackupAccessCmd(ENABLE);
|
||||||
|
|
||||||
|
RCC_LSEConfig(RCC_LSE_ON);
|
||||||
|
|
||||||
|
/* Wait till LSE is ready */
|
||||||
|
while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) );
|
||||||
|
if ( count == 0 )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Select the RTC Clock Source */
|
||||||
|
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
|
||||||
|
|
||||||
|
SynchPrediv = 0xFF;
|
||||||
|
AsynchPrediv = 0x7F;
|
||||||
|
|
||||||
|
/* Enable the RTC Clock */
|
||||||
|
RCC_RTCCLKCmd(ENABLE);
|
||||||
|
|
||||||
|
/* Wait for RTC APB registers synchronisation */
|
||||||
|
RTC_WaitForSynchro();
|
||||||
|
|
||||||
|
/* Enable The TimeStamp */
|
||||||
|
//RTC_TimeStampCmd(RTC_TimeStampEdge_Falling, ENABLE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RTC_Configuration(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(RTC_Config() < 0 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Set the Time */
|
||||||
|
RTC_TimeStructure.RTC_Hours = 0;
|
||||||
|
RTC_TimeStructure.RTC_Minutes = 0;
|
||||||
|
RTC_TimeStructure.RTC_Seconds = 0;
|
||||||
|
|
||||||
|
/* Set the Date */
|
||||||
|
RTC_DateStructure.RTC_Month = 1;
|
||||||
|
RTC_DateStructure.RTC_Date = 1;
|
||||||
|
RTC_DateStructure.RTC_Year = 0;
|
||||||
|
RTC_DateStructure.RTC_WeekDay = 4;
|
||||||
|
|
||||||
|
/* Calendar Configuration */
|
||||||
|
RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
|
||||||
|
RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
|
||||||
|
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
|
||||||
|
RTC_Init(&RTC_InitStructure);
|
||||||
|
|
||||||
|
/* Set Current Time and Date */
|
||||||
|
RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);
|
||||||
|
RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure);
|
||||||
|
if (RTC_Init(&RTC_InitStructure) == ERROR)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rt_hw_rtc_init(void)
|
||||||
|
{
|
||||||
|
rtc.type = RT_Device_Class_RTC;
|
||||||
|
|
||||||
|
if (RTC_ReadBackupRegister(RTC_BKP_DR1) != 0xA5A5)
|
||||||
|
{
|
||||||
|
rt_kprintf("rtc is not configured\n");
|
||||||
|
rt_kprintf("please configure with set_date and set_time\n");
|
||||||
|
if ( RTC_Configuration() != 0)
|
||||||
|
{
|
||||||
|
rt_kprintf("rtc configure fail...\r\n");
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Wait for RTC registers synchronization */
|
||||||
|
RTC_WaitForSynchro();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* register rtc device */
|
||||||
|
rtc.init = RT_NULL;
|
||||||
|
rtc.open = rt_rtc_open;
|
||||||
|
rtc.close = RT_NULL;
|
||||||
|
rtc.read = rt_rtc_read;
|
||||||
|
rtc.write = RT_NULL;
|
||||||
|
rtc.control = rt_rtc_control;
|
||||||
|
|
||||||
|
/* no private */
|
||||||
|
rtc.user_data = RT_NULL;
|
||||||
|
|
||||||
|
rt_device_register(&rtc, "rtc", RT_DEVICE_FLAG_RDWR);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000 /* for IAR 6.2 later Compiler */
|
||||||
|
#pragma module_name = "?time"
|
||||||
|
time_t (__time32)(time_t *t) /* Only supports 32-bit timestamp */
|
||||||
|
#else
|
||||||
|
time_t time(time_t* t)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
rt_device_t device;
|
||||||
|
time_t time=0;
|
||||||
|
|
||||||
|
device = rt_device_find("rtc");
|
||||||
|
if (device != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
|
||||||
|
if (t != RT_NULL) *t = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef RT_USING_FINSH
|
||||||
|
#include <finsh.h>
|
||||||
|
|
||||||
|
void set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
|
||||||
|
{
|
||||||
|
time_t now;
|
||||||
|
struct tm* ti;
|
||||||
|
rt_device_t device;
|
||||||
|
|
||||||
|
ti = RT_NULL;
|
||||||
|
/* get current time */
|
||||||
|
time(&now);
|
||||||
|
|
||||||
|
ti = localtime(&now);
|
||||||
|
if (ti != RT_NULL)
|
||||||
|
{
|
||||||
|
ti->tm_year = year - 1900;
|
||||||
|
ti->tm_mon = month - 1; /* ti->tm_mon = month; */
|
||||||
|
ti->tm_mday = day;
|
||||||
|
}
|
||||||
|
|
||||||
|
now = mktime(ti);
|
||||||
|
|
||||||
|
device = rt_device_find("rtc");
|
||||||
|
if (device != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_rtc_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FINSH_FUNCTION_EXPORT(set_date, set date. e.g: set_date(2010,2,28))
|
||||||
|
|
||||||
|
void set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
|
||||||
|
{
|
||||||
|
time_t now;
|
||||||
|
struct tm* ti;
|
||||||
|
rt_device_t device;
|
||||||
|
|
||||||
|
ti = RT_NULL;
|
||||||
|
/* get current time */
|
||||||
|
time(&now);
|
||||||
|
|
||||||
|
ti = localtime(&now);
|
||||||
|
if (ti != RT_NULL)
|
||||||
|
{
|
||||||
|
ti->tm_hour = hour;
|
||||||
|
ti->tm_min = minute;
|
||||||
|
ti->tm_sec = second;
|
||||||
|
}
|
||||||
|
|
||||||
|
now = mktime(ti);
|
||||||
|
device = rt_device_find("rtc");
|
||||||
|
if (device != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_rtc_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FINSH_FUNCTION_EXPORT(set_time, set time. e.g: set_time(23,59,59))
|
||||||
|
|
||||||
|
void list_date()
|
||||||
|
{
|
||||||
|
time_t now;
|
||||||
|
|
||||||
|
time(&now);
|
||||||
|
rt_kprintf("%s\n", ctime(&now));
|
||||||
|
}
|
||||||
|
FINSH_FUNCTION_EXPORT(list_date, show date and time.)
|
||||||
|
#endif
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* File : rtc.h
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-01-05 Bernard the first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __RTC_H__
|
||||||
|
#define __RTC_H__
|
||||||
|
|
||||||
|
void rt_hw_rtc_init(void);
|
||||||
|
|
||||||
|
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,397 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file stm32_eval_sdio_sd.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V4.6.1
|
||||||
|
* @date 18-April-2011
|
||||||
|
* @brief This file contains all the functions prototypes for the SD Card
|
||||||
|
* stm32_eval_sdio_sd driver firmware library.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __STM32_EVAL_SDIO_SD_H
|
||||||
|
#define __STM32_EVAL_SDIO_SD_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "board.h"
|
||||||
|
|
||||||
|
/** @addtogroup Utilities
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @addtogroup STM32_EVAL
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @addtogroup Common
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @addtogroup STM32_EVAL_SDIO_SD
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @brief SDIO specific error defines
|
||||||
|
*/
|
||||||
|
SD_CMD_CRC_FAIL = (1), /*!< Command response received (but CRC check failed) */
|
||||||
|
SD_DATA_CRC_FAIL = (2), /*!< Data bock sent/received (CRC check Failed) */
|
||||||
|
SD_CMD_RSP_TIMEOUT = (3), /*!< Command response timeout */
|
||||||
|
SD_DATA_TIMEOUT = (4), /*!< Data time out */
|
||||||
|
SD_TX_UNDERRUN = (5), /*!< Transmit FIFO under-run */
|
||||||
|
SD_RX_OVERRUN = (6), /*!< Receive FIFO over-run */
|
||||||
|
SD_START_BIT_ERR = (7), /*!< Start bit not detected on all data signals in widE bus mode */
|
||||||
|
SD_CMD_OUT_OF_RANGE = (8), /*!< CMD's argument was out of range.*/
|
||||||
|
SD_ADDR_MISALIGNED = (9), /*!< Misaligned address */
|
||||||
|
SD_BLOCK_LEN_ERR = (10), /*!< Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length */
|
||||||
|
SD_ERASE_SEQ_ERR = (11), /*!< An error in the sequence of erase command occurs.*/
|
||||||
|
SD_BAD_ERASE_PARAM = (12), /*!< An Invalid selection for erase groups */
|
||||||
|
SD_WRITE_PROT_VIOLATION = (13), /*!< Attempt to program a write protect block */
|
||||||
|
SD_LOCK_UNLOCK_FAILED = (14), /*!< Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card */
|
||||||
|
SD_COM_CRC_FAILED = (15), /*!< CRC check of the previous command failed */
|
||||||
|
SD_ILLEGAL_CMD = (16), /*!< Command is not legal for the card state */
|
||||||
|
SD_CARD_ECC_FAILED = (17), /*!< Card internal ECC was applied but failed to correct the data */
|
||||||
|
SD_CC_ERROR = (18), /*!< Internal card controller error */
|
||||||
|
SD_GENERAL_UNKNOWN_ERROR = (19), /*!< General or Unknown error */
|
||||||
|
SD_STREAM_READ_UNDERRUN = (20), /*!< The card could not sustain data transfer in stream read operation. */
|
||||||
|
SD_STREAM_WRITE_OVERRUN = (21), /*!< The card could not sustain data programming in stream mode */
|
||||||
|
SD_CID_CSD_OVERWRITE = (22), /*!< CID/CSD overwrite error */
|
||||||
|
SD_WP_ERASE_SKIP = (23), /*!< only partial address space was erased */
|
||||||
|
SD_CARD_ECC_DISABLED = (24), /*!< Command has been executed without using internal ECC */
|
||||||
|
SD_ERASE_RESET = (25), /*!< Erase sequence was cleared before executing because an out of erase sequence command was received */
|
||||||
|
SD_AKE_SEQ_ERROR = (26), /*!< Error in sequence of authentication. */
|
||||||
|
SD_INVALID_VOLTRANGE = (27),
|
||||||
|
SD_ADDR_OUT_OF_RANGE = (28),
|
||||||
|
SD_SWITCH_ERROR = (29),
|
||||||
|
SD_SDIO_DISABLED = (30),
|
||||||
|
SD_SDIO_FUNCTION_BUSY = (31),
|
||||||
|
SD_SDIO_FUNCTION_FAILED = (32),
|
||||||
|
SD_SDIO_UNKNOWN_FUNCTION = (33),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Standard error defines
|
||||||
|
*/
|
||||||
|
SD_INTERNAL_ERROR,
|
||||||
|
SD_NOT_CONFIGURED,
|
||||||
|
SD_REQUEST_PENDING,
|
||||||
|
SD_REQUEST_NOT_APPLICABLE,
|
||||||
|
SD_INVALID_PARAMETER,
|
||||||
|
SD_UNSUPPORTED_FEATURE,
|
||||||
|
SD_UNSUPPORTED_HW,
|
||||||
|
SD_ERROR,
|
||||||
|
SD_OK = 0
|
||||||
|
} SD_Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SDIO Transfer state
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SD_TRANSFER_OK = 0,
|
||||||
|
SD_TRANSFER_BUSY = 1,
|
||||||
|
SD_TRANSFER_ERROR
|
||||||
|
} SDTransferState;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SD Card States
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SD_CARD_READY = ((uint32_t)0x00000001),
|
||||||
|
SD_CARD_IDENTIFICATION = ((uint32_t)0x00000002),
|
||||||
|
SD_CARD_STANDBY = ((uint32_t)0x00000003),
|
||||||
|
SD_CARD_TRANSFER = ((uint32_t)0x00000004),
|
||||||
|
SD_CARD_SENDING = ((uint32_t)0x00000005),
|
||||||
|
SD_CARD_RECEIVING = ((uint32_t)0x00000006),
|
||||||
|
SD_CARD_PROGRAMMING = ((uint32_t)0x00000007),
|
||||||
|
SD_CARD_DISCONNECTED = ((uint32_t)0x00000008),
|
||||||
|
SD_CARD_ERROR = ((uint32_t)0x000000FF)
|
||||||
|
}SDCardState;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Card Specific Data: CSD Register
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint8_t CSDStruct; /*!< CSD structure */
|
||||||
|
__IO uint8_t SysSpecVersion; /*!< System specification version */
|
||||||
|
__IO uint8_t Reserved1; /*!< Reserved */
|
||||||
|
__IO uint8_t TAAC; /*!< Data read access-time 1 */
|
||||||
|
__IO uint8_t NSAC; /*!< Data read access-time 2 in CLK cycles */
|
||||||
|
__IO uint8_t MaxBusClkFrec; /*!< Max. bus clock frequency */
|
||||||
|
__IO uint16_t CardComdClasses; /*!< Card command classes */
|
||||||
|
__IO uint8_t RdBlockLen; /*!< Max. read data block length */
|
||||||
|
__IO uint8_t PartBlockRead; /*!< Partial blocks for read allowed */
|
||||||
|
__IO uint8_t WrBlockMisalign; /*!< Write block misalignment */
|
||||||
|
__IO uint8_t RdBlockMisalign; /*!< Read block misalignment */
|
||||||
|
__IO uint8_t DSRImpl; /*!< DSR implemented */
|
||||||
|
__IO uint8_t Reserved2; /*!< Reserved */
|
||||||
|
__IO uint32_t DeviceSize; /*!< Device Size */
|
||||||
|
__IO uint8_t MaxRdCurrentVDDMin; /*!< Max. read current @ VDD min */
|
||||||
|
__IO uint8_t MaxRdCurrentVDDMax; /*!< Max. read current @ VDD max */
|
||||||
|
__IO uint8_t MaxWrCurrentVDDMin; /*!< Max. write current @ VDD min */
|
||||||
|
__IO uint8_t MaxWrCurrentVDDMax; /*!< Max. write current @ VDD max */
|
||||||
|
__IO uint8_t DeviceSizeMul; /*!< Device size multiplier */
|
||||||
|
__IO uint8_t EraseGrSize; /*!< Erase group size */
|
||||||
|
__IO uint8_t EraseGrMul; /*!< Erase group size multiplier */
|
||||||
|
__IO uint8_t WrProtectGrSize; /*!< Write protect group size */
|
||||||
|
__IO uint8_t WrProtectGrEnable; /*!< Write protect group enable */
|
||||||
|
__IO uint8_t ManDeflECC; /*!< Manufacturer default ECC */
|
||||||
|
__IO uint8_t WrSpeedFact; /*!< Write speed factor */
|
||||||
|
__IO uint8_t MaxWrBlockLen; /*!< Max. write data block length */
|
||||||
|
__IO uint8_t WriteBlockPaPartial; /*!< Partial blocks for write allowed */
|
||||||
|
__IO uint8_t Reserved3; /*!< Reserded */
|
||||||
|
__IO uint8_t ContentProtectAppli; /*!< Content protection application */
|
||||||
|
__IO uint8_t FileFormatGrouop; /*!< File format group */
|
||||||
|
__IO uint8_t CopyFlag; /*!< Copy flag (OTP) */
|
||||||
|
__IO uint8_t PermWrProtect; /*!< Permanent write protection */
|
||||||
|
__IO uint8_t TempWrProtect; /*!< Temporary write protection */
|
||||||
|
__IO uint8_t FileFormat; /*!< File Format */
|
||||||
|
__IO uint8_t ECC; /*!< ECC code */
|
||||||
|
__IO uint8_t CSD_CRC; /*!< CSD CRC */
|
||||||
|
__IO uint8_t Reserved4; /*!< always 1*/
|
||||||
|
} SD_CSD;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Card Identification Data: CID Register
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint8_t ManufacturerID; /*!< ManufacturerID */
|
||||||
|
__IO uint16_t OEM_AppliID; /*!< OEM/Application ID */
|
||||||
|
__IO uint32_t ProdName1; /*!< Product Name part1 */
|
||||||
|
__IO uint8_t ProdName2; /*!< Product Name part2*/
|
||||||
|
__IO uint8_t ProdRev; /*!< Product Revision */
|
||||||
|
__IO uint32_t ProdSN; /*!< Product Serial Number */
|
||||||
|
__IO uint8_t Reserved1; /*!< Reserved1 */
|
||||||
|
__IO uint16_t ManufactDate; /*!< Manufacturing Date */
|
||||||
|
__IO uint8_t CID_CRC; /*!< CID CRC */
|
||||||
|
__IO uint8_t Reserved2; /*!< always 1 */
|
||||||
|
} SD_CID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SD Card Status
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint8_t DAT_BUS_WIDTH;
|
||||||
|
__IO uint8_t SECURED_MODE;
|
||||||
|
__IO uint16_t SD_CARD_TYPE;
|
||||||
|
__IO uint32_t SIZE_OF_PROTECTED_AREA;
|
||||||
|
__IO uint8_t SPEED_CLASS;
|
||||||
|
__IO uint8_t PERFORMANCE_MOVE;
|
||||||
|
__IO uint8_t AU_SIZE;
|
||||||
|
__IO uint16_t ERASE_SIZE;
|
||||||
|
__IO uint8_t ERASE_TIMEOUT;
|
||||||
|
__IO uint8_t ERASE_OFFSET;
|
||||||
|
} SD_CardStatus;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SD Card information
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SD_CSD SD_csd;
|
||||||
|
SD_CID SD_cid;
|
||||||
|
uint32_t CardCapacity; /*!< Card Capacity */
|
||||||
|
uint32_t CardBlockSize; /*!< Card Block Size */
|
||||||
|
uint16_t RCA;
|
||||||
|
uint8_t CardType;
|
||||||
|
} SD_CardInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Constants
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SDIO Commands Index
|
||||||
|
*/
|
||||||
|
#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
|
||||||
|
#define SD_CMD_SEND_OP_COND ((uint8_t)1)
|
||||||
|
#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
|
||||||
|
#define SD_CMD_SET_REL_ADDR ((uint8_t)3) /*!< SDIO_SEND_REL_ADDR for SD Card */
|
||||||
|
#define SD_CMD_SET_DSR ((uint8_t)4)
|
||||||
|
#define SD_CMD_SDIO_SEN_OP_COND ((uint8_t)5)
|
||||||
|
#define SD_CMD_HS_SWITCH ((uint8_t)6)
|
||||||
|
#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7)
|
||||||
|
#define SD_CMD_HS_SEND_EXT_CSD ((uint8_t)8)
|
||||||
|
#define SD_CMD_SEND_CSD ((uint8_t)9)
|
||||||
|
#define SD_CMD_SEND_CID ((uint8_t)10)
|
||||||
|
#define SD_CMD_READ_DAT_UNTIL_STOP ((uint8_t)11) /*!< SD Card doesn't support it */
|
||||||
|
#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12)
|
||||||
|
#define SD_CMD_SEND_STATUS ((uint8_t)13)
|
||||||
|
#define SD_CMD_HS_BUSTEST_READ ((uint8_t)14)
|
||||||
|
#define SD_CMD_GO_INACTIVE_STATE ((uint8_t)15)
|
||||||
|
#define SD_CMD_SET_BLOCKLEN ((uint8_t)16)
|
||||||
|
#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17)
|
||||||
|
#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18)
|
||||||
|
#define SD_CMD_HS_BUSTEST_WRITE ((uint8_t)19)
|
||||||
|
#define SD_CMD_WRITE_DAT_UNTIL_STOP ((uint8_t)20) /*!< SD Card doesn't support it */
|
||||||
|
#define SD_CMD_SET_BLOCK_COUNT ((uint8_t)23) /*!< SD Card doesn't support it */
|
||||||
|
#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24)
|
||||||
|
#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25)
|
||||||
|
#define SD_CMD_PROG_CID ((uint8_t)26) /*!< reserved for manufacturers */
|
||||||
|
#define SD_CMD_PROG_CSD ((uint8_t)27)
|
||||||
|
#define SD_CMD_SET_WRITE_PROT ((uint8_t)28)
|
||||||
|
#define SD_CMD_CLR_WRITE_PROT ((uint8_t)29)
|
||||||
|
#define SD_CMD_SEND_WRITE_PROT ((uint8_t)30)
|
||||||
|
#define SD_CMD_SD_ERASE_GRP_START ((uint8_t)32) /*!< To set the address of the first write
|
||||||
|
block to be erased. (For SD card only) */
|
||||||
|
#define SD_CMD_SD_ERASE_GRP_END ((uint8_t)33) /*!< To set the address of the last write block of the
|
||||||
|
continuous range to be erased. (For SD card only) */
|
||||||
|
#define SD_CMD_ERASE_GRP_START ((uint8_t)35) /*!< To set the address of the first write block to be erased.
|
||||||
|
(For MMC card only spec 3.31) */
|
||||||
|
|
||||||
|
#define SD_CMD_ERASE_GRP_END ((uint8_t)36) /*!< To set the address of the last write block of the
|
||||||
|
continuous range to be erased. (For MMC card only spec 3.31) */
|
||||||
|
|
||||||
|
#define SD_CMD_ERASE ((uint8_t)38)
|
||||||
|
#define SD_CMD_FAST_IO ((uint8_t)39) /*!< SD Card doesn't support it */
|
||||||
|
#define SD_CMD_GO_IRQ_STATE ((uint8_t)40) /*!< SD Card doesn't support it */
|
||||||
|
#define SD_CMD_LOCK_UNLOCK ((uint8_t)42)
|
||||||
|
#define SD_CMD_APP_CMD ((uint8_t)55)
|
||||||
|
#define SD_CMD_GEN_CMD ((uint8_t)56)
|
||||||
|
#define SD_CMD_NO_CMD ((uint8_t)64)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Following commands are SD Card Specific commands.
|
||||||
|
* SDIO_APP_CMD should be sent before sending these commands.
|
||||||
|
*/
|
||||||
|
#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_STAUS ((uint8_t)13) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_OP_COND ((uint8_t)41) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52) /*!< For SD I/O Card only */
|
||||||
|
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53) /*!< For SD I/O Card only */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Following commands are SD Card Specific security commands.
|
||||||
|
* SDIO_APP_CMD should be sent before sending these commands.
|
||||||
|
*/
|
||||||
|
#define SD_CMD_SD_APP_GET_MKB ((uint8_t)43) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_GET_MID ((uint8_t)44) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SET_CER_RN1 ((uint8_t)45) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_GET_CER_RN2 ((uint8_t)46) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SET_CER_RES2 ((uint8_t)47) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_GET_CER_RES1 ((uint8_t)48) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SECURE_READ_MULTIPLE_BLOCK ((uint8_t)18) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK ((uint8_t)25) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SECURE_ERASE ((uint8_t)38) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_CHANGE_SECURE_AREA ((uint8_t)49) /*!< For SD Card only */
|
||||||
|
#define SD_CMD_SD_APP_SECURE_WRITE_MKB ((uint8_t)48) /*!< For SD Card only */
|
||||||
|
|
||||||
|
/* Uncomment the following line to select the SDIO Data transfer mode */
|
||||||
|
#define SD_DMA_MODE ((uint32_t)0x00000000)
|
||||||
|
/*#define SD_POLLING_MODE ((uint32_t)0x00000002)*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SD detection on its memory slot
|
||||||
|
*/
|
||||||
|
#define SD_PRESENT ((uint8_t)0x01)
|
||||||
|
#define SD_NOT_PRESENT ((uint8_t)0x00)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Supported SD Memory Cards
|
||||||
|
*/
|
||||||
|
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
|
||||||
|
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
|
||||||
|
#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
|
||||||
|
#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003)
|
||||||
|
#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004)
|
||||||
|
#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005)
|
||||||
|
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
|
||||||
|
#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
void SD_DeInit(void);
|
||||||
|
SD_Error SD_Init(void);
|
||||||
|
SDTransferState SD_GetStatus(void);
|
||||||
|
SDCardState SD_GetState(void);
|
||||||
|
uint8_t SD_Detect(void);
|
||||||
|
SD_Error SD_PowerON(void);
|
||||||
|
SD_Error SD_PowerOFF(void);
|
||||||
|
SD_Error SD_InitializeCards(void);
|
||||||
|
SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo);
|
||||||
|
SD_Error SD_GetCardStatus(SD_CardStatus *cardstatus);
|
||||||
|
SD_Error SD_EnableWideBusOperation(uint32_t WideMode);
|
||||||
|
SD_Error SD_SelectDeselect(uint32_t addr);
|
||||||
|
SD_Error SD_ReadBlock(uint32_t ReadAddr, uint8_t *readbuff, uint16_t BlockSize);
|
||||||
|
SD_Error SD_ReadMultiBlocks(uint32_t ReadAddr, uint8_t *readbuff, uint16_t BlockSize, uint32_t NumberOfBlocks);
|
||||||
|
SD_Error SD_WriteBlock(uint32_t WriteAddr, uint8_t *writebuff, uint16_t BlockSize);
|
||||||
|
SD_Error SD_WriteMultiBlocks(uint32_t WriteAddr, uint8_t *writebuff, uint16_t BlockSize, uint32_t NumberOfBlocks);
|
||||||
|
SDTransferState SD_GetTransferState(void);
|
||||||
|
SD_Error SD_StopTransfer(void);
|
||||||
|
SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);
|
||||||
|
SD_Error SD_SendStatus(uint32_t *pcardstatus);
|
||||||
|
SD_Error SD_SendSDStatus(uint32_t *psdstatus);
|
||||||
|
SD_Error SD_ProcessIRQSrc(void);
|
||||||
|
SD_Error SD_WaitReadOperation(void);
|
||||||
|
SD_Error SD_WaitWriteOperation(void);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __STM32_EVAL_SDIO_SD_H */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -0,0 +1,418 @@
|
||||||
|
/*
|
||||||
|
* File : serial.c
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-02-05 Bernard first version
|
||||||
|
* 2009-10-25 Bernard fix rt_serial_read bug when there is no data
|
||||||
|
* in the buffer.
|
||||||
|
* 2010-03-29 Bernard cleanup code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "serial.h"
|
||||||
|
#include <stm32f2xx_dma.h>
|
||||||
|
#include <stm32f2xx_usart.h>
|
||||||
|
|
||||||
|
static void rt_serial_enable_dma(DMA_Stream_TypeDef* dma_channel,
|
||||||
|
rt_uint32_t address, rt_uint32_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup STM32
|
||||||
|
*/
|
||||||
|
/*@{*/
|
||||||
|
|
||||||
|
/* RT-Thread Device Interface */
|
||||||
|
static rt_err_t rt_serial_init (rt_device_t dev)
|
||||||
|
{
|
||||||
|
struct stm32_serial_device* uart = (struct stm32_serial_device*) dev->user_data;
|
||||||
|
|
||||||
|
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
|
||||||
|
{
|
||||||
|
if (dev->flag & RT_DEVICE_FLAG_INT_RX)
|
||||||
|
{
|
||||||
|
rt_memset(uart->int_rx->rx_buffer, 0,
|
||||||
|
sizeof(uart->int_rx->rx_buffer));
|
||||||
|
uart->int_rx->read_index = 0;
|
||||||
|
uart->int_rx->save_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->flag & RT_DEVICE_FLAG_DMA_TX)
|
||||||
|
{
|
||||||
|
RT_ASSERT(uart->dma_tx->dma_channel != RT_NULL);
|
||||||
|
uart->dma_tx->list_head = uart->dma_tx->list_tail = RT_NULL;
|
||||||
|
|
||||||
|
/* init data node memory pool */
|
||||||
|
rt_mp_init(&(uart->dma_tx->data_node_mp), "dn",
|
||||||
|
uart->dma_tx->data_node_mem_pool,
|
||||||
|
sizeof(uart->dma_tx->data_node_mem_pool),
|
||||||
|
sizeof(struct stm32_serial_data_node));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable USART */
|
||||||
|
USART_Cmd(uart->uart_device, ENABLE);
|
||||||
|
|
||||||
|
dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag)
|
||||||
|
{
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t rt_serial_close(rt_device_t dev)
|
||||||
|
{
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
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_err_t err_code;
|
||||||
|
struct stm32_serial_device* uart;
|
||||||
|
|
||||||
|
ptr = buffer;
|
||||||
|
err_code = RT_EOK;
|
||||||
|
uart = (struct stm32_serial_device*)dev->user_data;
|
||||||
|
|
||||||
|
if (dev->flag & RT_DEVICE_FLAG_INT_RX)
|
||||||
|
{
|
||||||
|
/* interrupt mode Rx */
|
||||||
|
while (size)
|
||||||
|
{
|
||||||
|
rt_base_t level;
|
||||||
|
|
||||||
|
/* disable interrupt */
|
||||||
|
level = rt_hw_interrupt_disable();
|
||||||
|
|
||||||
|
if (uart->int_rx->read_index != uart->int_rx->save_index)
|
||||||
|
{
|
||||||
|
/* read a character */
|
||||||
|
*ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index];
|
||||||
|
size--;
|
||||||
|
|
||||||
|
/* move to next position */
|
||||||
|
uart->int_rx->read_index ++;
|
||||||
|
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
|
||||||
|
uart->int_rx->read_index = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* set error code */
|
||||||
|
err_code = -RT_EEMPTY;
|
||||||
|
|
||||||
|
/* enable interrupt */
|
||||||
|
rt_hw_interrupt_enable(level);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enable interrupt */
|
||||||
|
rt_hw_interrupt_enable(level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* polling mode */
|
||||||
|
while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size)
|
||||||
|
{
|
||||||
|
while (uart->uart_device->SR & USART_FLAG_RXNE)
|
||||||
|
{
|
||||||
|
*ptr = uart->uart_device->DR & 0xff;
|
||||||
|
ptr ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set error code */
|
||||||
|
rt_set_errno(err_code);
|
||||||
|
return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rt_serial_enable_dma(DMA_Stream_TypeDef* dma_channel,
|
||||||
|
rt_uint32_t address, rt_uint32_t size)
|
||||||
|
{
|
||||||
|
RT_ASSERT(dma_channel != RT_NULL);
|
||||||
|
|
||||||
|
/* disable DMA */
|
||||||
|
DMA_Cmd(dma_channel, DISABLE);
|
||||||
|
|
||||||
|
/* set buffer address */
|
||||||
|
dma_channel->M0AR = address;
|
||||||
|
/* set size */
|
||||||
|
dma_channel->NDTR = size;
|
||||||
|
|
||||||
|
/* enable DMA */
|
||||||
|
DMA_Cmd(dma_channel, ENABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
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_err_t err_code;
|
||||||
|
struct stm32_serial_device* uart;
|
||||||
|
|
||||||
|
err_code = RT_EOK;
|
||||||
|
ptr = (rt_uint8_t*)buffer;
|
||||||
|
uart = (struct stm32_serial_device*)dev->user_data;
|
||||||
|
|
||||||
|
if (dev->flag & RT_DEVICE_FLAG_INT_TX)
|
||||||
|
{
|
||||||
|
/* interrupt mode Tx, does not support */
|
||||||
|
RT_ASSERT(0);
|
||||||
|
}
|
||||||
|
else if (dev->flag & RT_DEVICE_FLAG_DMA_TX)
|
||||||
|
{
|
||||||
|
/* DMA mode Tx */
|
||||||
|
|
||||||
|
/* allocate a data node */
|
||||||
|
struct stm32_serial_data_node* data_node = (struct stm32_serial_data_node*)
|
||||||
|
rt_mp_alloc (&(uart->dma_tx->data_node_mp), RT_WAITING_FOREVER);
|
||||||
|
if (data_node == RT_NULL)
|
||||||
|
{
|
||||||
|
/* set error code */
|
||||||
|
err_code = -RT_ENOMEM;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt_uint32_t level;
|
||||||
|
|
||||||
|
/* fill data node */
|
||||||
|
data_node->data_ptr = ptr;
|
||||||
|
data_node->data_size = size;
|
||||||
|
|
||||||
|
/* insert to data link */
|
||||||
|
data_node->next = RT_NULL;
|
||||||
|
|
||||||
|
/* disable interrupt */
|
||||||
|
level = rt_hw_interrupt_disable();
|
||||||
|
|
||||||
|
data_node->prev = uart->dma_tx->list_tail;
|
||||||
|
if (uart->dma_tx->list_tail != RT_NULL)
|
||||||
|
uart->dma_tx->list_tail->next = data_node;
|
||||||
|
uart->dma_tx->list_tail = data_node;
|
||||||
|
|
||||||
|
if (uart->dma_tx->list_head == RT_NULL)
|
||||||
|
{
|
||||||
|
/* start DMA to transmit data */
|
||||||
|
uart->dma_tx->list_head = data_node;
|
||||||
|
|
||||||
|
/* Enable DMA Channel */
|
||||||
|
rt_serial_enable_dma(uart->dma_tx->dma_channel,
|
||||||
|
(rt_uint32_t)uart->dma_tx->list_head->data_ptr,
|
||||||
|
uart->dma_tx->list_head->data_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enable interrupt */
|
||||||
|
rt_hw_interrupt_enable(level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* polling mode */
|
||||||
|
if (dev->flag & RT_DEVICE_FLAG_STREAM)
|
||||||
|
{
|
||||||
|
/* stream mode */
|
||||||
|
while (size)
|
||||||
|
{
|
||||||
|
if (*ptr == '\n')
|
||||||
|
{
|
||||||
|
while (!(uart->uart_device->SR & USART_FLAG_TXE));
|
||||||
|
uart->uart_device->DR = '\r';
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!(uart->uart_device->SR & USART_FLAG_TXE));
|
||||||
|
uart->uart_device->DR = (*ptr & 0x1FF);
|
||||||
|
|
||||||
|
++ptr; --size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* write data directly */
|
||||||
|
while (size)
|
||||||
|
{
|
||||||
|
while (!(uart->uart_device->SR & USART_FLAG_TXE));
|
||||||
|
uart->uart_device->DR = (*ptr & 0x1FF);
|
||||||
|
|
||||||
|
++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)
|
||||||
|
{
|
||||||
|
struct stm32_serial_device* uart;
|
||||||
|
|
||||||
|
RT_ASSERT(dev != RT_NULL);
|
||||||
|
|
||||||
|
uart = (struct stm32_serial_device*)dev->user_data;
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case RT_DEVICE_CTRL_SUSPEND:
|
||||||
|
/* suspend device */
|
||||||
|
dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
|
||||||
|
USART_Cmd(uart->uart_device, DISABLE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RT_DEVICE_CTRL_RESUME:
|
||||||
|
/* resume device */
|
||||||
|
dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
|
||||||
|
USART_Cmd(uart->uart_device, ENABLE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* serial register for STM32
|
||||||
|
* support STM32F103VB and STM32F103ZE
|
||||||
|
*/
|
||||||
|
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct stm32_serial_device *serial)
|
||||||
|
{
|
||||||
|
RT_ASSERT(device != RT_NULL);
|
||||||
|
|
||||||
|
if ((flag & RT_DEVICE_FLAG_DMA_RX) ||
|
||||||
|
(flag & RT_DEVICE_FLAG_INT_TX))
|
||||||
|
{
|
||||||
|
RT_ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
device->type = RT_Device_Class_Char;
|
||||||
|
device->rx_indicate = RT_NULL;
|
||||||
|
device->tx_complete = RT_NULL;
|
||||||
|
device->init = rt_serial_init;
|
||||||
|
device->open = rt_serial_open;
|
||||||
|
device->close = rt_serial_close;
|
||||||
|
device->read = rt_serial_read;
|
||||||
|
device->write = rt_serial_write;
|
||||||
|
device->control = rt_serial_control;
|
||||||
|
device->user_data = serial;
|
||||||
|
|
||||||
|
/* register a character device */
|
||||||
|
return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ISR for serial interrupt */
|
||||||
|
void rt_hw_serial_isr(rt_device_t device)
|
||||||
|
{
|
||||||
|
struct stm32_serial_device* uart = (struct stm32_serial_device*) device->user_data;
|
||||||
|
|
||||||
|
if(USART_GetITStatus(uart->uart_device, USART_IT_RXNE) != RESET)
|
||||||
|
{
|
||||||
|
/* interrupt mode receive */
|
||||||
|
RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX);
|
||||||
|
|
||||||
|
/* save on rx buffer */
|
||||||
|
while (uart->uart_device->SR & USART_FLAG_RXNE)
|
||||||
|
{
|
||||||
|
rt_base_t level;
|
||||||
|
|
||||||
|
/* disable interrupt */
|
||||||
|
level = rt_hw_interrupt_disable();
|
||||||
|
|
||||||
|
/* save character */
|
||||||
|
uart->int_rx->rx_buffer[uart->int_rx->save_index] = uart->uart_device->DR & 0xff;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clear interrupt */
|
||||||
|
USART_ClearITPendingBit(uart->uart_device, USART_IT_RXNE);
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (USART_GetITStatus(uart->uart_device, USART_IT_TC) != RESET)
|
||||||
|
{
|
||||||
|
/* clear interrupt */
|
||||||
|
USART_ClearITPendingBit(uart->uart_device, USART_IT_TC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ISR for DMA mode Tx
|
||||||
|
*/
|
||||||
|
void rt_hw_serial_dma_tx_isr(rt_device_t device)
|
||||||
|
{
|
||||||
|
rt_uint32_t level;
|
||||||
|
struct stm32_serial_data_node* data_node;
|
||||||
|
struct stm32_serial_device* uart = (struct stm32_serial_device*) device->user_data;
|
||||||
|
|
||||||
|
/* DMA mode receive */
|
||||||
|
RT_ASSERT(device->flag & RT_DEVICE_FLAG_DMA_TX);
|
||||||
|
|
||||||
|
/* get the first data node */
|
||||||
|
data_node = uart->dma_tx->list_head;
|
||||||
|
RT_ASSERT(data_node != RT_NULL);
|
||||||
|
|
||||||
|
/* invoke call to notify tx complete */
|
||||||
|
if (device->tx_complete != RT_NULL)
|
||||||
|
device->tx_complete(device, data_node->data_ptr);
|
||||||
|
|
||||||
|
/* disable interrupt */
|
||||||
|
level = rt_hw_interrupt_disable();
|
||||||
|
|
||||||
|
/* remove list head */
|
||||||
|
uart->dma_tx->list_head = data_node->next;
|
||||||
|
if (uart->dma_tx->list_head == RT_NULL) /* data link empty */
|
||||||
|
uart->dma_tx->list_tail = RT_NULL;
|
||||||
|
|
||||||
|
/* enable interrupt */
|
||||||
|
rt_hw_interrupt_enable(level);
|
||||||
|
|
||||||
|
/* release data node memory */
|
||||||
|
rt_mp_free(data_node);
|
||||||
|
|
||||||
|
if (uart->dma_tx->list_head != RT_NULL)
|
||||||
|
{
|
||||||
|
/* transmit next data node */
|
||||||
|
rt_serial_enable_dma(uart->dma_tx->dma_channel,
|
||||||
|
(rt_uint32_t)uart->dma_tx->list_head->data_ptr,
|
||||||
|
uart->dma_tx->list_head->data_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* no data to be transmitted, disable DMA */
|
||||||
|
DMA_Cmd(uart->dma_tx->dma_channel, DISABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@}*/
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* File : serial.h
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2009 - 2010, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-01-05 Bernard first version
|
||||||
|
* 2010-03-29 Bernard remove interrupt tx and DMA rx mode.
|
||||||
|
*/
|
||||||
|
#ifndef __RT_HW_SERIAL_H__
|
||||||
|
#define __RT_HW_SERIAL_H__
|
||||||
|
|
||||||
|
#include <rthw.h>
|
||||||
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
/* STM32F10x library definitions */
|
||||||
|
#include <stm32f2xx.h>
|
||||||
|
|
||||||
|
#define UART_RX_BUFFER_SIZE 64
|
||||||
|
#define UART_TX_DMA_NODE_SIZE 4
|
||||||
|
|
||||||
|
/* data node for Tx Mode */
|
||||||
|
struct stm32_serial_data_node
|
||||||
|
{
|
||||||
|
rt_uint8_t *data_ptr;
|
||||||
|
rt_size_t data_size;
|
||||||
|
struct stm32_serial_data_node *next, *prev;
|
||||||
|
};
|
||||||
|
struct stm32_serial_dma_tx
|
||||||
|
{
|
||||||
|
/* DMA Channel */
|
||||||
|
DMA_Stream_TypeDef* dma_channel;
|
||||||
|
|
||||||
|
/* data list head and tail */
|
||||||
|
struct stm32_serial_data_node *list_head, *list_tail;
|
||||||
|
|
||||||
|
/* data node memory pool */
|
||||||
|
struct rt_mempool data_node_mp;
|
||||||
|
rt_uint8_t data_node_mem_pool[UART_TX_DMA_NODE_SIZE *
|
||||||
|
(sizeof(struct stm32_serial_data_node) + sizeof(void*))];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stm32_serial_int_rx
|
||||||
|
{
|
||||||
|
rt_uint8_t rx_buffer[UART_RX_BUFFER_SIZE];
|
||||||
|
rt_uint32_t read_index, save_index;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stm32_serial_device
|
||||||
|
{
|
||||||
|
USART_TypeDef* uart_device;
|
||||||
|
|
||||||
|
/* rx structure */
|
||||||
|
struct stm32_serial_int_rx* int_rx;
|
||||||
|
|
||||||
|
/* tx structure */
|
||||||
|
struct stm32_serial_dma_tx* dma_tx;
|
||||||
|
};
|
||||||
|
|
||||||
|
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct stm32_serial_device *serial);
|
||||||
|
|
||||||
|
void rt_hw_serial_isr(rt_device_t device);
|
||||||
|
void rt_hw_serial_dma_tx_isr(rt_device_t device);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,581 @@
|
||||||
|
/*
|
||||||
|
* STM32 Eth Driver for RT-Thread
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-10-05 Bernard eth interface driver for STM32F107 CL
|
||||||
|
*/
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <netif/ethernetif.h>
|
||||||
|
#include "lwipopts.h"
|
||||||
|
#include "stm32f2x7_eth.h"
|
||||||
|
#include "stm32f2x7_eth_conf.h"
|
||||||
|
|
||||||
|
#define STM32_ETH_DEBUG 0
|
||||||
|
#define CHECKSUM_BY_HARDWARE
|
||||||
|
|
||||||
|
/* MII and RMII mode selection, for STM322xG-EVAL Board(MB786) RevB ***********/
|
||||||
|
//#define MII_MODE
|
||||||
|
|
||||||
|
#define RMII_MODE // In this case the System clock frequency is configured
|
||||||
|
// to 100 MHz, for more details refer to system_stm32f2xx.c
|
||||||
|
|
||||||
|
#define DP83848_PHY_ADDRESS 0x01 /* Relative to STM322xG-EVAL Board */
|
||||||
|
|
||||||
|
#define netifGUARD_BLOCK_TIME 250
|
||||||
|
|
||||||
|
/* Ethernet Rx & Tx DMA Descriptors */
|
||||||
|
extern ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB];
|
||||||
|
|
||||||
|
/* Ethernet Receive buffers */
|
||||||
|
extern uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE];
|
||||||
|
|
||||||
|
/* Ethernet Transmit buffers */
|
||||||
|
extern uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE];
|
||||||
|
|
||||||
|
/* Global pointers to track current transmit and receive descriptors */
|
||||||
|
extern ETH_DMADESCTypeDef *DMATxDescToSet;
|
||||||
|
extern ETH_DMADESCTypeDef *DMARxDescToGet;
|
||||||
|
|
||||||
|
/* Global pointer for last received frame infos */
|
||||||
|
extern ETH_DMA_Rx_Frame_infos *DMA_RX_FRAME_infos;
|
||||||
|
|
||||||
|
#define MAX_ADDR_LEN 6
|
||||||
|
struct rt_stm32_eth
|
||||||
|
{
|
||||||
|
/* inherit from ethernet device */
|
||||||
|
struct eth_device parent;
|
||||||
|
|
||||||
|
/* interface address info. */
|
||||||
|
rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
|
||||||
|
};
|
||||||
|
static struct rt_stm32_eth stm32_eth_device;
|
||||||
|
static struct rt_semaphore tx_wait;
|
||||||
|
static rt_bool_t tx_is_waiting = RT_FALSE;
|
||||||
|
|
||||||
|
static void ETH_MACDMA_Config(void);
|
||||||
|
|
||||||
|
static struct rt_semaphore tx_wait;
|
||||||
|
|
||||||
|
/* interrupt service routine */
|
||||||
|
void ETH_IRQHandler(void)
|
||||||
|
{
|
||||||
|
rt_uint32_t status;
|
||||||
|
|
||||||
|
status = ETH->DMASR;
|
||||||
|
|
||||||
|
/* Frame received */
|
||||||
|
if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
|
||||||
|
{
|
||||||
|
rt_err_t result;
|
||||||
|
//rt_kprintf("Frame comming\n");
|
||||||
|
/* Clear the interrupt flags. */
|
||||||
|
/* Clear the Eth DMA Rx IT pending bits */
|
||||||
|
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
|
||||||
|
|
||||||
|
/* a frame has been received */
|
||||||
|
result = eth_device_ready(&(stm32_eth_device.parent));
|
||||||
|
if( result != RT_EOK ) rt_kprintf("RX err =%d\n", result );
|
||||||
|
//RT_ASSERT(result == RT_EOK);
|
||||||
|
}
|
||||||
|
if (ETH_GetDMAITStatus(ETH_DMA_IT_T) == SET) /* packet transmission */
|
||||||
|
{
|
||||||
|
ETH_DMAClearITPendingBit(ETH_DMA_IT_T);
|
||||||
|
}
|
||||||
|
|
||||||
|
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
|
||||||
|
//
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* RT-Thread Device Interface */
|
||||||
|
/* initialize the interface */
|
||||||
|
static rt_err_t rt_stm32_eth_init(rt_device_t dev)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* MAC address configuration */
|
||||||
|
ETH_MACAddressConfig(ETH_MAC_Address0, (u8*)&stm32_eth_device.dev_addr[0]);
|
||||||
|
|
||||||
|
/* Initialize Tx Descriptors list: Chain Mode */
|
||||||
|
ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
|
||||||
|
/* Initialize Rx Descriptors list: Chain Mode */
|
||||||
|
ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
|
||||||
|
|
||||||
|
/* Enable Ethernet Rx interrrupt */
|
||||||
|
{
|
||||||
|
for(i=0; i<ETH_RXBUFNB; i++)
|
||||||
|
{
|
||||||
|
ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CHECKSUM_BY_HARDWARE
|
||||||
|
/* Enable the checksum insertion for the Tx frames */
|
||||||
|
{
|
||||||
|
for(i=0; i<ETH_TXBUFNB; i++)
|
||||||
|
{
|
||||||
|
ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{
|
||||||
|
uint16_t tmp, i=10000;
|
||||||
|
|
||||||
|
tmp = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CR);
|
||||||
|
ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_CDCTRL1, BIST_CONT_MODE );
|
||||||
|
ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_CR, tmp | BIST_START );//BIST_START
|
||||||
|
|
||||||
|
while(i--);
|
||||||
|
|
||||||
|
//tmp = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CR);
|
||||||
|
|
||||||
|
if( ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CR) & BIST_STATUS == BIST_STATUS )
|
||||||
|
{
|
||||||
|
rt_kprintf("BIST pass\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint16_t ctrl;
|
||||||
|
|
||||||
|
ctrl = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CDCTRL1);
|
||||||
|
rt_kprintf("BIST faild count =%d\n", BIST_ERROR_COUNT(ctrl) );
|
||||||
|
}
|
||||||
|
tmp &= ~BIST_START; //Stop BIST
|
||||||
|
ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_CR, tmp);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable MAC and DMA transmission and reception */
|
||||||
|
ETH_Start();
|
||||||
|
|
||||||
|
//rt_kprintf("DMASR = 0x%X\n", ETH->DMASR );
|
||||||
|
// rt_kprintf("ETH Init\n");
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t rt_stm32_eth_open(rt_device_t dev, rt_uint16_t oflag)
|
||||||
|
{
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t rt_stm32_eth_close(rt_device_t dev)
|
||||||
|
{
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_size_t rt_stm32_eth_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
|
||||||
|
{
|
||||||
|
rt_set_errno(-RT_ENOSYS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_size_t rt_stm32_eth_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
|
||||||
|
{
|
||||||
|
rt_set_errno(-RT_ENOSYS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t rt_stm32_eth_control(rt_device_t dev, rt_uint8_t cmd, void *args)
|
||||||
|
{
|
||||||
|
switch(cmd)
|
||||||
|
{
|
||||||
|
case NIOCTL_GADDR:
|
||||||
|
/* get mac address */
|
||||||
|
if(args) rt_memcpy(args, stm32_eth_device.dev_addr, 6);
|
||||||
|
else return -RT_ERROR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void show_frame(struct pbuf *q)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int j = 0;
|
||||||
|
char *ptr = q->payload;
|
||||||
|
|
||||||
|
for( i = 0; i < q->len; i++ )
|
||||||
|
rt_kprintf("0x%02X ", *(ptr++));
|
||||||
|
rt_kprintf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ethernet device interface */
|
||||||
|
/* transmit packet. */
|
||||||
|
rt_err_t rt_stm32_eth_tx( rt_device_t dev, struct pbuf* p)
|
||||||
|
{
|
||||||
|
rt_err_t ret;
|
||||||
|
struct pbuf *q;
|
||||||
|
uint32_t l = 0;
|
||||||
|
u8 *buffer ;
|
||||||
|
|
||||||
|
if (( ret = rt_sem_take(&tx_wait, netifGUARD_BLOCK_TIME) ) == RT_EOK)
|
||||||
|
{
|
||||||
|
buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
|
||||||
|
for(q = p; q != NULL; q = q->next)
|
||||||
|
{
|
||||||
|
//show_frame(q);
|
||||||
|
rt_memcpy((u8_t*)&buffer[l], q->payload, q->len);
|
||||||
|
l = l + q->len;
|
||||||
|
}
|
||||||
|
if( ETH_Prepare_Transmit_Descriptors(l) == ETH_ERROR )
|
||||||
|
rt_kprintf("Tx Error\n");
|
||||||
|
//rt_sem_release(xTxSemaphore);
|
||||||
|
rt_sem_release(&tx_wait);
|
||||||
|
//rt_kprintf("Tx packet, len = %d\n", l);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt_kprintf("Tx Timeout\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return SUCCESS */
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reception packet. */
|
||||||
|
struct pbuf *rt_stm32_eth_rx(rt_device_t dev)
|
||||||
|
{
|
||||||
|
struct pbuf *p, *q;
|
||||||
|
u16_t len;
|
||||||
|
uint32_t l=0,i =0;
|
||||||
|
FrameTypeDef frame;
|
||||||
|
static framecnt = 1;
|
||||||
|
u8 *buffer;
|
||||||
|
__IO ETH_DMADESCTypeDef *DMARxNextDesc;
|
||||||
|
|
||||||
|
p = RT_NULL;
|
||||||
|
|
||||||
|
// rt_kprintf("ETH rx\n");
|
||||||
|
/* Get received frame */
|
||||||
|
frame = ETH_Get_Received_Frame_interrupt();
|
||||||
|
|
||||||
|
if( frame.length > 0 )
|
||||||
|
{
|
||||||
|
/* check that frame has no error */
|
||||||
|
if ((frame.descriptor->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET)
|
||||||
|
{
|
||||||
|
//rt_kprintf("Get a frame %d buf = 0x%X, len= %d\n", framecnt++, frame.buffer, frame.length);
|
||||||
|
/* Obtain the size of the packet and put it into the "len" variable. */
|
||||||
|
len = frame.length;
|
||||||
|
buffer = (u8 *)frame.buffer;
|
||||||
|
|
||||||
|
/* We allocate a pbuf chain of pbufs from the pool. */
|
||||||
|
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
|
||||||
|
//p = pbuf_alloc(PBUF_LINK, len, PBUF_RAM);
|
||||||
|
|
||||||
|
/* Copy received frame from ethernet driver buffer to stack buffer */
|
||||||
|
if (p != NULL)
|
||||||
|
{
|
||||||
|
for (q = p; q != NULL; q = q->next)
|
||||||
|
{
|
||||||
|
rt_memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len);
|
||||||
|
l = l + q->len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Release descriptors to DMA */
|
||||||
|
/* Check if received frame with multiple DMA buffer segments */
|
||||||
|
if (DMA_RX_FRAME_infos->Seg_Count > 1)
|
||||||
|
{
|
||||||
|
DMARxNextDesc = DMA_RX_FRAME_infos->FS_Rx_Desc;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DMARxNextDesc = frame.descriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set Own bit in Rx descriptors: gives the buffers back to DMA */
|
||||||
|
for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
|
||||||
|
{
|
||||||
|
DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
|
||||||
|
DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear Segment_Count */
|
||||||
|
DMA_RX_FRAME_infos->Seg_Count =0;
|
||||||
|
|
||||||
|
|
||||||
|
/* When Rx Buffer unavailable flag is set: clear it and resume reception */
|
||||||
|
if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)
|
||||||
|
{
|
||||||
|
/* Clear RBUS ETHERNET DMA flag */
|
||||||
|
ETH->DMASR = ETH_DMASR_RBUS;
|
||||||
|
|
||||||
|
/* Resume DMA reception */
|
||||||
|
ETH->DMARPDR = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NVIC_Configuration(void)
|
||||||
|
{
|
||||||
|
NVIC_InitTypeDef NVIC_InitStructure;
|
||||||
|
|
||||||
|
/* 2 bit for pre-emption priority, 2 bits for subpriority */
|
||||||
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
|
||||||
|
/* Enable the Ethernet global Interrupt */
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||||
|
NVIC_Init(&NVIC_InitStructure);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GPIO Configuration for ETH
|
||||||
|
*/
|
||||||
|
static void GPIO_Configuration(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
|
||||||
|
/* Enable GPIOs clocks */
|
||||||
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
|
||||||
|
RCC_AHB1Periph_GPIOC
|
||||||
|
, ENABLE);
|
||||||
|
|
||||||
|
/* Enable SYSCFG clock */
|
||||||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
||||||
|
|
||||||
|
/* Configure MCO (PA8) */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
|
||||||
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||||||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||||
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||||
|
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||||
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO );
|
||||||
|
|
||||||
|
#ifdef MII_MODE
|
||||||
|
/* Output PLL clock divided by 2 (25MHz) on MCO pin (PA8) to clock the PHY */
|
||||||
|
RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);
|
||||||
|
|
||||||
|
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
|
||||||
|
#elif defined RMII_MODE
|
||||||
|
/* Output PLL clock divided by 2 (50MHz) on MCO pin (PA8) to clock the PHY */
|
||||||
|
//RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_2);
|
||||||
|
|
||||||
|
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Ethernet pins configuration ************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
ETH_MDIO -------------------------> PA2
|
||||||
|
ETH_MDC --------------------------> PC1
|
||||||
|
ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1
|
||||||
|
ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7
|
||||||
|
ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4
|
||||||
|
ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5
|
||||||
|
ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PB11
|
||||||
|
ETH_MII_TXD0/ETH_RMII_TXD0 -------> PB12
|
||||||
|
ETH_MII_TXD1/ETH_RMII_TXD1 -------> PB13
|
||||||
|
|
||||||
|
**** Just for MII Mode ****
|
||||||
|
ETH_MII_CRS ----------------------> PA0
|
||||||
|
ETH_MII_COL ----------------------> PA3
|
||||||
|
ETH_MII_TX_CLK -------------------> PC3
|
||||||
|
ETH_MII_RX_ER --------------------> PB10
|
||||||
|
ETH_MII_RXD2 ---------------------> PB0
|
||||||
|
ETH_MII_RXD3 ---------------------> PB1
|
||||||
|
ETH_MII_TXD2 ---------------------> PC2
|
||||||
|
ETH_MII_TXD3 ---------------------> PB8
|
||||||
|
*/
|
||||||
|
/* Configure PC1, PC4 and PC5 */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 |GPIO_Pin_4 | GPIO_Pin_5;
|
||||||
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
|
||||||
|
|
||||||
|
/* Configure PB11, PB12 and PB13 */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
|
||||||
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||||||
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
|
||||||
|
|
||||||
|
/* Configure PA1, PA2 and PA7 */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2 | GPIO_Pin_7;
|
||||||
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
|
||||||
|
|
||||||
|
#ifdef MII_MODE
|
||||||
|
/* Configure PC2, PC3 */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 |GPIO_Pin_3;
|
||||||
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_ETH);
|
||||||
|
|
||||||
|
/* Configure PB0, PB1, PB10 and PB8 */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1, GPIO_Pin_10 | GPIO_Pin_8;
|
||||||
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||||||
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_ETH);
|
||||||
|
|
||||||
|
/* Configure PA0, PA3 */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3;
|
||||||
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_ETH);
|
||||||
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures the Ethernet Interface
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void ETH_MACDMA_Config(void)
|
||||||
|
{
|
||||||
|
ETH_InitTypeDef ETH_InitStructure;
|
||||||
|
|
||||||
|
/* Enable ETHERNET clock */
|
||||||
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
|
||||||
|
RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
|
||||||
|
|
||||||
|
/* Reset ETHERNET on AHB Bus */
|
||||||
|
ETH_DeInit();
|
||||||
|
|
||||||
|
/* Software reset */
|
||||||
|
ETH_SoftwareReset();
|
||||||
|
|
||||||
|
/* Wait for software reset */
|
||||||
|
while (ETH_GetSoftwareResetStatus() == SET);
|
||||||
|
|
||||||
|
/* ETHERNET Configuration --------------------------------------------------*/
|
||||||
|
/* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
|
||||||
|
ETH_StructInit(Ð_InitStructure);
|
||||||
|
|
||||||
|
/* Fill ETH_InitStructure parametrs */
|
||||||
|
/*------------------------ MAC -----------------------------------*/
|
||||||
|
ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
|
||||||
|
//ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
|
||||||
|
// ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
|
||||||
|
// ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
|
||||||
|
|
||||||
|
ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
|
||||||
|
ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
|
||||||
|
ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
|
||||||
|
ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
|
||||||
|
ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
|
||||||
|
ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
|
||||||
|
ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
|
||||||
|
ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
|
||||||
|
#ifdef CHECKSUM_BY_HARDWARE
|
||||||
|
ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*------------------------ DMA -----------------------------------*/
|
||||||
|
|
||||||
|
/* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
|
||||||
|
the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
|
||||||
|
if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
|
||||||
|
ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
|
||||||
|
ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
|
||||||
|
ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
|
||||||
|
|
||||||
|
ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
|
||||||
|
ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
|
||||||
|
ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
|
||||||
|
ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
|
||||||
|
ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
|
||||||
|
ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
|
||||||
|
ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
|
||||||
|
ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
|
||||||
|
|
||||||
|
/* Configure Ethernet */
|
||||||
|
if( ETH_Init(Ð_InitStructure, DP83848_PHY_ADDRESS) == ETH_ERROR )
|
||||||
|
rt_kprintf("ETH init error, may be no link\n");
|
||||||
|
|
||||||
|
/* Enable the Ethernet Rx Interrupt */
|
||||||
|
ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R , ENABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DevID_SNo0 (*((rt_uint32_t *)0x1FFF7A10));
|
||||||
|
#define DevID_SNo1 (*((rt_uint32_t *)0x1FFF7A10+32));
|
||||||
|
#define DevID_SNo2 (*((rt_uint32_t *)0x1FFF7A10+64));
|
||||||
|
void rt_hw_stm32_eth_init(void)
|
||||||
|
{
|
||||||
|
GPIO_Configuration();
|
||||||
|
NVIC_Configuration();
|
||||||
|
ETH_MACDMA_Config();
|
||||||
|
|
||||||
|
stm32_eth_device.dev_addr[0] = 0x00;
|
||||||
|
stm32_eth_device.dev_addr[1] = 0x60;
|
||||||
|
stm32_eth_device.dev_addr[2] = 0x6e;
|
||||||
|
{
|
||||||
|
uint32_t cpu_id[3] = {0};
|
||||||
|
cpu_id[2] = DevID_SNo2; cpu_id[1] = DevID_SNo1; cpu_id[0] = DevID_SNo0;
|
||||||
|
|
||||||
|
// generate MAC addr from 96bit unique ID (only for test)
|
||||||
|
stm32_eth_device.dev_addr[3] = (uint8_t)((cpu_id[0]>>16)&0xFF);
|
||||||
|
stm32_eth_device.dev_addr[4] = (uint8_t)((cpu_id[0]>>8)&0xFF);
|
||||||
|
stm32_eth_device.dev_addr[5] = (uint8_t)(cpu_id[0]&0xFF);
|
||||||
|
|
||||||
|
// stm32_eth_device.dev_addr[3] = *(rt_uint8_t*)(0x1FFF7A10+7);
|
||||||
|
// stm32_eth_device.dev_addr[4] = *(rt_uint8_t*)(0x1FFF7A10+8);
|
||||||
|
// stm32_eth_device.dev_addr[5] = *(rt_uint8_t*)(0x1FFF7A10+9);
|
||||||
|
}
|
||||||
|
|
||||||
|
stm32_eth_device.parent.parent.init = rt_stm32_eth_init;
|
||||||
|
stm32_eth_device.parent.parent.open = rt_stm32_eth_open;
|
||||||
|
stm32_eth_device.parent.parent.close = rt_stm32_eth_close;
|
||||||
|
stm32_eth_device.parent.parent.read = rt_stm32_eth_read;
|
||||||
|
stm32_eth_device.parent.parent.write = rt_stm32_eth_write;
|
||||||
|
stm32_eth_device.parent.parent.control = rt_stm32_eth_control;
|
||||||
|
stm32_eth_device.parent.parent.user_data = RT_NULL;
|
||||||
|
|
||||||
|
stm32_eth_device.parent.eth_rx = rt_stm32_eth_rx;
|
||||||
|
stm32_eth_device.parent.eth_tx = rt_stm32_eth_tx;
|
||||||
|
|
||||||
|
/* init tx semaphore */
|
||||||
|
rt_sem_init(&tx_wait, "tx_wait", 1, RT_IPC_FLAG_FIFO);
|
||||||
|
|
||||||
|
/* register eth device */
|
||||||
|
eth_device_init(&(stm32_eth_device.parent), "e0");
|
||||||
|
}
|
||||||
|
static char led = 0;
|
||||||
|
|
||||||
|
void dp83483()
|
||||||
|
{
|
||||||
|
uint16_t bsr,sts, bcr, phycr;
|
||||||
|
|
||||||
|
bsr = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_BSR);
|
||||||
|
sts = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR);
|
||||||
|
bcr = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_BCR);
|
||||||
|
phycr = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CR);
|
||||||
|
|
||||||
|
rt_kprintf("BCR = 0x%X\tBSR = 0x%X\tPHY_STS = 0x%X\tPHY_CR = 0x%X\n", bcr,bsr,sts, phycr);
|
||||||
|
|
||||||
|
rt_kprintf("PHY_FCSCR = 0x%X\n", ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_FCSCR ) );
|
||||||
|
rt_kprintf("PHY_MISR = 0x%X\n", ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MISR ) );
|
||||||
|
|
||||||
|
rt_kprintf("DMASR = 0x%X\n", ETH->DMASR );
|
||||||
|
|
||||||
|
//ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_LEDCR, (uint16_t)(0x38 | led));
|
||||||
|
led = (led==7)?0:7;
|
||||||
|
|
||||||
|
}
|
||||||
|
#ifdef RT_USING_FINSH
|
||||||
|
#include <finsh.h>
|
||||||
|
FINSH_FUNCTION_EXPORT(dp83483, Show PHY register.);
|
||||||
|
#endif
|
|
@ -0,0 +1,88 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file USART/USART_Printf/stm32f2xx_conf.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 18-April-2011
|
||||||
|
* @brief Library configuration file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __STM32F2xx_CONF_H
|
||||||
|
#define __STM32F2xx_CONF_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
/* Uncomment the line below to enable peripheral header file inclusion */
|
||||||
|
#include "stm32f2xx_adc.h"
|
||||||
|
#include "stm32f2xx_can.h"
|
||||||
|
#include "stm32f2xx_crc.h"
|
||||||
|
#include "stm32f2xx_cryp.h"
|
||||||
|
#include "stm32f2xx_dac.h"
|
||||||
|
#include "stm32f2xx_dbgmcu.h"
|
||||||
|
#include "stm32f2xx_dcmi.h"
|
||||||
|
#include "stm32f2xx_dma.h"
|
||||||
|
#include "stm32f2xx_exti.h"
|
||||||
|
#include "stm32f2xx_flash.h"
|
||||||
|
#include "stm32f2xx_fsmc.h"
|
||||||
|
#include "stm32f2xx_hash.h"
|
||||||
|
#include "stm32f2xx_gpio.h"
|
||||||
|
#include "stm32f2xx_i2c.h"
|
||||||
|
#include "stm32f2xx_iwdg.h"
|
||||||
|
#include "stm32f2xx_pwr.h"
|
||||||
|
#include "stm32f2xx_rcc.h"
|
||||||
|
#include "stm32f2xx_rng.h"
|
||||||
|
#include "stm32f2xx_rtc.h"
|
||||||
|
#include "stm32f2xx_sdio.h"
|
||||||
|
#include "stm32f2xx_spi.h"
|
||||||
|
#include "stm32f2xx_syscfg.h"
|
||||||
|
#include "stm32f2xx_tim.h"
|
||||||
|
#include "stm32f2xx_usart.h"
|
||||||
|
#include "stm32f2xx_wwdg.h"
|
||||||
|
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* If an external clock source is used, then the value of the following define
|
||||||
|
should be set to the value of the external clock source, else, if no external
|
||||||
|
clock is used, keep this define commented */
|
||||||
|
/*#define I2S_EXTERNAL_CLOCK_VAL 12288000 */ /* Value of the external clock in Hz */
|
||||||
|
|
||||||
|
|
||||||
|
/* Uncomment the line below to expanse the "assert_param" macro in the
|
||||||
|
Standard Peripheral Library drivers code */
|
||||||
|
/* #define USE_FULL_ASSERT 1 */
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
#ifdef USE_FULL_ASSERT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The assert_param macro is used for function's parameters check.
|
||||||
|
* @param expr: If expr is false, it calls assert_failed function
|
||||||
|
* which reports the name of the source file and the source
|
||||||
|
* line number of the call that failed.
|
||||||
|
* If expr is true, it returns no value.
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
void assert_failed(uint8_t* file, uint32_t line);
|
||||||
|
#else
|
||||||
|
#define assert_param(expr) ((void)0)
|
||||||
|
#endif /* USE_FULL_ASSERT */
|
||||||
|
|
||||||
|
#endif /* __STM32F2xx_CONF_H */
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -0,0 +1,156 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file Project/STM32F2xx_StdPeriph_Template/stm32f2xx_it.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 18-April-2011
|
||||||
|
* @brief Main Interrupt Service Routines.
|
||||||
|
* This file provides template for all exceptions handler and
|
||||||
|
* peripherals interrupt service routine.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "stm32f2xx.h"
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include "board.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup Template_Project
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* Cortex-M3 Processor Exceptions Handlers */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles NMI exception.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void NMI_Handler(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles Memory Manage exception.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void MemManage_Handler(void)
|
||||||
|
{
|
||||||
|
/* Go to infinite loop when Memory Manage exception occurs */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles Bus Fault exception.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void BusFault_Handler(void)
|
||||||
|
{
|
||||||
|
/* Go to infinite loop when Bus Fault exception occurs */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles Usage Fault exception.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void UsageFault_Handler(void)
|
||||||
|
{
|
||||||
|
/* Go to infinite loop when Usage Fault exception occurs */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles SVCall exception.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SVC_Handler(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles Debug Monitor exception.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void DebugMon_Handler(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* STM32F2xx Peripherals Interrupt Handlers */
|
||||||
|
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
|
||||||
|
/* available peripheral interrupt handler's name please refer to the startup */
|
||||||
|
/* file (startup_stm32f2xx.s). */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles PPP interrupt request.
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
/*void PPP_IRQHandler(void)
|
||||||
|
{
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(RT_USING_DFS) && STM32_USE_SDIO
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : SDIO_IRQHandler
|
||||||
|
* Description : This function handles SDIO global interrupt request.
|
||||||
|
* Input : None
|
||||||
|
* Output : None
|
||||||
|
* Return : None
|
||||||
|
*******************************************************************************/
|
||||||
|
void SDIO_IRQHandler(void)
|
||||||
|
{
|
||||||
|
extern int SD_ProcessIRQSrc(void);
|
||||||
|
|
||||||
|
/* enter interrupt */
|
||||||
|
rt_interrupt_enter();
|
||||||
|
|
||||||
|
/* Process All SDIO Interrupt Sources */
|
||||||
|
if( SD_ProcessIRQSrc() == 2)
|
||||||
|
rt_kprintf("SD Error\n");
|
||||||
|
|
||||||
|
/* leave interrupt */
|
||||||
|
rt_interrupt_leave();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
@ -0,0 +1,281 @@
|
||||||
|
/*
|
||||||
|
* File : usart.c
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-01-05 Bernard the first version
|
||||||
|
* 2010-03-29 Bernard remove interrupt Tx and DMA Rx mode
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "usart.h"
|
||||||
|
#include <serial.h>
|
||||||
|
#include <stm32f2xx.h>
|
||||||
|
#include <stm32f2xx_dma.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use UART1 as console output and finsh input
|
||||||
|
* interrupt Rx and poll Tx (stream mode)
|
||||||
|
*
|
||||||
|
* Use UART2 with interrupt Rx and poll Tx
|
||||||
|
* Use UART3 with DMA Tx and interrupt Rx -- DMA channel 2
|
||||||
|
*
|
||||||
|
* USART DMA setting on STM32
|
||||||
|
* USART1 Tx --> DMA Channel 4
|
||||||
|
* USART1 Rx --> DMA Channel 5
|
||||||
|
* USART2 Tx --> DMA Channel 7
|
||||||
|
* USART2 Rx --> DMA Channel 6
|
||||||
|
* USART3 Tx --> DMA Channel 2
|
||||||
|
* USART3 Rx --> DMA Channel 3
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART1
|
||||||
|
struct stm32_serial_int_rx uart1_int_rx;
|
||||||
|
struct stm32_serial_device uart1 =
|
||||||
|
{
|
||||||
|
USART1,
|
||||||
|
&uart1_int_rx,
|
||||||
|
RT_NULL
|
||||||
|
};
|
||||||
|
struct rt_device uart1_device;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART6
|
||||||
|
struct stm32_serial_int_rx uart6_int_rx;
|
||||||
|
struct stm32_serial_device uart6 =
|
||||||
|
{
|
||||||
|
USART6,
|
||||||
|
&uart6_int_rx,
|
||||||
|
RT_NULL
|
||||||
|
};
|
||||||
|
struct rt_device uart6_device;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART2
|
||||||
|
struct stm32_serial_int_rx uart2_int_rx;
|
||||||
|
struct stm32_serial_device uart2 =
|
||||||
|
{
|
||||||
|
USART2,
|
||||||
|
&uart2_int_rx,
|
||||||
|
RT_NULL
|
||||||
|
};
|
||||||
|
struct rt_device uart2_device;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART3
|
||||||
|
struct stm32_serial_int_rx uart3_int_rx;
|
||||||
|
struct stm32_serial_dma_tx uart3_dma_tx;
|
||||||
|
struct stm32_serial_device uart3 =
|
||||||
|
{
|
||||||
|
USART3,
|
||||||
|
&uart3_int_rx,
|
||||||
|
&uart3_dma_tx
|
||||||
|
};
|
||||||
|
struct rt_device uart3_device;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define USART1_DR_Base 0x40013804
|
||||||
|
#define USART2_DR_Base 0x40004404
|
||||||
|
#define USART3_DR_Base 0x40004804
|
||||||
|
|
||||||
|
/* USART1_REMAP = 0 */
|
||||||
|
#define UART1_GPIO_TX GPIO_Pin_9
|
||||||
|
#define UART1_GPIO_RX GPIO_Pin_10
|
||||||
|
#define UART1_GPIO GPIOA
|
||||||
|
#define RCC_APBPeriph_UART1 RCC_APB2Periph_USART1
|
||||||
|
#define UART1_TX_DMA DMA1_Channel4
|
||||||
|
#define UART1_RX_DMA DMA1_Channel5
|
||||||
|
|
||||||
|
#if defined(STM32F10X_LD) || defined(STM32F10X_MD) || defined(STM32F10X_CL)
|
||||||
|
#define UART2_GPIO_TX GPIO_Pin_5
|
||||||
|
#define UART2_GPIO_RX GPIO_Pin_6
|
||||||
|
#define UART2_GPIO GPIOD
|
||||||
|
#define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2
|
||||||
|
#else /* for STM32F10X_HD */
|
||||||
|
/* USART2_REMAP = 0 */
|
||||||
|
#define UART2_GPIO_TX GPIO_Pin_2
|
||||||
|
#define UART2_GPIO_RX GPIO_Pin_3
|
||||||
|
#define UART2_GPIO GPIOA
|
||||||
|
#define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2
|
||||||
|
#define UART2_TX_DMA DMA1_Channel7
|
||||||
|
#define UART2_RX_DMA DMA1_Channel6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* USART3_REMAP[1:0] = 00 */
|
||||||
|
#define UART3_GPIO_RX GPIO_Pin_11
|
||||||
|
#define UART3_GPIO_TX GPIO_Pin_10
|
||||||
|
#define UART3_GPIO GPIOB
|
||||||
|
#define RCC_APBPeriph_UART3 RCC_APB1Periph_USART3
|
||||||
|
#define UART3_TX_DMA DMA1_Channel2
|
||||||
|
#define UART3_RX_DMA DMA1_Channel3
|
||||||
|
|
||||||
|
/* USART6_REMAP = 0 */
|
||||||
|
#define UART6_GPIO_TX GPIO_Pin_6
|
||||||
|
#define UART6_GPIO_RX GPIO_Pin_7
|
||||||
|
#define UART6_GPIO GPIOC
|
||||||
|
#define RCC_APBPeriph_UART6 RCC_APB2Periph_USART6
|
||||||
|
//#define UART1_TX_DMA DMA1_Channel?
|
||||||
|
//#define UART1_RX_DMA DMA1_Channel?
|
||||||
|
|
||||||
|
static void RCC_Configuration(void)
|
||||||
|
{
|
||||||
|
#ifdef RT_USING_UART1
|
||||||
|
/* Enable USART1 and GPIOA clocks */
|
||||||
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
|
||||||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART6
|
||||||
|
/* Enable USART6 and GPIOC clocks */
|
||||||
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
|
||||||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GPIO_Configuration(void)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART1
|
||||||
|
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
|
||||||
|
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
|
||||||
|
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
|
||||||
|
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
|
||||||
|
|
||||||
|
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
|
||||||
|
GPIO_Init(GPIOA,&GPIO_InitStruct);
|
||||||
|
|
||||||
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
|
||||||
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART6
|
||||||
|
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
|
||||||
|
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
|
||||||
|
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
|
||||||
|
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
|
||||||
|
|
||||||
|
GPIO_InitStruct.GPIO_Pin=UART6_GPIO_TX|UART6_GPIO_RX;
|
||||||
|
GPIO_Init(UART6_GPIO,&GPIO_InitStruct);
|
||||||
|
|
||||||
|
GPIO_PinAFConfig(UART6_GPIO, GPIO_PinSource6, GPIO_AF_USART6);
|
||||||
|
GPIO_PinAFConfig(UART6_GPIO, GPIO_PinSource7, GPIO_AF_USART6);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void NVIC_Configuration(void)
|
||||||
|
{
|
||||||
|
NVIC_InitTypeDef NVIC_InitStructure;
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART1
|
||||||
|
/* Enable the USART1 Interrupt */
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||||
|
NVIC_Init(&NVIC_InitStructure);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART6
|
||||||
|
/* Enable the USART1 Interrupt */
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||||
|
NVIC_Init(&NVIC_InitStructure);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Init all related hardware in here
|
||||||
|
* rt_hw_serial_init() will register all supported USART device
|
||||||
|
*/
|
||||||
|
void rt_hw_usart_init()
|
||||||
|
{
|
||||||
|
USART_InitTypeDef USART_InitStructure;
|
||||||
|
|
||||||
|
RCC_Configuration();
|
||||||
|
|
||||||
|
GPIO_Configuration();
|
||||||
|
|
||||||
|
NVIC_Configuration();
|
||||||
|
|
||||||
|
/* uart init */
|
||||||
|
#ifdef RT_USING_UART1
|
||||||
|
USART_DeInit(USART1);
|
||||||
|
USART_InitStructure.USART_BaudRate = 115200;
|
||||||
|
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
||||||
|
USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
||||||
|
USART_InitStructure.USART_Parity = USART_Parity_No ;
|
||||||
|
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
||||||
|
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
||||||
|
|
||||||
|
USART_Init(USART1, &USART_InitStructure);
|
||||||
|
|
||||||
|
/* register uart1 */
|
||||||
|
rt_hw_serial_register(&uart1_device, "uart1",
|
||||||
|
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,
|
||||||
|
&uart1);
|
||||||
|
|
||||||
|
/* enable interrupt */
|
||||||
|
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
|
||||||
|
/* Enable USART1 */
|
||||||
|
USART_Cmd(USART1, ENABLE);
|
||||||
|
USART_ClearFlag(USART1,USART_FLAG_TXE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* uart init */
|
||||||
|
#ifdef RT_USING_UART6
|
||||||
|
USART_DeInit(USART6);
|
||||||
|
USART_InitStructure.USART_BaudRate = 115200;
|
||||||
|
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
||||||
|
USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
||||||
|
USART_InitStructure.USART_Parity = USART_Parity_No ;
|
||||||
|
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
||||||
|
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
||||||
|
|
||||||
|
USART_Init(USART6, &USART_InitStructure);
|
||||||
|
|
||||||
|
/* register uart1 */
|
||||||
|
rt_hw_serial_register(&uart6_device, "uart6",
|
||||||
|
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,
|
||||||
|
&uart6);
|
||||||
|
|
||||||
|
/* enable interrupt */
|
||||||
|
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
|
||||||
|
/* Enable USART6 */
|
||||||
|
USART_Cmd(USART6, ENABLE);
|
||||||
|
USART_ClearFlag(USART6,USART_FLAG_TXE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART1
|
||||||
|
void USART1_IRQHandler()
|
||||||
|
{
|
||||||
|
/* enter interrupt */
|
||||||
|
rt_interrupt_enter();
|
||||||
|
|
||||||
|
rt_hw_serial_isr(&uart1_device);
|
||||||
|
|
||||||
|
/* leave interrupt */
|
||||||
|
rt_interrupt_leave();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_USING_UART6
|
||||||
|
void USART6_IRQHandler()
|
||||||
|
{
|
||||||
|
/* enter interrupt */
|
||||||
|
rt_interrupt_enter();
|
||||||
|
|
||||||
|
rt_hw_serial_isr(&uart6_device);
|
||||||
|
|
||||||
|
/* leave interrupt */
|
||||||
|
rt_interrupt_leave();
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* File : usart.h
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2009-01-05 Bernard the first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __USART_H__
|
||||||
|
#define __USART_H__
|
||||||
|
|
||||||
|
#include <rthw.h>
|
||||||
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
void rt_hw_usart_init(void);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue