From f3bfd267193e8c05a545b47a89bdbf8126eb706c Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 22 Nov 2012 18:21:29 +0000 Subject: [PATCH] Added flash_interface.c --- .../flashlib_user/flash_interface.c | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 module_usb_audio/flashlib_user/flash_interface.c diff --git a/module_usb_audio/flashlib_user/flash_interface.c b/module_usb_audio/flashlib_user/flash_interface.c new file mode 100644 index 00000000..b5d3a8d3 --- /dev/null +++ b/module_usb_audio/flashlib_user/flash_interface.c @@ -0,0 +1,85 @@ +#include "devicedefines.h" + +#ifdef DFU + +#include +#include +#include +#include + +#define settw(a,b) {__asm__ __volatile__("settw res[%0], %1": : "r" (a) , "r" (b));} +#define setc(a,b) {__asm__ __volatile__("setc res[%0], %1": : "r" (a) , "r" (b));} +#define setclk(a,b) {__asm__ __volatile__("setclk res[%0], %1": : "r" (a) , "r" (b));} +#define portin(a,b) {__asm__ __volatile__("in %0, res[%1]": "=r" (b) : "r" (a));} +#define portout(a,b) {__asm__ __volatile__("out res[%0], %1": : "r" (a) , "r" (b));} + +#ifdef DFU_FLASH_DEVICE +#warning Using custom flash spec +fl_DeviceSpec flash_devices[] = {DFU_FLASH_DEVICE}; +#endif + +fl_PortHolderStruct p_flash = +{ + XS1_PORT_1A, + XS1_PORT_1B, + XS1_PORT_1C, + XS1_PORT_1D, + XS1_CLKBLK_1 +}; + +int flash_cmd_enable_ports() +{ + int result = 0; + setc(p_flash.spiMISO, XS1_SETC_INUSE_OFF); + setc(p_flash.spiCLK, XS1_SETC_INUSE_OFF); + setc(p_flash.spiMOSI, XS1_SETC_INUSE_OFF); + setc(p_flash.spiSS, XS1_SETC_INUSE_OFF); + setc(p_flash.spiClkblk, XS1_SETC_INUSE_OFF); + + + setc(p_flash.spiMISO, XS1_SETC_INUSE_ON); + setc(p_flash.spiCLK, XS1_SETC_INUSE_ON); + setc(p_flash.spiMOSI, XS1_SETC_INUSE_ON); + setc(p_flash.spiSS, XS1_SETC_INUSE_ON); + setc(p_flash.spiClkblk, XS1_SETC_INUSE_ON); + setc(p_flash.spiClkblk, XS1_SETC_INUSE_ON); + + setclk(p_flash.spiMISO, XS1_CLKBLK_REF); + setclk(p_flash.spiCLK, XS1_CLKBLK_REF); + setclk(p_flash.spiMOSI, XS1_CLKBLK_REF); + setclk(p_flash.spiSS, XS1_CLKBLK_REF); + + setc(p_flash.spiMISO, XS1_SETC_BUF_BUFFERS); + setc(p_flash.spiMOSI, XS1_SETC_BUF_BUFFERS); + + settw(p_flash.spiMISO, 8); + settw(p_flash.spiMOSI, 8); + +#ifdef DFU_FLASH_DEVICE + result = fl_connectToDevice(&p_flash, flash_devices, 1); +#else + /* Use default flash list */ + result = fl_connect(&p_flash); +#endif + if (!result) + { + return 1; + } + else + { + return 0; + } +} + +int flash_cmd_disable_ports() +{ + fl_disconnect(); + + setc(p_flash.spiMISO, XS1_SETC_INUSE_OFF); + setc(p_flash.spiCLK, XS1_SETC_INUSE_OFF); + setc(p_flash.spiMOSI, XS1_SETC_INUSE_OFF); + setc(p_flash.spiSS, XS1_SETC_INUSE_OFF); + + return 1; +} +#endif