aboutsummaryrefslogtreecommitdiff
path: root/laser-tag software/disk.c
diff options
context:
space:
mode:
Diffstat (limited to 'laser-tag software/disk.c')
-rw-r--r--laser-tag software/disk.c1002
1 files changed, 278 insertions, 724 deletions
diff --git a/laser-tag software/disk.c b/laser-tag software/disk.c
index 84b1c3f..5a89d66 100644
--- a/laser-tag software/disk.c
+++ b/laser-tag software/disk.c
@@ -1,724 +1,278 @@
-/**HEADER********************************************************************
- *
- * Copyright (c) 2008, 2013 - 2014 Freescale Semiconductor;
- * All Rights Reserved
- *
- * Copyright (c) 1989-2008 ARC International;
- * All Rights Reserved
- *
- ***************************************************************************
- *
- * THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL FREESCALE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- *
- **************************************************************************
- *
- * $FileName: disk.c$
- * $Version :
- * $Date :
- *
- * Comments:
- *
- * @brief RAM Disk has been emulated via this Mass Storage Demo
- *****************************************************************************/
-
-/******************************************************************************
- * Includes
- *****************************************************************************/
-#include "usb_device_config.h"
-#include "usb.h"
-#include "usb_device_stack_interface.h"
-#include "disk.h"
-#include "adapter_cfg.h"
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
-#include "fsl_device_registers.h"
-#include "fsl_clock_manager.h"
-//#include "board.h"
-#include "fsl_debug_console.h"
-#if (TWR_K64F120M || FRDM_K64F || TWR_K60D100M || TWR_K21F120M || TWR_K65F180M)
-#include "fsl_mpu_hal.h"
-#endif
-#include "fsl_port_hal.h"
-#include <stdio.h>
-#include <stdlib.h>
-#endif
-
-#if SD_CARD_APP
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_BM)
-#include "sd_esdhc_kinetis.h"
-#elif (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
-#include "fsl_sdhc_card.h"
-#include "fsl_gpio_driver.h"
-#include "gpio_pins.h"
-#include "board.h"
-#else
-#include "sd.h"
-#endif
-#endif
-
-#if USBCFG_DEV_COMPOSITE
-#error This application requires USBCFG_DEV_COMPOSITE defined zero in usb_device_config.h. Please recompile usbd with this option.
-#endif
-
-#if !USBCFG_DEV_MSC
-#error This application requires USBCFG_DEV_MSC defined none zero in usb_device_config.h. Please recompile usbd with this option.
-#endif
-
-#if HIGH_SPEED
-
-#if !USBCFG_DEV_EHCI
-#error This application requires USBCFG_DEV_EHCI defined none zero in usb_device_config.h. Please recompile usbd with this option.
-#endif
-
-#endif
-
-extern void Main_Task(uint32_t param);
-#define MAIN_TASK 10
-
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_MQX)
-TASK_TEMPLATE_STRUCT MQX_template_list[] =
-{
- { MAIN_TASK, Main_Task, 2 * 3000L, 9L, "Main", MQX_AUTO_START_TASK, 0, 0 },
- { 0L, 0L, 0L, 0L, 0L, 0L, 0, 0 }
-};
-
-MQX_FILE_PTR g_sdcard_handle;
-#endif
-/*****************************************************************************
- * Constant and Macro's - None
- *****************************************************************************/
-
-/*****************************************************************************
- * Global Functions Prototypes
- *****************************************************************************/
-void TestApp_Init(void);
-
-/****************************************************************************
- * Global Variables
- ****************************************************************************/
-/* Add all the variables needed for disk.c to this structure */
-extern usb_desc_request_notify_struct_t desc_callback;
-usb_application_callback_struct_t msc_application_callback;
-usb_vendor_req_callback_struct_t vend_req_callback;
-usb_class_specific_callback_struct_t class_specific_callback;
-
-msc_config_struct_t g_msd_config;
-#if (RAM_DISK_APP)
-/* Here set storage_disk value to put the 24k buffer to RW region,
- if putting in ZI and 64k ram the ZI region cannot be put in upper/bottom 32k ram for iar */
-disk_struct_t g_disk =
-{
- .storage_disk = {0x01},
-};
-#else
-disk_struct_t g_disk;
-#endif
-
-#if SD_CARD_APP
- #define USE_SDHC_PROTOCOL (1)
- #define USE_SPI_PROTOCOL (0)
-#endif
-
-/*****************************************************************************
- * Local Types - None
- *****************************************************************************/
-
-/*****************************************************************************
- * Local Functions Prototypes
- *****************************************************************************/
-void USB_App_Device_Callback(uint8_t event_type, void* val, void* arg);
-uint8_t USB_App_Class_Callback
-(uint8_t event_type,
- uint16_t value,
- uint8_t ** data,
- uint32_t* size,
- void* arg
- );
-void Disk_App(void);
-/*****************************************************************************
- * Local Variables
- *****************************************************************************/
-#if SD_CARD_APP
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
-#define SDCARD_BLOCK_SIZE_POWER (9)
-sdhc_card_t card = {0};
-sdhc_host_t host = {0};
-#endif
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_BM || OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
-uint32_t g_msc_bulk_out_buff_temp[MSD_RECV_BUFFER_NUM][MSD_RECV_BUFFER_SIZE >> 2];
-uint32_t g_msc_bulk_in_buff_temp[MSD_SEND_BUFFER_SIZE >> 2];
-#endif
-uint8_t *g_msc_bulk_out_buff;
-uint8_t *g_msc_bulk_in_buff;
-#endif
-/*****************************************************************************
- * Local Functions
- *****************************************************************************/
-#if SD_CARD_APP
-os_msgq_handle write_buffer_msg_handler;
-
-/******************************************************************************
- *
- * @name get_write_buffer
- *
- * @brief This function get the buffer for writing
- *
- * @param None
- *
- * @return buffer pointer (return NULL when there is no idle buffer )
- **
- *****************************************************************************/
-uint32_t* get_write_buffer(void)
-{
- uint32_t msg;
- /* wait forever for RTOS; return immediately for bm */
- if (OS_MsgQ_recv(write_buffer_msg_handler, (void*)&msg, OS_MSGQ_RECEIVE_BLOCK_ON_EMPTY, 0) == OS_MSGQ_OK)
- {
- return (uint32_t*)msg;
- }
- return NULL;
-}
-
-/******************************************************************************
- *
- * @name get_write_buffer
- *
- * @brief This function get the buffer for writing
- *
- * @param buffer : The buffer pointer
- *
- * @return None
- **
- *****************************************************************************/
-void free_write_buffer(uint32_t* buffer)
-{
- uint32_t address = (uint32_t)buffer;
- OS_MsgQ_send(write_buffer_msg_handler, (void*)(&address), 0);
-}
-#endif
-
-#if MUTILE_BUFFER && (((OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK) && (USE_RTOS)) || (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_MQX))
-os_msgq_handle write_msg_handler;
-os_mutex_handle sdhc_mutex;
-
-static void write_task(void *arg)
-{
- uint8_t* buff_ptr;
- uint32_t offset;
- uint32_t size;
- uint32_t msg[3];
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
- sdhc_status_t error_code = kStatus_SDHC_NoError;
-#else
- _mqx_uint error_code = MQX_OK;
-#endif
-
- while (OS_MsgQ_recv(write_msg_handler, (void*)&msg, OS_MSGQ_RECEIVE_BLOCK_ON_EMPTY, 0) == OS_MSGQ_OK)
- {
- buff_ptr = (uint8_t*)msg[0];
- offset = msg[1];
- size = msg[2];
-
- OS_Mutex_lock(sdhc_mutex);
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
- error_code = SDCARD_DRV_WriteBlocks(&card, buff_ptr, offset >> SDCARD_BLOCK_SIZE_POWER, size >> SDCARD_BLOCK_SIZE_POWER);
-#elif (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_MQX)
- error_code = sd_write_device_sectors(g_sdcard_handle, offset >> SDCARD_BLOCK_SIZE_POWER, size >> SDCARD_BLOCK_SIZE_POWER, 3, buff_ptr, NULL);
-#endif
- OS_Mutex_unlock(sdhc_mutex);
- free_write_buffer((uint32_t*)buff_ptr);
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
- if (error_code != kStatus_SDHC_NoError)
-#elif (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_MQX)
- if (error_code != MQX_OK)
-#endif
- {
- g_disk.read_write_error = 1;
- USB_PRINTF("Write SD card error, error = 0x%x.\tPlease check recv buff size(must be less than 128 sectors).\r\n", error_code);
- }
- }
-}
-#endif
-
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK && SD_CARD_APP)
-#if defined(FSL_RTOS_MQX)
-#include "fsl_sdhc_driver.h"
-void SDHC_MQX_IRQHandler(void)
-{
-#if defined BSP_FSL_SDHC_USING_IRQ
- SDHC_DRV_DoIrq(0);
-#endif
-}
-#endif
-
-/* don't use interrupt to detect the sdcard */
-gpio_input_pin_user_config_t sdhc_detect_pin[2];
-
-void sdhc_detect_io_init(void)
-{
- for (int i = 0; i < 2; ++i)
- {
- sdhc_detect_pin[i].pinName = sdhcCdPin[i].pinName;
- sdhc_detect_pin[i].config.isPullEnable = sdhcCdPin[i].config.isPullEnable;
- sdhc_detect_pin[i].config.pullSelect = sdhcCdPin[i].config.pullSelect;
- sdhc_detect_pin[i].config.isPassiveFilterEnabled = sdhcCdPin[i].config.isPassiveFilterEnabled;
- sdhc_detect_pin[i].config.interrupt = kPortIntDisabled; /* don't use interrupt */
- }
-
- GPIO_DRV_Init(sdhc_detect_pin, NULL);
-}
-
-uint8_t sdhc_detect(void)
-{
- uint32_t value = 0;
- if (sdhc_detect_pin[0].config.pullSelect == kPortPullUp) /* pull up */
- {
- value = GPIO_DRV_ReadPinInput(sdhc_detect_pin[0].pinName);
- return (!value);
- }
- else /* pull down */
- {
- return (GPIO_DRV_ReadPinInput(sdhc_detect_pin[0].pinName));
- }
-}
-
-uint8_t SD_Init(void)
-{
- sdhc_user_config_t config = {0};
- /* enable SDHC module instance */
- CLOCK_SYS_EnableSdhcClock(0);
- /* disable mpu for kSdhcTransModeAdma2 */
-#if (TWR_K64F120M || FRDM_K64F || TWR_K60D100M || TWR_K21F120M || TWR_K65F180M)
- MPU_HAL_Disable(MPU);
-#endif
- /* initialize user sdhc configuration structure */
- config.transMode = kSdhcTransModeAdma2; //kSdhcTransModePio;
- config.clock = SDMMC_CLK_100KHZ;
- config.cdType = kSdhcCardDetectGpio;
- /* initialize the SDHC driver with the user configuration */
- if (SDHC_DRV_Init(BOARD_SDHC_INSTANCE, &host, &config) != kStatus_SDHC_NoError)
- {
- USB_PRINTF("SDHC_DRV_Init failed\r\n");
- return 0;
- }
-
-#if defined (FSL_RTOS_MQX)
- OS_install_isr(SDHC_IRQn, SDHC_MQX_IRQHandler, NULL);
-#endif
-#if (USE_RTOS)
- OS_intr_init(SDHC_IRQn, 5, 0, TRUE);
-#endif
-
- /* A card is detected, now initialize the card driver */
- if (kStatus_SDHC_NoError != SDCARD_DRV_Init(&host, &card))
- {
- USB_PRINTF("SDCARD_DRV_Init failed\r\n");
- SDHC_DRV_Shutdown(card.hostInstance);
- return 0;
- }
- return 1;
-}
-
-#endif
-
-/******************************************************************************
- *
- * @name Disk_App
- *
- * @brief
- *
- * @param None
- *
- * @return None
- *
- *****************************************************************************/
-void Disk_App(void)
-{
- /* User Code */
- return;
-}
-
-/******************************************************************************
- *
- * @name USB_App_Device_Callback
- *
- * @brief This function handles the callback
- *
- * @param pointer :
- * @param event_type : value of the event
- * @param val : gives the configuration value
- *
- * @return None
- *
- *****************************************************************************/
-void USB_App_Device_Callback(uint8_t event_type, void* val, void* arg)
-{
- if (event_type == USB_DEV_EVENT_BUS_RESET)
- {
- g_disk.start_app = FALSE;
- if (USB_OK == USB_Class_MSC_Get_Speed(g_disk.app_handle, &g_disk.speed))
- {
- USB_Desc_Set_Speed(g_disk.app_handle, g_disk.speed);
- }
- }
- else if (event_type == USB_DEV_EVENT_ENUM_COMPLETE)
- {
- g_disk.start_app = TRUE;
- }
- else if (event_type == USB_DEV_EVENT_ERROR)
- {
- /* add user code for error handling */
- }
- else if (event_type == USB_MSC_DEVICE_GET_SEND_BUFF_INFO)
- {
- if (NULL != val)
- {
-#if SD_CARD_APP
- *((uint32_t *)val) = (uint32_t)MSD_SEND_BUFFER_SIZE;
-#elif RAM_DISK_APP
- *((uint32_t *)val) = (uint32_t)DISK_SIZE_NORMAL;
-#endif
- }
- }
- else if (event_type == USB_MSC_DEVICE_GET_RECV_BUFF_INFO)
- {
- if (NULL != val)
- {
-#if SD_CARD_APP
- *((uint32_t *)val) = (uint32_t)MSD_RECV_BUFFER_SIZE;
-#elif RAM_DISK_APP
- *((uint32_t *)val) = (uint32_t)DISK_SIZE_NORMAL;
-#endif
- }
- }
-
- return;
-}
-
-/******************************************************************************
- *
- * @name USB_App_Class_Callback
- *
- * @brief This function handles the callback
- *
- * @param pointer :
- * @param event_type : value of the event
- * @param val : gives the configuration value
- *
- * @return None
- *
- *****************************************************************************/
-uint8_t USB_App_Class_Callback
-(uint8_t event_type,
- uint16_t value,
- uint8_t ** data,
- uint32_t* size,
- void* arg
-)
-{
- lba_app_struct_t* lba_data_ptr;
- uint8_t * prevent_removal_ptr;
- device_lba_info_struct_t* device_lba_info_ptr;
- uint8_t error = USB_OK;
-#if SD_CARD_APP && (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_MQX)
- _mqx_uint error_code = MQX_OK;
-#endif
-#if SD_CARD_APP && (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
- sdhc_status_t error_code = kStatus_SDHC_NoError;
-#endif
-
- if (g_disk.read_write_error)
- {
- return USBERR_ERROR;
- }
-
- switch(event_type)
- {
- case USB_DEV_EVENT_DATA_RECEIVED:
- /* Add User defined code -- if required*/
- lba_data_ptr = (lba_app_struct_t*) size;
-#if RAM_DISK_APP
-#elif SD_CARD_APP
- if (lba_data_ptr->size == 0)
- free_write_buffer((uint32_t*)lba_data_ptr->buff_ptr);
- else
- {
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_BM)
- SD_Write_Block(lba_data_ptr);
- free_write_buffer((uint32_t*)lba_data_ptr->buff_ptr);
-#elif (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
-#if MUTILE_BUFFER && (USE_RTOS)
- uint32_t msg[3] = {(uint32_t)lba_data_ptr->buff_ptr, lba_data_ptr->offset, lba_data_ptr->size};
- OS_MsgQ_send(write_msg_handler, (void*)(msg), 0);
-#else
- error_code = SDCARD_DRV_WriteBlocks(&card, lba_data_ptr->buff_ptr, lba_data_ptr->offset >> SDCARD_BLOCK_SIZE_POWER,
- lba_data_ptr->size >> SDCARD_BLOCK_SIZE_POWER);
- free_write_buffer((uint32_t*)lba_data_ptr->buff_ptr);
- if (error_code != kStatus_SDHC_NoError)
- {
- error = USBERR_ERROR;
- g_disk.read_write_error=1;
- USB_PRINTF("Write SD card error, error = 0x%x.\tPlease check recv buff size(must be less than 128 sectors).\r\n", error_code);
- }
-#endif
-
-#else
-#if MUTILE_BUFFER
- uint32_t msg[3] = {(uint32_t)lba_data_ptr->buff_ptr, lba_data_ptr->offset, lba_data_ptr->size};
- OS_MsgQ_send(write_msg_handler, (void*)(msg), 0);
-#else
- error_code = sd_write_device_sectors(g_sdcard_handle, (lba_data_ptr->offset >> SDCARD_BLOCK_SIZE_POWER),
- (lba_data_ptr->size >> SDCARD_BLOCK_SIZE_POWER) , 3, lba_data_ptr->buff_ptr,NULL);
- free_write_buffer((uint32_t*)lba_data_ptr->buff_ptr);
- if (error_code != MQX_OK)
- {
- error = USBERR_ERROR;
- g_disk.read_write_error=1;
- USB_PRINTF("Write SD card error, error = 0x%x.\tPlease check recv buff size(must be less than 128 sectors).\r\n", error_code);
- }
-#endif
-#endif
- }
-#endif
- break;
- case USB_DEV_EVENT_SEND_COMPLETE:
- /* Add User defined code -- if required*/
- lba_data_ptr = (lba_app_struct_t*) size;
- if (lba_data_ptr->size != 0)
- {
- /* read data from mass storage device to driver buffer */
-#if RAM_DISK_APP
- if(data != NULL)
- {
- *data = g_disk.storage_disk + lba_data_ptr->offset;
- }
-#elif SD_CARD_APP
-#endif
- }
- break;
- case USB_MSC_START_STOP_EJECT_MEDIA:
- /* Code to be added by user for starting, stopping or
- ejecting the disk drive. e.g. starting/stopping the motor in
- case of CD/DVD*/
- break;
- case USB_MSC_DEVICE_READ_REQUEST:
- lba_data_ptr = (lba_app_struct_t*) size;
-
-#if RAM_DISK_APP
- if(data != NULL)
- {
- *data = g_disk.storage_disk + lba_data_ptr->offset;
- }
-#elif SD_CARD_APP
- if(data != NULL)
- {
- *data = g_msc_bulk_in_buff;
- }
- lba_data_ptr->buff_ptr = g_msc_bulk_in_buff;
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_BM)
- SD_Read_Block(lba_data_ptr);
-#elif (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
-#if MUTILE_BUFFER && (USE_RTOS)
- OS_Mutex_lock(sdhc_mutex);
-#endif
- error_code = SDCARD_DRV_ReadBlocks(&card, lba_data_ptr->buff_ptr, lba_data_ptr->offset >> SDCARD_BLOCK_SIZE_POWER,
- lba_data_ptr->size >> SDCARD_BLOCK_SIZE_POWER);
-#if MUTILE_BUFFER && (USE_RTOS)
- OS_Mutex_unlock(sdhc_mutex);
-#endif
- if (error_code != kStatus_SDHC_NoError)
- {
- error = USBERR_ERROR;
- g_disk.read_write_error=1;
- USB_PRINTF("Read SD card error, error = 0x%x.\tPlease check send buff size(must be less than 128 sectors).\r\n", error_code);
- }
-#else
-#if MUTILE_BUFFER
- OS_Mutex_lock(sdhc_mutex);
-#endif
- error_code = sd_read_device_sectors(g_sdcard_handle, (lba_data_ptr->offset >> SDCARD_BLOCK_SIZE_POWER),
- (lba_data_ptr->size >> SDCARD_BLOCK_SIZE_POWER) , 3, lba_data_ptr->buff_ptr,NULL);
-#if MUTILE_BUFFER
- OS_Mutex_unlock(sdhc_mutex);
-#endif
- if (error_code != MQX_OK)
- {
- error = USBERR_ERROR;
- g_disk.read_write_error=1;
- USB_PRINTF("Read SD card error, error = 0x%x.\tPlease check send buff size(must be less than 128 sectors).\r\n", error_code);
- }
-#endif
-#endif
- break;
- case USB_MSC_DEVICE_WRITE_REQUEST:
- lba_data_ptr = (lba_app_struct_t*) size;
-#if RAM_DISK_APP
- if(data != NULL)
- {
- *data = g_disk.storage_disk + lba_data_ptr->offset;
- }
-#elif SD_CARD_APP
- if(data != NULL)
- {
- /* get_write_buffer should return NULL when there are no buffers for writing */
- *data = (uint8_t*)get_write_buffer();
- }
-#endif
- break;
- case USB_MSC_DEVICE_FORMAT_COMPLETE:
- break;
- case USB_MSC_DEVICE_REMOVAL_REQUEST:
- prevent_removal_ptr = (uint8_t *) size;
- if (SUPPORT_DISK_LOCKING_MECHANISM)
- {
- g_disk.disk_lock = *prevent_removal_ptr;
- }
- else if ((!SUPPORT_DISK_LOCKING_MECHANISM) && (!(*prevent_removal_ptr)))
- {
- /*there is no support for disk locking and removal of medium is enabled*/
- /* code to be added here for this condition, if required */
- }
- break;
- case USB_MSC_DEVICE_GET_INFO:
- device_lba_info_ptr = (device_lba_info_struct_t*) size;
-#if RAM_DISK_APP
- device_lba_info_ptr->total_lba_device_supports = TOTAL_LOGICAL_ADDRESS_BLOCKS_NORMAL;
- device_lba_info_ptr->length_of_each_lab_of_device = LENGTH_OF_EACH_LAB;
-#elif SD_CARD_APP
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_BM)
- SD_Card_Info(&device_lba_info_ptr->total_lba_device_supports,
- &device_lba_info_ptr->length_of_each_lab_of_device);
-#elif (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
- device_lba_info_ptr->total_lba_device_supports = card.blockCount;
- device_lba_info_ptr->length_of_each_lab_of_device = card.blockSize;
-#else
- sd_get_block_size(g_sdcard_handle, &device_lba_info_ptr->length_of_each_lab_of_device);
- sd_get_blocks_num(g_sdcard_handle, &device_lba_info_ptr->total_lba_device_supports);
-#endif
-#endif
- device_lba_info_ptr->num_lun_supported = LOGICAL_UNIT_SUPPORTED;
- break;
- default:
- break;
- }
-
- return error;
-}
-
-/******************************************************************************
- *
- * @name TestApp_Init
- *
- * @brief This function is the entry for mouse (or other usage)
- *
- * @param None
- *
- * @return None
- **
- *****************************************************************************/
-
-void APP_init(void)
-{
-#if SD_CARD_APP
-
-#if ((OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_BM) || (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK))
- g_msc_bulk_in_buff = (uint8_t*)g_msc_bulk_in_buff_temp;
- g_msc_bulk_out_buff = (uint8_t*)g_msc_bulk_out_buff_temp;
-#elif (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_MQX)
- g_msc_bulk_in_buff = (uint8_t*)OS_Mem_alloc_uncached_align(MSD_SEND_BUFFER_SIZE, 32);
- g_msc_bulk_out_buff = (uint8_t*)OS_Mem_alloc_uncached_align(MSD_RECV_BUFFER_SIZE * MSD_RECV_BUFFER_NUM, 32);
-#endif
-
-#endif
-
-#if SD_CARD_APP
- USB_PRINTF("Please insert SD card\n");
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_BM || OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_SDK)
-#if USE_SDHC_PROTOCOL
- sdhc_detect_io_init();
-#endif
- while (!sdhc_detect())
- {
- ;
- } /* SD Card inserted */
- if(!SD_Init()) return; /* Initialize SD_CARD and SPI Interface */
-#else
- g_sdcard_handle = sd_init();
-
-#endif
- USB_PRINTF("\nSD card inserted!\n");
-
-#endif
- OS_Mem_zero(&g_disk, sizeof(disk_struct_t));
-
- OS_Mem_zero(&g_msd_config, sizeof(msc_config_struct_t));
-
- msc_application_callback.callback = USB_App_Device_Callback;
- msc_application_callback.arg = &g_disk.app_handle;
-
- /* Register the callbacks to lower layers */
- g_msd_config.msc_application_callback = msc_application_callback;
- g_msd_config.vendor_req_callback = vend_req_callback;
- g_msd_config.class_specific_callback.callback = USB_App_Class_Callback;
- g_msd_config.class_specific_callback.arg = &g_disk.app_handle;
- g_msd_config.desc_callback_ptr = &desc_callback;
-
- g_disk.speed = USB_SPEED_FULL;
- /* Finally, Initialize the device and USB Stack layers*/
- USB_Class_MSC_Init(CONTROLLER_ID, &g_msd_config, &g_disk.app_handle);
-
-#if SD_CARD_APP
- write_buffer_msg_handler = OS_MsgQ_create((MSD_RECV_BUFFER_NUM + 1), 1); //msg_size = 4Bytes
- for (int i = 0; i < MSD_RECV_BUFFER_NUM; ++i)
- {
- uint32_t address = (uint32_t)(&g_msc_bulk_out_buff[i * MSD_RECV_BUFFER_SIZE]);
- OS_MsgQ_send(write_buffer_msg_handler, (void*)(&address), 0);
- }
-#endif
-}
-
-void APP_task()
-{
- if (g_disk.read_write_error)
- {
- return;
- }
- Disk_App();
-}
-
-#if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_MQX)
-/*FUNCTION*----------------------------------------------------------------
- *
- * Function Name : Main_Task
- * Returned Value : None
- * Comments :
- * First function called. Calls Test_App
- * callback functions.
- *
- *END*--------------------------------------------------------------------*/
-void Main_Task
-(
- uint32_t param
- )
-{
- UNUSED_ARGUMENT (param)
- APP_init();
-#if MUTILE_BUFFER
- /* write sdhc task */
- sdhc_mutex = OS_Mutex_create();
- write_msg_handler = OS_MsgQ_create((MSD_RECV_BUFFER_NUM), 3);/* msg_size = 12Bytes */
- OS_Task_create(write_task, NULL, 8L, 2000L, "write_task", NULL);
-#endif
-}
-#endif
-
-/* EOF */
+/**HEADER********************************************************************
+ *
+ * Copyright (c) 2008, 2013 - 2014 Freescale Semiconductor;
+ * All Rights Reserved
+ *
+ * Copyright (c) 1989-2008 ARC International;
+ * All Rights Reserved
+ *
+ ***************************************************************************
+ *
+ * THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY EXPRESSED OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL FREESCALE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ **************************************************************************
+ *
+ * $FileName: disk.c$
+ * $Version :
+ * $Date :
+ *
+ * Comments:
+ *
+ * @brief RAM Disk has been emulated via this Mass Storage Demo
+ *****************************************************************************/
+
+/******************************************************************************
+ * Includes
+ *****************************************************************************/
+#include "usb_device_config.h"
+#include "usb.h"
+#include "usb_device_stack_interface.h"
+#include "disk.h"
+#include "adapter_cfg.h"
+#include "fsl_device_registers.h"
+#include "fsl_clock_manager.h"
+#include "fsl_debug_console.h"
+#include "fsl_port_hal.h"
+
+#if USBCFG_DEV_COMPOSITE
+#error This application requires USBCFG_DEV_COMPOSITE defined zero in usb_device_config.h. Please recompile usbd with this option.
+#endif
+
+#if !USBCFG_DEV_MSC
+#error This application requires USBCFG_DEV_MSC defined none zero in usb_device_config.h. Please recompile usbd with this option.
+#endif
+
+#if HIGH_SPEED
+
+#if !USBCFG_DEV_EHCI
+#error This application requires USBCFG_DEV_EHCI defined none zero in usb_device_config.h. Please recompile usbd with this option.
+#endif
+
+#endif
+
+/****************************************************************************
+ * Global Variables
+ ****************************************************************************/
+/* Add all the variables needed for disk.c to this structure */
+extern usb_desc_request_notify_struct_t desc_callback;
+usb_application_callback_struct_t msc_application_callback;
+usb_vendor_req_callback_struct_t vend_req_callback;
+usb_class_specific_callback_struct_t class_specific_callback;
+
+msc_config_struct_t g_msd_config;
+disk_struct_t g_disk;
+
+/*****************************************************************************
+ * Local Types - None
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Local Functions Prototypes
+ *****************************************************************************/
+void USB_App_Device_Callback(uint8_t event_type, void* val, void* arg);
+uint8_t USB_App_Class_Callback
+(uint8_t event_type,
+ uint16_t value,
+ uint8_t ** data,
+ uint32_t* size,
+ void* arg
+ );
+
+/*****************************************************************************
+ * Local Variables
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Local Functions
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * @name USB_App_Device_Callback
+ *
+ * @brief This function handles the callback
+ *
+ * @param pointer :
+ * @param event_type : value of the event
+ * @param val : gives the configuration value
+ *
+ * @return None
+ *
+ *****************************************************************************/
+void USB_App_Device_Callback(uint8_t event_type, void* val, void* arg)
+{
+ if (event_type == USB_DEV_EVENT_BUS_RESET)
+ {
+ g_disk.start_app = FALSE;
+ if (USB_OK == USB_Class_MSC_Get_Speed(g_disk.app_handle, &g_disk.speed))
+ {
+ USB_Desc_Set_Speed(g_disk.app_handle, g_disk.speed);
+ }
+ }
+ else if (event_type == USB_DEV_EVENT_ENUM_COMPLETE)
+ {
+ g_disk.start_app = TRUE;
+ }
+ else if (event_type == USB_DEV_EVENT_ERROR)
+ {
+ /* add user code for error handling */
+ }
+ else if (event_type == USB_MSC_DEVICE_GET_SEND_BUFF_INFO)
+ {
+ if (NULL != val)
+ {
+ *((uint32_t *)val) = (uint32_t)DISK_SIZE_NORMAL;
+ }
+ }
+ else if (event_type == USB_MSC_DEVICE_GET_RECV_BUFF_INFO)
+ {
+ if (NULL != val)
+ {
+ *((uint32_t *)val) = (uint32_t)DISK_SIZE_NORMAL;
+ }
+ }
+
+ return;
+}
+
+/******************************************************************************
+ *
+ * @name USB_App_Class_Callback
+ *
+ * @brief This function handles the callback
+ *
+ * @param pointer :
+ * @param event_type : value of the event
+ * @param val : gives the configuration value
+ *
+ * @return None
+ *
+ *****************************************************************************/
+uint8_t USB_App_Class_Callback
+(uint8_t event_type,
+ uint16_t value,
+ uint8_t ** data,
+ uint32_t* size,
+ void* arg
+)
+{
+ lba_app_struct_t* lba_data_ptr;
+ uint8_t * prevent_removal_ptr;
+ device_lba_info_struct_t* device_lba_info_ptr;
+ uint8_t error = USB_OK;
+
+ if (g_disk.read_write_error)
+ {
+ return USBERR_ERROR;
+ }
+
+ switch(event_type)
+ {
+ case USB_DEV_EVENT_DATA_RECEIVED:
+ /* Add User defined code -- if required*/
+ lba_data_ptr = (lba_app_struct_t*) size;
+ break;
+ case USB_DEV_EVENT_SEND_COMPLETE:
+ /* Add User defined code -- if required*/
+ lba_data_ptr = (lba_app_struct_t*) size;
+ if (lba_data_ptr->size != 0)
+ {
+ /* read data from mass storage device to driver buffer */
+ if(data != NULL)
+ {
+ *data = g_disk.storage_disk + lba_data_ptr->offset;
+ }
+ }
+ break;
+ case USB_MSC_START_STOP_EJECT_MEDIA:
+ /* Code to be added by user for starting, stopping or
+ ejecting the disk drive. e.g. starting/stopping the motor in
+ case of CD/DVD*/
+ break;
+ case USB_MSC_DEVICE_READ_REQUEST:
+ lba_data_ptr = (lba_app_struct_t*) size;
+
+ if(data != NULL)
+ {
+ *data = g_disk.storage_disk + lba_data_ptr->offset;
+ }
+ break;
+ case USB_MSC_DEVICE_WRITE_REQUEST:
+ lba_data_ptr = (lba_app_struct_t*) size;
+ if(data != NULL)
+ {
+ *data = g_disk.storage_disk + lba_data_ptr->offset;
+ }
+ break;
+ case USB_MSC_DEVICE_FORMAT_COMPLETE:
+ break;
+ case USB_MSC_DEVICE_REMOVAL_REQUEST:
+ prevent_removal_ptr = (uint8_t *) size;
+ if (SUPPORT_DISK_LOCKING_MECHANISM)
+ {
+ g_disk.disk_lock = *prevent_removal_ptr;
+ }
+ else if ((!SUPPORT_DISK_LOCKING_MECHANISM) && (!(*prevent_removal_ptr)))
+ {
+ /*there is no support for disk locking and removal of medium is enabled*/
+ /* code to be added here for this condition, if required */
+ }
+ break;
+ case USB_MSC_DEVICE_GET_INFO:
+ device_lba_info_ptr = (device_lba_info_struct_t*) size;
+ device_lba_info_ptr->total_lba_device_supports = TOTAL_LOGICAL_ADDRESS_BLOCKS_NORMAL;
+ device_lba_info_ptr->length_of_each_lab_of_device = LENGTH_OF_EACH_LAB;
+ device_lba_info_ptr->num_lun_supported = LOGICAL_UNIT_SUPPORTED;
+ break;
+ default:
+ break;
+ }
+
+ return error;
+}
+
+/******************************************************************************
+ *
+ * @name disk_init
+ *
+ * @brief This function is the entry for mouse (or other usage)
+ *
+ * @param None
+ *
+ * @return None
+ **
+ *****************************************************************************/
+
+void disk_init(uint8_t *mem)
+{
+ OS_Mem_zero(&g_disk, sizeof(disk_struct_t));
+
+ OS_Mem_zero(&g_msd_config, sizeof(msc_config_struct_t));
+
+ msc_application_callback.callback = USB_App_Device_Callback;
+ msc_application_callback.arg = &g_disk.app_handle;
+
+ /* Register the callbacks to lower layers */
+ g_msd_config.msc_application_callback = msc_application_callback;
+ g_msd_config.vendor_req_callback = vend_req_callback;
+ g_msd_config.class_specific_callback.callback = USB_App_Class_Callback;
+ g_msd_config.class_specific_callback.arg = &g_disk.app_handle;
+ g_msd_config.desc_callback_ptr = &desc_callback;
+
+ g_disk.speed = USB_SPEED_FULL;
+ g_disk.storage_disk = mem;
+ /* Finally, Initialize the device and USB Stack layers*/
+ USB_Class_MSC_Init(CONTROLLER_ID, &g_msd_config, &g_disk.app_handle);
+}
+
+/* vim: set expandtab ts=4 sw=4: */