SDHI_driver patch (mbedOS 5.11.5)
Diff: mbed-os-program/mbed-os/targets/TARGET_RENESAS/TARGET_RZ_A1XX/TARGET_VK_RZ_A1H/device/SDHI_driver/sdhi_low.c
- Revision:
- 2:7c75ab32d7c9
- Parent:
- 1:b07be64e592e
--- a/mbed-os-program/mbed-os/targets/TARGET_RENESAS/TARGET_RZ_A1XX/TARGET_VK_RZ_A1H/device/SDHI_driver/sdhi_low.c Mon Mar 18 12:48:38 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1055 +0,0 @@ -/******************************************************************************* -* DISCLAIMER -* This software is supplied by Renesas Electronics Corporation and is only -* intended for use with Renesas products. No other uses are authorized. This -* software is owned by Renesas Electronics Corporation and is protected under -* all applicable laws, including copyright laws. -* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING -* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT -* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE -* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. -* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS -* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE -* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR -* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE -* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -* Renesas reserves the right, without notice, to make changes to this software -* and to discontinue the availability of this software. By using this software, -* you agree to the additional terms and conditions found by accessing the -* following link: -* http://www.renesas.com/disclaimer -* -* Copyright (C) 2013 Renesas Electronics Corporation. All rights reserved. -*******************************************************************************/ -/******************************************************************************* -* File Name : sd_dev_low.c -* $Rev: $ -* $Date:: $ -* Device(s) : RZ/A1H -* Tool-Chain : DS-5 Ver 5.8 -* : ARM Complier -* OS : -* H/W Platform : RZ/A1H CPU Board -* Description : RZ/A1H SD Driver Sample Program -* Operation : -* Limitations : -*******************************************************************************/ - - -/****************************************************************************** -Includes <System Includes> , "Project Includes" -******************************************************************************/ -#include <stdio.h> -#include <string.h> -#include "r_typedefs.h" -#include "iodefine.h" -#include "rza_io_regrw.h" -/*#include "devdrv_intc.h"*/ -#include "sdif.h" -#include "sd_cfg.h" -/*#include "sd_dev_dmacdrv.h"*/ -#include "us_ticker_api.h" -#include "cmsis_os2.h" -#include "mbed_assert.h" -#include "pinmap.h" - - -/****************************************************************************** -Typedef definitions -******************************************************************************/ - - -/****************************************************************************** -Macro definitions -******************************************************************************/ -//#define MTU_TIMER_CNT 32 /* P-phy = 32MHz */ -#define INT_LEVEL_SDHI 10 /* SDHI interrupt level */ -#define SDHI_PINS_COMMON 2 -#define SDHI_PINS_SERIAL 3 -#define SDHI_PINS_PARALLEL 6 - -#if defined(SDCFG_SDMODE_1BIT) -# define SDHI_PORT_MODE SD_PORT_SERIAL -#else -# define SDHI_PORT_MODE SD_PORT_PARALLEL -#endif - -/****************************************************************************** -Imported global variables and functions (from other files) -******************************************************************************/ - - -/****************************************************************************** -Exported global variables and functions (to be accessed by other files) -******************************************************************************/ - - -/****************************************************************************** -Private global variables and functions -******************************************************************************/ -#if 0 -static uint8_t g_sdhi_priority_backup; -#endif - - - -static const PinName SDHIpin_Common[SDHI_COUNT][SDHI_PINS_COMMON] = { /* WP & CD */ - {P4_8, P4_9}, - {P3_8, P3_9} -}; - -static const PinName SDHIpin_serial[SDHI_COUNT][SDHI_PINS_SERIAL] = { /* CLK CMD D0 */ - {P4_11, P4_12, P4_13}, - {P3_11, P3_12, P3_13} -}; - -static const PinName SDHIpin_parallel[SDHI_COUNT][SDHI_PINS_PARALLEL] = { /* CLK CMD D0-D3 */ - {P4_10, P4_11, P4_12, P4_13, P4_14, P4_15}, - {P3_10, P3_11, P3_12, P3_13, P3_14, P3_15} -}; - - -static const PinMap PinMap_SDHI_PIN[] = { - /* pin | periph| func */ - {P4_8 , SDHI_0, 3}, /* SD_CD_0 */ - {P4_9 , SDHI_0, 3}, /* SD_WP_0 */ - {P4_10 , SDHI_0, 3}, /* SD_D1_0 */ - {P4_11 , SDHI_0, 3}, /* SD_D0_0 */ - {P4_12 , SDHI_0, 3}, /* SD_CLK_0 */ - {P4_13 , SDHI_0, 3}, /* SD_CMD_0 */ - {P4_14 , SDHI_0, 3}, /* SD_D3_0 */ - {P4_15 , SDHI_0, 3}, /* SD_D2_0 */ - /*----------------*/ - {P3_8 , SDHI_1, 7}, /* SD_CD_1 */ - {P3_9 , SDHI_1, 7}, /* SD_WP_1 */ - {P3_10 , SDHI_1, 7}, /* SD_D1_1 */ - {P3_11 , SDHI_1, 7}, /* SD_D0_1 */ - {P3_12 , SDHI_1, 7}, /* SD_CLK_1 */ - {P3_13 , SDHI_1, 7}, /* SD_CMD_1 */ - {P3_14 , SDHI_1, 7}, /* SD_D3_1 */ - {P3_15 , SDHI_1, 7}, /* SD_D2_1 */ - {NC , NC , 0} -}; - - - -static unsigned long _ulStart = 0; -static unsigned long _ulDelta = 0; -static const ticker_data_t *_ticker; - -//static int sddev_init_0(void); -//static int sddev_init_1(void); -//static int sddev_set_port_0(int mode); -//static int sddev_set_port_1(int mode); - -static int sddev_init_dma_0(unsigned long buff,unsigned long reg,long cnt,int dir); -static int sddev_init_dma_1(unsigned long buff,unsigned long reg,long cnt,int dir); - -static int sddev_wait_dma_end_0(long cnt); -static int sddev_wait_dma_end_1(long cnt); - -static int sddev_disable_dma_0(void); -static int sddev_disable_dma_1(void); - -static void sddev_sd_int_handler_0(uint32_t int_sense); -static void sddev_sd_int_handler_1(uint32_t int_sense); -static void sddev_sdio_int_handler_0(uint32_t int_sense); -static void sddev_sdio_int_handler_1(uint32_t int_sense); -static void sddev_start_timer(int msec); -static void sddev_end_timer(void); -static int sddev_check_timer(void); - -/****************************************************************************** -* Function Name: int sddev_cmd0_sdio_mount(int sd_port); -* Description : Select to issue CMD0 before SDIO Mount -* Arguments : none -* Return Value : SD_OK : issue CMD0 -* : SD_ERR : not issue CMD0 -******************************************************************************/ -int sddev_cmd0_sdio_mount(int sd_port) -{ -#ifdef SDCFG_IO - return SD_ERR; -#else - return SD_ERR; -#endif -} - -/****************************************************************************** -* Function Name: int sddev_cmd8_sdio_mount(int sd_port); -* Description : Select to issue CMD8 before SDIO Mount -* Arguments : none -* Return Value : SD_OK : issue CMD8 -* : SD_ERR : not issue CMD8 -******************************************************************************/ -int sddev_cmd8_sdio_mount(int sd_port) -{ -#ifdef SDCFG_IO - return SD_OK; -#else - return SD_ERR; -#endif -} - - - -/****************************************************************************** -* Function Name: int sddev_init(void); -* Description : Initialize H/W to use SDHI -* Arguments : none -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_init(int sd_port) -{ - if ( sd_port >= SDHI_COUNT ) - return SD_ERR; - - - volatile uint8_t dummy_buf; - - CPG.STBCR12 = 0xF0u; /* [1], [1], [1], [1], SDHI00, SDHI01, SDHI10, SDHI11 */ - dummy_buf = CPG.STBCR12; /* (Dummy read) */ - - - for( uint32_t no=0; no < SDHI_PINS_COMMON; no++ ) - { - if ( pinmap_peripheral(SDHIpin_Common[sd_port][no], PinMap_SDHI_PIN ) != sd_port) - { - return SD_ERR; - } - pinmap_pinout(SDHIpin_Common[sd_port][no], PinMap_SDHI_PIN); - } - - sddev_set_port(sd_port, SDHI_PORT_MODE); - -#ifdef SDCFG_HWINT - if ( sd_port == (uint32_t)SDHI_0 ) - { - InterruptHandlerRegister(SDHI0_0_IRQn, sddev_sd_int_handler_0); - GIC_SetPriority(SDHI0_0_IRQn, INT_LEVEL_SDHI); - GIC_EnableIRQ(SDHI0_0_IRQn); - - InterruptHandlerRegister(SDHI0_3_IRQn, sddev_sd_int_handler_0); - GIC_SetPriority(SDHI0_3_IRQn, INT_LEVEL_SDHI); - GIC_EnableIRQ(SDHI0_3_IRQn); - - InterruptHandlerRegister(SDHI0_1_IRQn, sddev_sdio_int_handler_0); - GIC_SetPriority(SDHI0_1_IRQn, INT_LEVEL_SDHI); - GIC_EnableIRQ(SDHI0_1_IRQn); - } - else if ( sd_port == (uint32_t)SDHI_1 ) - { - InterruptHandlerRegister(SDHI1_0_IRQn, sddev_sd_int_handler_1); - GIC_SetPriority(SDHI1_0_IRQn, INT_LEVEL_SDHI); - GIC_EnableIRQ(SDHI1_0_IRQn); - - InterruptHandlerRegister(SDHI1_3_IRQn, sddev_sd_int_handler_1); - GIC_SetPriority(SDHI1_3_IRQn, INT_LEVEL_SDHI); - GIC_EnableIRQ(SDHI1_3_IRQn); - - InterruptHandlerRegister(SDHI1_1_IRQn, sddev_sdio_int_handler_1); - GIC_SetPriority(SDHI1_1_IRQn, INT_LEVEL_SDHI); - GIC_EnableIRQ(SDHI1_1_IRQn); - } -#endif - - /* ---- wait card detect ---- */ - osDelay(1000); /* wait 1s */ - - return SD_OK; -} - - -/****************************************************************************** -* Function Name: int sddev_power_on(int sd_port); -* Description : Power-on H/W to use SDHI -* Arguments : none -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_power_on(int sd_port) -{ - /* ---Power On SD ---- */ - - /* ---- Wait for SD Wake up ---- */ - osDelay(100); /* wait 100ms */ - - return SD_OK; -} - -/****************************************************************************** -* Function Name: int sddev_power_off(int sd_port); -* Description : Power-off H/W to use SDHI -* Arguments : none -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_power_off(int sd_port) -{ - return SD_OK; -} - -/****************************************************************************** -* Function Name: int sddev_read_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num); -* Description : read from SDHI buffer FIFO -* Arguments : unsigned char *buff : buffer addrees to store reading datas -* : unsigned long reg_addr : SDIP FIFO address -* : long num : counts to read(unit:byte) -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_read_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num) -{ - long i; - long cnt; - unsigned long *reg; - unsigned long *ptr_l; - unsigned char *ptr_c; - unsigned long tmp; - - reg = (unsigned long *)(reg_addr); - - cnt = (num / 4); - if(((unsigned long)buff & 0x3) != 0) - { - ptr_c = (unsigned char *)buff; - for(i = cnt; i > 0 ; i--) - { - tmp = *reg; - *ptr_c++ = (unsigned char)(tmp); - *ptr_c++ = (unsigned char)(tmp >> 8); - *ptr_c++ = (unsigned char)(tmp >> 16); - *ptr_c++ = (unsigned char)(tmp >> 24); - } - - cnt = (num % 4); - if( cnt != 0 ) - { - tmp = *reg; - for(i = cnt; i > 0 ; i--) - { - *ptr_c++ = (unsigned char)(tmp); - tmp >>= 8; - } - } - } - else - { - ptr_l = (unsigned long *)buff; - for(i = cnt; i > 0 ; i--) - { - *ptr_l++ = *reg; - } - - cnt = (num % 4); - if( cnt != 0 ) - { - ptr_c = (unsigned char *)ptr_l; - tmp = *reg; - for(i = cnt; i > 0 ; i--) - { - *ptr_c++ = (unsigned char)(tmp); - tmp >>= 8; - } - } - } - - return SD_OK; -} - -/****************************************************************************** -* Function Name: int sddev_write_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num); -* Description : write to SDHI buffer FIFO -* Arguments : unsigned char *buff : buffer addrees to store writting datas -* : unsigned long reg_addr : SDIP FIFO address -* : long num : counts to write(unit:byte) -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_write_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num) -{ - long i; - unsigned long *reg = (unsigned long *)(reg_addr); - unsigned long *ptr = (unsigned long *)buff; - unsigned long tmp; - - /* dont care non 4byte allignment data */ - num += 3; - num /= 4; - if(((unsigned long)buff & 0x3) != 0) - { - for(i = num; i > 0 ; i--) - { - tmp = *buff++ ; - tmp |= *buff++ << 8; - tmp |= *buff++ << 16; - tmp |= *buff++ << 24; - *reg = tmp; - } - } - else - { - for(i = num; i > 0 ; i--) - { - *reg = *ptr++; - } - } - - return SD_OK; -} - -/****************************************************************************** -* Function Name: unsigned int sddev_get_clockdiv(int sd_port, int clock); -* Description : write to SDHI buffer FIFO -* Arguments : int clock : request clock frequency -* : SD_CLK_50MHz -* : SD_CLK_25MHz -* : SD_CLK_20MHz -* : SD_CLK_10MHz -* : SD_CLK_5MHz -* : SD_CLK_1MHz -* : SD_CLK_400kHz -* Return Value : clock div value -* : SD_DIV_2 : 1/2 clock -* : SD_DIV_2 : 1/4 clock -* : SD_DIV_2 : 1/8 clock -* : SD_DIV_2 : 1/16 clock -* : SD_DIV_2 : 1/128 clock -* : SD_DIV_2 : 1/256 clock -******************************************************************************/ -unsigned int sddev_get_clockdiv(int sd_port, int clock) -{ - unsigned int div; - - switch(clock) - { - case SD_CLK_50MHz: - div = SD_DIV_2; /* 64MHz/2 = 32MHz */ - break; - case SD_CLK_25MHz: - div = SD_DIV_4; /* 64MHz/4 = 16MHz */ - break; - case SD_CLK_20MHz: - div = SD_DIV_4; /* 64MHz/4 = 16MHz */ - break; - case SD_CLK_10MHz: - div = SD_DIV_8; /* 64MHz/8 = 8MHz */ - break; - case SD_CLK_5MHz: - div = SD_DIV_16; /* 64MHz/16 = 4MHz */ - break; - case SD_CLK_1MHz: - div = SD_DIV_128; /* 64MHz/128 = 512kHz */ - break; - case SD_CLK_400kHz: - div = SD_DIV_256; /* 64MHz/256 = 256kHz */ - break; - default: - div = SD_DIV_256; - break; - } - - return div; -} - -/****************************************************************************** -* Function Name: int sddev_set_port(int sd_port, int mode); -* Description : setting ports to use MMCHI -* Arguments : int mode : SD_PORT_PARALLEL : 4bit mode -* : SD_PORT_SERIAL : 1bit mode -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_set_port(int sd_port, int mode) -{ - if ( sd_port >= SDHI_COUNT) - return SD_ERR; - - if(mode == SD_PORT_SERIAL) - { - for( uint32_t no=0; no < SDHI_PINS_SERIAL; no++ ) - { - if ( pinmap_peripheral(SDHIpin_serial[sd_port][no], PinMap_SDHI_PIN ) != sd_port) - { - return SD_ERR; - } - pinmap_pinout(SDHIpin_serial[sd_port][no], PinMap_SDHI_PIN); - } - } - else if( mode == SD_PORT_PARALLEL ) - { - for( uint32_t no=0; no < SDHI_PINS_PARALLEL; no++ ) - { - if ( pinmap_peripheral(SDHIpin_parallel[sd_port][no], PinMap_SDHI_PIN ) != sd_port) - { - return SD_ERR; - } - pinmap_pinout(SDHIpin_parallel[sd_port][no], PinMap_SDHI_PIN); - } - } - else - { - return SD_ERR; - } - - return SD_OK; -} - - -/****************************************************************************** -* Function Name: int sddev_int_wait(int sd_port, int time); -* Description : Waitting for SDHI Interrupt -* Arguments : int time : time out value to wait interrupt -* Return Value : get interrupt : SD_OK -* : time out : SD_ERR -******************************************************************************/ -int sddev_int_wait(int sd_port, int time) -{ - sddev_start_timer(time); - while( sddev_check_timer() == SD_OK ) - { - /* interrupt generated? */ - if(sd_check_int(sd_port) == SD_OK) - { - sddev_end_timer(); - return SD_OK; - } - } - - sddev_end_timer(); - - return SD_ERR; -} - -/****************************************************************************** -* Function Name: int sddev_init_dma(unsigned long buff,unsigned long reg,long cnt,int dir); -* Description : Initialize DMAC to transfer data from SDHI FIFO -* Arguments : unsigned long buff : buffer addrees to transfer datas -* : unsigned long reg : SDIP FIFO address -* : long cnt : counts to transfer(unit:byte) -* : int dir : direction to transfer -* : : 0 : FIFO -> buffer -* : : 1 : buffer -> FIFO -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_init_dma(int sd_port, unsigned long buff,unsigned long reg,long cnt,int dir) -{ - int ret; - - if( sd_port == 0 ) - { - ret = sddev_init_dma_0(buff, reg, cnt, dir); - } - else if( sd_port == 1 ) - { - ret = sddev_init_dma_1(buff, reg, cnt, dir); - } - - return ret; -} - -/****************************************************************************** -* Function Name: static int sddev_init_dma_0(unsigned long buff,unsigned long reg,long cnt,int dir); -* Description : Initialize DMAC to transfer data from SDHI FIFO -* Arguments : unsigned long buff : buffer addrees to transfer datas -* : unsigned long reg : SDIP FIFO address -* : long cnt : counts to transfer(unit:byte) -* : int dir : direction to transfer -* : : 0 : FIFO -> buffer -* : : 1 : buffer -> FIFO -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -static int sddev_init_dma_0(unsigned long buff,unsigned long reg,long cnt,int dir) -{ -#ifdef SDCFG_TRNS_DMA - dmac_transinfo_t trans_info; - uint32_t request_factor; - int32_t ret; - - trans_info.count = (uint32_t)cnt; - #ifdef SDCFG_TRANS_DMA_64 - if( (cnt % 64) != 0 ) - { - trans_info.src_size = DMAC_TRANS_SIZE_32; - trans_info.dst_size = DMAC_TRANS_SIZE_32; - if( reg & 0x0000003f ) - { - trans_info.src_size = DMAC_TRANS_SIZE_32; - trans_info.dst_size = DMAC_TRANS_SIZE_32; - } - } - else - { - trans_info.src_size = DMAC_TRANS_SIZE_512; - trans_info.dst_size = DMAC_TRANS_SIZE_512; - } - #else - trans_info.src_size = DMAC_TRANS_SIZE_32; - trans_info.dst_size = DMAC_TRANS_SIZE_32; - #endif - - if( dir == 0 ) - { - request_factor = DMAC_REQ_SDHI_0_RX; - trans_info.src_addr = (uint32_t)reg; - trans_info.dst_addr = (uint32_t)buff; - trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; - trans_info.daddr_dir = DMAC_TRANS_ADR_INC; - } - else if( dir == 1 ) - { - request_factor = DMAC_REQ_SDHI_0_TX; - trans_info.src_addr = (uint32_t)buff; - trans_info.dst_addr = (uint32_t)reg; - trans_info.saddr_dir = DMAC_TRANS_ADR_INC; - trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; - } - - sd_DMAC1_PeriReqInit( (const dmac_transinfo_t *)&trans_info, - DMAC_MODE_REGISTER, - DMAC_SAMPLE_SINGLE, - request_factor, - 0 ); /* Dont care DMAC_REQ_REQD is setting in usb0_host_DMAC1_PeriReqInit() */ - - ret = sd_DMAC1_Open(DMAC_REQ_MODE_PERI); - if( ret != 0 ) - { - printf("DMAC1 Open error!!\n"); - return SD_ERR; - } -#endif - - return SD_OK; -} - -/****************************************************************************** -* Function Name: static int sddev_init_dma_1(unsigned long buff,unsigned long reg,long cnt,int dir); -* Description : Initialize DMAC to transfer data from SDHI FIFO -* Arguments : unsigned long buff : buffer address to transfer datas -* : unsigned long reg : SDIP FIFO address -* : long cnt : counts to transfer(unit:byte) -* : int dir : direction to transfer -* : : 0 : FIFO -> buffer -* : : 1 : buffer -> FIFO -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -static int sddev_init_dma_1(unsigned long buff,unsigned long reg,long cnt,int dir) -{ -#ifdef SDCFG_TRNS_DMA - dmac_transinfo_t trans_info; - uint32_t request_factor; - int32_t ret; - - trans_info.count = (uint32_t)cnt; - #ifdef SDCFG_TRANS_DMA_64 - if( (cnt % 64) != 0 ) - { - trans_info.src_size = DMAC_TRANS_SIZE_32; - trans_info.dst_size = DMAC_TRANS_SIZE_32; - if( reg & 0x0000003f ) - { - trans_info.src_size = DMAC_TRANS_SIZE_32; - trans_info.dst_size = DMAC_TRANS_SIZE_32; - } - } - else - { - trans_info.src_size = DMAC_TRANS_SIZE_512; - trans_info.dst_size = DMAC_TRANS_SIZE_512; - } - #else - trans_info.src_size = DMAC_TRANS_SIZE_32; - trans_info.dst_size = DMAC_TRANS_SIZE_32; - #endif - - if( dir == 0 ) - { - request_factor = DMAC_REQ_SDHI_1_RX; - trans_info.src_addr = (uint32_t)reg; - trans_info.dst_addr = (uint32_t)buff; - trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; - trans_info.daddr_dir = DMAC_TRANS_ADR_INC; - } - else if( dir == 1 ) - { - request_factor = DMAC_REQ_SDHI_1_TX; - trans_info.src_addr = (uint32_t)buff; - trans_info.dst_addr = (uint32_t)reg; - trans_info.saddr_dir = DMAC_TRANS_ADR_INC; - trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; - } - - sd_DMAC2_PeriReqInit( (const dmac_transinfo_t *)&trans_info, - DMAC_MODE_REGISTER, - DMAC_SAMPLE_SINGLE, - request_factor, - 0 ); /* Dont care DMAC_REQ_REQD is setting in usb0_host_DMAC1_PeriReqInit() */ - - ret = sd_DMAC2_Open(DMAC_REQ_MODE_PERI); - if( ret != 0 ) - { - printf("DMAC1 Open error!!\n"); - return SD_ERR; - } -#endif - - return SD_OK; -} - -/****************************************************************************** -* Function Name: int sddev_wait_dma_end(int sd_port, long cnt); -* Description : Wait to complete DMAC transfer -* Arguments : long cnt : counts to transfer(unit:byte) -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_wait_dma_end(int sd_port, long cnt) -{ - int ret; - - if( sd_port == 0 ) - { - ret = sddev_wait_dma_end_0(cnt); - } - else if( sd_port == 1 ) - { - ret = sddev_wait_dma_end_1(cnt); - } - - return ret; -} - -/****************************************************************************** -* Function Name: static int sddev_wait_dma_end_0(long cnt); -* Description : Wait to complete DMAC transfer -* Arguments : long cnt : counts to transfer(unit:byte) -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -static int sddev_wait_dma_end_0(long cnt) -{ -#ifdef SDCFG_TRNS_DMA - int loop; - int time; - - time = (cnt / 512); - time = ((time * 1000) / 1024); - if(time < 1000) - { - time = 1000; - } - - if(time > (0x0000ffff / MTU_TIMER_CNT)) - { - /* @1000ms */ - loop = (time / 1000); - if( (time % 1000) != 0 ) - { - loop++; - } - time = 1000; - } - else - { - loop = 1; - } - - do{ - sddev_start_timer(time); - - while(1) - { - /* get end flag? */ - if( sd_DMAC1_Get_Endflag() == 1 ) - { - sddev_end_timer(); - return SD_OK; - } - /* detect timeout? */ - if(sddev_check_timer() == SD_ERR) - { - break; - } - } - - loop--; - if( loop <= 0 ) - { - break; - } - - } while(1); - - sddev_end_timer(); - - return SD_ERR; -#else - return SD_OK; - -#endif -} - -/****************************************************************************** -* Function Name: static int sddev_wait_dma_end_1(long cnt); -* Description : Wait to complete DMAC transfer -* Arguments : long cnt : counts to transfer(unit:byte) -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -static int sddev_wait_dma_end_1(long cnt) -{ -#ifdef SDCFG_TRNS_DMA - int loop; - int time; - - time = (cnt / 512); - time = ((time * 1000) / 1024); - if(time < 1000) - { - time = 1000; - } - - if(time > (0x0000ffff / MTU_TIMER_CNT)) - { - /* @1000ms */ - loop = (time / 1000); - if( (time % 1000) != 0 ) - { - loop++; - } - time = 1000; - } - else - { - loop = 1; - } - - do{ - sddev_start_timer(time); - - while(1) - { - /* get end flag? */ - if( sd_DMAC2_Get_Endflag() == 1 ) - { - sddev_end_timer(); - return SD_OK; - } - /* detect timeout? */ - if(sddev_check_timer() == SD_ERR) - { - break; - } - } - - loop--; - if( loop <= 0 ) - { - break; - } - - } while(1); - - sddev_end_timer(); - - return SD_ERR; -#else - return SD_OK; - -#endif -} - -/****************************************************************************** -* Function Name: int sddev_disable_dma(int sd_port); -* Description : Disable DMAC transfer -* Arguments : none -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_disable_dma(int sd_port) -{ - int ret; - - if( sd_port == 0 ) - { - ret = sddev_disable_dma_0(); - } - else - { - ret = sddev_disable_dma_1(); - } - return ret; -} - -/****************************************************************************** -* Function Name: static int sddev_disable_dma_0(void); -* Description : Disable DMAC transfer -* Arguments : none -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -static int sddev_disable_dma_0(void) -{ -#ifdef SDCFG_TRNS_DMA - uint32_t remain; - - sd_DMAC1_Close(&remain); -#endif - return SD_OK; -} - -/****************************************************************************** -* Function Name: staticint sddev_disable_dma_1(void); -* Description : Disable DMAC transfer -* Arguments : none -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -static int sddev_disable_dma_1(void) -{ -#ifdef SDCFG_TRNS_DMA - uint32_t remain; - - sd_DMAC2_Close(&remain); -#endif - return SD_OK; -} - -/****************************************************************************** -* Function Name: int sddev_loc_cpu(int sd_port); -* Description : lock cpu to disable interrupt -* Arguments : none -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_loc_cpu(int sd_port) -{ -#if 0 - R_INTC_GetMaskLevel(&g_sdhi_priority_backup); - R_INTC_SetMaskLevel(0); - core_util_critical_section_enter(); -#endif - - return SD_OK; -} - -/****************************************************************************** -* Function Name: int sddev_unl_cpu(int sd_port); -* Description : unlock cpu to enable interrupt -* Arguments : none -* Return Value : success : SD_OK -* : fail : SD_ERR -******************************************************************************/ -int sddev_unl_cpu(int sd_port) -{ -#if 0 - R_INTC_SetMaskLevel(g_sdhi_priority_backup); - core_util_critical_section_exit(); -#endif - return SD_OK; -} - -/****************************************************************************** -* Function Name: int sddev_finalize(int sd_port); -* Description : finalize SDHI -* Arguments : none -* Return Value : none -******************************************************************************/ -int sddev_finalize(int sd_port) -{ - return SD_OK; -} - -/****************************************************************************** -* Function Name: static void sddev_sd_int_handler_0(uint32_t int_sense); -* Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_0,INTC_ID_SDHI0_3) -* Arguments : Interrupt mode -* Return Value : none -******************************************************************************/ -static void sddev_sd_int_handler_0(uint32_t int_sense) -{ - sd_int_handler(0); -} - -/****************************************************************************** -* Function Name: static void sddev_sd_int_handler_1(uint32_t int_sense); -* Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_0,INTC_ID_SDHI0_3) -* Arguments : Interrupt mode -* Return Value : none -******************************************************************************/ -static void sddev_sd_int_handler_1(uint32_t int_sense) -{ - sd_int_handler(1); -} - -/****************************************************************************** -* Function Name: static void sddev_sdio_int_handler_0(uint32_t int_sense); -* Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_1) -* Arguments : Interrupt mode -* Return Value : none -******************************************************************************/ -static void sddev_sdio_int_handler_0(uint32_t int_sense) -{ - sdio_int_handler(0); -} - -/****************************************************************************** -* Function Name: static void sddev_sdio_int_handler_1(uint32_t int_sense); -* Description : Setting Interrupt function for SDHI(INTC_ID_SDHI1_1) -* Arguments : Interrupt mode -* Return Value : none -******************************************************************************/ -static void sddev_sdio_int_handler_1(uint32_t int_sense) -{ - sdio_int_handler(1); -} - -/****************************************************************************** -* Function Name: static void sddev_start_timer(int msec); -* Description : start timer -* Arguments : -* Return Value : none -******************************************************************************/ -static void sddev_start_timer(int msec) -{ - _ticker = get_us_ticker_data(); - _ulStart = ticker_read(_ticker); - _ulDelta = msec*1000ul; -} - -/****************************************************************************** -* Function Name: static void sddev_end_timer(void); -* Description : end timer -* Arguments : -* Return Value : none -******************************************************************************/ -static void sddev_end_timer(void) -{ - _ulStart = 0ul; - _ulDelta = 0ul; -} - -/****************************************************************************** -* Function Name: static int sddev_check_timer(void); -* Description : check -* Arguments : -* Return Value : t -******************************************************************************/ -static int sddev_check_timer(void) -{ - if ( _ulStart && _ulDelta ) - { - return ((ticker_read(_ticker)-_ulStart) < _ulDelta) ? SD_OK : SD_ERR; - } - else - { - return SD_ERR; - } -} - -/* End of File */ -