diff --git a/bsp/src/OPLAYER/OPLAYER.pro b/bsp/src/OPLAYER/OPLAYER.pro new file mode 100644 --- /dev/null +++ b/bsp/src/OPLAYER/OPLAYER.pro @@ -0,0 +1,18 @@ +TEMPLATE = lib + +TARGET=bsp +OBJECTS_DIR = obj + +BSP = OPLAYER + +UCMODEL=stm32f4 + +SOURCES += bsp.c + +HEADERS += bsp.h + + +BSPFILE = bsp.pri + + + diff --git a/bsp/src/OPLAYER/bsp.c b/bsp/src/OPLAYER/bsp.c new file mode 100644 --- /dev/null +++ b/bsp/src/OPLAYER/bsp.c @@ -0,0 +1,423 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2011, Alexis Jeandet +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@gmail.com +-------------------------------------------------------------------------------*/ +#include "bsp.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +uint32_t OSC0 =8000000; +uint32_t INTOSC =16000000; +uint32_t RTCOSC =32768; +uint32_t currentCpuFreq=0; +extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; + +LCD_IF_t lcdIF0={ + .init = &bsp_FSMC_init, + .writereg = &bsp_lcd0_write_reg, + .readreg = &bsp_lcd0_read_reg, + .writeGRAM = &bsp_lcd0_writeGRAM, + .readGRAM = &bsp_lcd0_readGRAM +}; + +LCD_t lcd0={ + .interface = &lcdIF0, + .init = &ili9328init, + .paint = &ili9328paint, + .paintText = &ili9328paintText, + .paintFilRect = &ili9328paintFilRect, + .refreshenable = &ili9328refreshenable, + .width= 240, + .height = 320 +}; + +terminal_t terminal0; + +volatile int8_t* lcd0_CMD=(volatile int8_t*) 0x60000000; +volatile int8_t* lcd0_DATA=(volatile int8_t*)(0x61FFFFF0); + +float VREF0 =(float)3.3; +volatile vs10XXDev audioCodec0; + +int bsp_init() +{ + int i=0; + for(i=0;i<__MAX_OPENED_FILES__;i++) + { + __opnfiles__[i] = NULL; + } + bsp_GPIO_init(); + bsp_uart_init(); + bsp_iic_init(); + bsp_FSMC_init(); + bsp_GTerm_init(); + bsp_spi_init(); + bsp_SD_init(); + bsp_Audio_init(); + printf("\r=====================\n\r"); + printf( "=====================\n\r"); + printf(BSP); + printf(" initialised\n\r"); + printf( "=====================\n\r"); + return 1; +} + +void bsp_GPIO_init() +{ + gpio_t GPIO_Out_init_List[]={LED1,LED2,LCD_RESET,LCD_BACKL,VS1053xCS,VS1053xDCS,VS1053xRESET,SDCARD2CS}; + for(int i=0;i<8;i++) + { + gpio_t GPIO_init = gpioopen(GPIO_Out_init_List[i]); + GPIO_init |= gpiohighspeed | gpiooutdir | gpiopushpulltype; + gpiosetconfig(&GPIO_init); + } + gpio_t GPIO_In_init_List[]={VS1053DREQ,SDCARD2CD}; + for(int i=0;i<2;i++) + { + gpio_t GPIO_init = gpioopen(GPIO_In_init_List[i]); + GPIO_init |= gpiohighspeed | gpioindir; + gpiosetconfig(&GPIO_init); + } + gpioclr(VS1053xRESET); + gpioset(VS1053xCS); + gpioset(VS1053xDCS); + gpioset(SDCARD2CS); + gpioclr(LCD_RESET); + gpioclr(LCD_BACKL); +} + +void bsp_uart_init() +{ + +} + +/* +D0 PD14 D1 PD15 D2 PD0 D3 PD1 D4 PE7 +D5 PE8 D6 PE9 D7 PE10 +A20 PE4 = RS FSMC_NE1 PD7 CS FSMC_NWE PD5 W/S +FSMC_NOE PD4 RD +*/ + +int bsp_FSMC_init() +{ +#define GPIOGETPORT(gpio) ((GPIO_TypeDef*)(((((uint32_t)gpio) & (uint32_t)0x0000FF00)*(uint32_t)4) + (uint32_t)GPIOA)) +#define GPIOPORTNUM(gpio) (((uint32_t)(gpio) & (uint32_t)0x0000FF00)>>(uint32_t)8) + + gpio_t LCD_DBxList[]={PD14,PD15,PD0,PD1,PE7,PE8,PE9,PE10\ + ,PD4,PD5,PD7,PE4}; + for(int i=0;i<12;i++) + { + gpio_t LCD_DBx = gpioopen(LCD_DBxList[i]); + LCD_DBx |= gpiohighspeed | gpioaf | gpiopushpulltype | gpionopulltype; + gpiosetconfig(&LCD_DBx); + GPIO_PinAFConfig(GPIOGETPORT(LCD_DBx), (uint8_t)(LCD_DBx & 0xF), GPIO_AF_FSMC); + } + + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; + FSMC_NORSRAMTimingInitTypeDef p; + + /* Enable FSMC clock */ + RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + + /*-- FSMC Configuration ------------------------------------------------------*/ + /*----------------------- SRAM Bank 3 ----------------------------------------*/ + /* FSMC_Bank1_NORSRAM4 configuration */ + //p.FSMC_AddressSetupTime = 5; + //p.FSMC_AddressSetupTime = 1; + p.FSMC_AddressSetupTime = 3; + p.FSMC_AddressHoldTime = 3; + //p.FSMC_DataSetupTime = 9; + //ili9328 -> data setup time > 10ns + p.FSMC_DataSetupTime = 1; + if(getCpuFreq()>100*1000*1000) + p.FSMC_DataSetupTime = 2;// 11; + p.FSMC_BusTurnAroundDuration = 0; + p.FSMC_CLKDivision = 0; + p.FSMC_DataLatency = 0; + //ili9328 -> data hold time > 15ns + if(getCpuFreq()>66*1000*1000) + p.FSMC_DataLatency = 0; + p.FSMC_AccessMode = FSMC_AccessMode_A; + + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); + gpioset(LCD_RESET); + gpioclr(LCD_RESET); + delay_100us(500); + gpioset(LCD_RESET); + delay_100us(500); + lcd0.init(&lcd0); + gpioset(LCD_BACKL); + return 1; +} + +void bsp_spi_init() +{ + gpio_t VSSPI_DBxList[]={VS1053SCK,VS1053MOSI,VS1053MISO}; + for(int i=0;i<3;i++) + { + gpio_t SPI_DBx = gpioopen(VSSPI_DBxList[i]); + SPI_DBx |= gpiohighspeed | gpioaf | gpiopushpulltype | gpionopulltype; + gpiosetconfig(&SPI_DBx); + GPIO_PinAFConfig(GPIOGETPORT(SPI_DBx), (uint8_t)(SPI_DBx & 0xF), GPIO_AF_SPI1); + } + spiopenandconfig(VS1053SPI,spi8bits|spimaster|spimsbfirst,2*1000*1000,VS1053MOSI,VS1053MISO,VS1053SCK,-1); + + gpio_t SDSPI_DBxList[]={SDCARD2SCK,SDCARD2MOSI,SDCARD2MISO}; + for(int i=0;i<3;i++) + { + gpio_t SPI_DBx = gpioopen(SDSPI_DBxList[i]); + SPI_DBx |= gpiohighspeed | gpioaf | gpiopushpulltype | gpionopulltype; + gpiosetconfig(&SPI_DBx); + GPIO_PinAFConfig(GPIOGETPORT(SPI_DBx), (uint8_t)(SPI_DBx & 0xF), GPIO_AF_SPI3); + } + spiopenandconfig(SDCARD2SPI,spi8bits|spimaster|spimsbfirst,400*1000,SDCARD2MOSI,SDCARD2MISO,SDCARD2SCK,-1); + +} + + +void bsp_iic_init() +{ + // i2copenandconfig(i2c2,0,10000,PF0,PF1); +} + + +void bsp_Audio_init() +{ + vs10XXopen(&audioCodec0,VS1053SPI,vs1052setXCS,vs1052setRST,vs1052setXDCS,vs10XXDREQ); +} + +void bsp_SD_init() +{ + sdcardDev sdcard2; + blkdevice sdcard2blkdev; + dikpartition sdcard2Part1; + sdcardspimake(&sdcard2,(UHANDLE)SDCARD2SPI,spigetnc,spiputnc,spisetspeed,spigetspeed); + sdcardspimakeblkdev(&sdcard2blkdev,&sdcard2,bspsdcardselect,bsppowersdcard,bspsdcardpresent,bspsdcardwriteprotected); + sdcard2blkdev.initialize(&sdcard2blkdev); + mbropen(&sdcard2blkdev,&sdcard2Part1,1); +} + +void vs1052setXCS(char val) +{ + gpiosetval(VS1053xCS,(int)val); +} + +void vs1052setXDCS(char val) +{ + gpiosetval(VS1053xDCS,(int)val); +} + +void vs1052setRST(char val) +{ + if(val) + gpioset(VS1053xRESET); + else + gpioclr(VS1053xRESET); +} + +int vs10XXDREQ() +{ + return gpiogetval(VS1053DREQ); +} + + +void bsppowersdcard(char onoff) //always ON +{ + +} + +char bspsdcardpresent() +{ + return gpiogetval(SDCARD2CD); +} + +char bspsdcardwriteprotected() +{ + return 0; +} + +void bspsdcardselect(char YESNO) +{ + if(YESNO) + gpioclr(SDCARD2CS); + else + gpioset(SDCARD2CS); +} + + +void bsp_lcd0_write_reg(uint32_t reg,uint32_t data) +{ + uint8_t* pt8 = (uint8_t*)(void*)® +#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ + *lcd0_CMD=pt8[3]; + *lcd0_CMD=pt8[2]; + pt8 = (uint8_t*)(void*)&data; + *lcd0_DATA=pt8[3]; + *lcd0_DATA=pt8[2]; +#else + *lcd0_CMD=pt8[1]; + *lcd0_CMD=pt8[0]; + pt8 = (uint8_t*)(void*)&data; + *lcd0_DATA=pt8[1]; + *lcd0_DATA=pt8[0]; +#endif + +} + +uint32_t bsp_lcd0_read_reg(uint32_t reg) +{ + uint8_t* pt8 = (uint8_t*)(void*)® + uint32_t DATA=0; +#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ + *lcd0_CMD=pt8[3]; + *lcd0_CMD=pt8[2]; + pt8 = (uint8_t*)(void*)&DATA; + pt8[3]=*lcd0_DATA; + pt8[2]=*lcd0_DATA; +#else + + *lcd0_CMD=pt8[1]; + *lcd0_CMD=pt8[0]; + pt8 = (uint8_t*)(void*)&DATA; + pt8[1]=*lcd0_DATA; + pt8[0]=*lcd0_DATA; +#endif + + return DATA; +} + +void bsp_lcd0_writeGRAM(void* buffer,uint32_t count) +{ + uint32_t reg =ILI9328_REGISTER_WRITEDATATOGRAM; + uint8_t* pt8 = (uint8_t*)(void*)® +#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ + *lcd0_CMD=pt8[3]; + *lcd0_CMD=pt8[2]; + pt8 = (uint8_t*)(void*)buffer; + for(int i=0;i<(int)count;i++) + { + *lcd0_DATA=pt8[(2*i) +1]; + *lcd0_DATA=pt8[2*i]; + } +#else + + *lcd0_CMD=pt8[1]; + *lcd0_CMD=pt8[0]; + pt8 = (uint8_t*)(void*)buffer; + for(int i=0;i<(int)count;i++) + { + + *lcd0_DATA=pt8[(2*i) +1]; + *lcd0_DATA=pt8[2*i]; + } +#endif +} + +void bsp_lcd0_readGRAM(void* buffer,uint32_t count) +{ + uint32_t reg =ILI9328_REGISTER_WRITEDATATOGRAM; + uint8_t* pt8 = (uint8_t*)(void*)® +#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ + *lcd0_CMD=pt8[3]; + *lcd0_CMD=pt8[2]; + pt8 = (uint8_t*)(void*)buffer; + pt8[0] = *lcd0_DATA; + pt8[0] = *lcd0_DATA; + for(int i=0;i<(int)count;i++) + { + pt8[(2*i) +1]=*lcd0_DATA; + pt8[2*i]=*lcd0_DATA; + } +#else + + *lcd0_CMD=pt8[1]; + *lcd0_CMD=pt8[0]; + pt8 = (uint8_t*)(void*)buffer; + pt8[0] = *lcd0_DATA; + pt8[0] = *lcd0_DATA; + for(int i=0;i<(int)count;i++) + { + pt8[(2*i) +1]=*lcd0_DATA; + pt8[2*i]=*lcd0_DATA; + } +#endif +} + +void bsp_GTerm_init() +{ + if(__opnfiles__[1]==NULL) + { + //uart_t* uart1 = (uart_t*)malloc(sizeof(uart_t)); + streamdevice* fd1 = (streamdevice*)malloc(sizeof(streamdevice)); + terminal_init(&terminal0 ,&lcd0,&ComicSansMS_8,fd1); + __opnfiles__[1] = fd1; + } + else + { + + } +} + + + + + + + + + + + + + + + + + diff --git a/bsp/src/OPLAYER/bsp.h b/bsp/src/OPLAYER/bsp.h new file mode 100644 --- /dev/null +++ b/bsp/src/OPLAYER/bsp.h @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2011, Alexis Jeandet +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@gmail.com +-------------------------------------------------------------------------------*/ +#ifndef BSP_H +#define BSP_H +#include +#include +#include +#include +#include +#include +#include +#include + +#define __MAX_OPENED_FILES__ 4 +#define __FS_ROOT_SIZE__ 4 + + +#define LED1 PC15 +#define LED2 PC14 + +#define LCD_RESET PD10 +#define LCD_BACKL PE11 + +#define VS1053SPI spi1 +#define VS1053xCS PA3 +#define VS1053xRESET PA2 +#define VS1053xDCS PA4 +#define VS1053DREQ PA1 +#define VS1053MISO PA6 +#define VS1053MOSI PA7 +#define VS1053SCK PA5 + + + +#define SDCARD2SPI spi3 +#define SDCARD2CS PB8 +#define SDCARD2CD PB9 +#define SDCARD2MISO PB4 +#define SDCARD2MOSI PB5 +#define SDCARD2SCK PB3 + +extern float VREF0; + +extern uint32_t currentCpuFreq; +extern LCD_t lcd0; + +extern volatile vs10XXDev audioCodec0; + +extern int bsp_init(); + +extern void bsp_GPIO_init(); +extern void bsp_uart_init(); +extern void bsp_iic_init(); +extern void bsp_spi_init(); +extern void bsp_SD_init(); +extern void bsp_Audio_init(); +extern void bsp_GTerm_init(); +extern int bsp_FSMC_init(); + +/* VS1053 */ +extern void vs1052setXCS(char val); +extern void vs1052setXDCS(char val); +extern void vs1052setRST(char val); +extern int vs10XXDREQ(); + +/* SD CARD */ +void bsppowersdcard(char onoff); +char bspsdcardpresent(); +void bspsdcardselect(char YESNO); +char bspsdcardwriteprotected(); + + +void bsp_lcd0_write_reg(uint32_t reg,uint32_t data); +uint32_t bsp_lcd0_read_reg(uint32_t reg); +void bsp_lcd0_writeGRAM(void *buffer, uint32_t count); +void bsp_lcd0_readGRAM(void *buffer, uint32_t count); + +#endif + + + + + + + + + + + + + + + + + + + diff --git a/bsp/src/OPLAYER/bsp.pri b/bsp/src/OPLAYER/bsp.pri new file mode 100644 --- /dev/null +++ b/bsp/src/OPLAYER/bsp.pri @@ -0,0 +1,4 @@ +CPU=stm32f4xxxG +DEFINES+=BSP=\\\"OPLAYER\\\" + +UCMODEL=stm32f4 diff --git a/bsp/src/bsp.pro b/bsp/src/bsp.pro --- a/bsp/src/bsp.pro +++ b/bsp/src/bsp.pro @@ -6,7 +6,8 @@ SUBDIRS += STM32F4Discovery \ SOLAR_LFR_PSU \ BEAGLESYNTH \ STM32F4Eval \ - STM32F4Discovery-EXT + STM32F4Discovery-EXT \ + OPLAYER diff --git a/examples/SOLAR_PSU_HELLO/hello.pro b/examples/SOLAR_PSU_HELLO/hello.pro --- a/examples/SOLAR_PSU_HELLO/hello.pro +++ b/examples/SOLAR_PSU_HELLO/hello.pro @@ -3,7 +3,9 @@ CONFIG += cpu UCMODEL=stm32f4 -BSP = BEAGLESYNTH +BSP = OPLAYER + +DEFINES += CPUFREQ=160000000 SOURCES += \ main.c diff --git a/examples/SOLAR_PSU_HELLO/main.c b/examples/SOLAR_PSU_HELLO/main.c --- a/examples/SOLAR_PSU_HELLO/main.c +++ b/examples/SOLAR_PSU_HELLO/main.c @@ -5,17 +5,43 @@ #include #include #include +#include +#include extern streamdevice* __opnfiles__[]; +void randBoxesDemo() +{ + int16_t x,y,w,h,t,r; + x=rand()%240; + y=rand()%320; + w=rand()%(240-x); + if(x>y) + r=(rand()%(y))%(320-y); + else + r=(rand()%(x))%(240-x); + h=rand()%(320-y); + t=rand()%(10); + ili9328paintFilRect(&lcd0,x,y,w,h,rand(),t,rand()); + //ili9328paintFilCirc(&lcd0,x,y,r,rand(),t,rand()); + //delay_100us(10); + //for(volatile int i=0;i<(1024*2);i++); +} + int main() { - while(1) + while(1) { - gpioset(LED3); +// printf("Audio Codec reg0=0x%x\n",vs10XXcmdread(&audioCodec0,0)); + // printf("hello "); + // bsp_lcd0_write_reg(1,0x1234); + // delay_100us(10000); + // randBoxesDemo(); + gpioset(LED1); delay_100us(10000); - gpioclr(LED3); + gpioclr(LED1); delay_100us(10000); + } printf("hello world\n\r"); return 0; @@ -23,20 +49,6 @@ int main() -void USART3_IRQHandler(void) -{ - while(1) - { - for(volatile int i=0;i<1024*2048;i++); - gpioset(PD12); - gpioclr(PD14); - for(volatile int i=0;i<1024*2048;i++); - gpioclr(PD12); - gpioset(PD14); - } -} - - diff --git a/lib/src/common/AUDIO/VS10XX/VS10XX.c b/lib/src/common/AUDIO/VS10XX/VS10XX.c --- a/lib/src/common/AUDIO/VS10XX/VS10XX.c +++ b/lib/src/common/AUDIO/VS10XX/VS10XX.c @@ -19,13 +19,23 @@ #-- Author : Alexis Jeandet #-- Mail : alexis.jeandet@gmail.com #-------------------------------------------------------------------------------*/ -#include "spi.h" -#include "VS10XX.h" +#include +#include +#include //#include -void vs10XXopen(vs10XXDev* codec,spi_t dev){ +void vs10XXopen(vs10XXDev *codec, spi_t dev, void (*setxCS)(char), void (*setxRST)(char), void (*setxDCS)(char), int (*getDREQ)()) +{ codec->SPIdev = dev; - + codec->setxCS = setxCS; + codec->setxDCS = setxDCS; + codec->setxRST = setxRST; + codec->getDREQ = getDREQ; + codec->setxDCS(1); + codec->setxCS(1); + codec->setxRST(0); + delay_100us(2); + codec->setxRST(1); } void vs10XXsoftreset(vs10XXDev* dev) @@ -35,22 +45,28 @@ void vs10XXsoftreset(vs10XXDev* dev) int vs10XXcmdread(vs10XXDev* dev,char address) { - int result; - while(!vs10XXDREQ()); - vs10XXclearXCS(); - spiputw(dev->SPIdev,(3<<8)+address); - result = spigetw(dev->SPIdev); - vs10XXsetXCS(); + int result; + while(!dev->getDREQ()); + dev->setxCS(0); + spiputw(dev->SPIdev,3); + spiputw(dev->SPIdev,address); + result = (0xFF00 & (spigetw(dev->SPIdev)<<8)) + (0xFF & spigetw(dev->SPIdev)); + dev->setxCS(1); return result; } void vs10XXcmdwrite(vs10XXDev* dev,char address,int value) { - while(!vs10XXDREQ()); - vs10XXclearXCS(); - spiputw(dev->SPIdev,(2<<8)+address); + while(!dev->getDREQ()); + dev->setxCS(0); + spiputw(dev->SPIdev,2<<8); + spiputw(dev->SPIdev,address); + spiputw(dev->SPIdev,value>>8); spiputw(dev->SPIdev,value); - vs10XXsetXCS(); + dev->setxCS(1); } + + + diff --git a/lib/src/common/AUDIO/VS10XX/VS10XX.pro b/lib/src/common/AUDIO/VS10XX/VS10XX.pro --- a/lib/src/common/AUDIO/VS10XX/VS10XX.pro +++ b/lib/src/common/AUDIO/VS10XX/VS10XX.pro @@ -6,6 +6,7 @@ SOURCES += VS10XX.c HEADERS += ../../../includes/VS10XX.h +INCLUDEPATH += ../../../includes UCMODEL=stm32f4 diff --git a/lib/src/common/FILE_SYSTEM/SDCARD/sdcard.c b/lib/src/common/FILE_SYSTEM/SDCARD/sdcard.c --- a/lib/src/common/FILE_SYSTEM/SDCARD/sdcard.c +++ b/lib/src/common/FILE_SYSTEM/SDCARD/sdcard.c @@ -21,6 +21,8 @@ -------------------------------------------------------------------------------*/ #include #include +#include +#include int sdcardselect (blkdeviceptr _this); void sdcarddeselect (blkdeviceptr _this); @@ -58,17 +60,17 @@ int sdcardselect (blkdeviceptr _this) /* int sdcardwait_ready (sdcardDev* sdcard) /* 1:OK, 0:Timeout */ { - char d; + char d=0; unsigned int tmr; volatile unsigned int i=0; - for (tmr = 100000; tmr; tmr--) { /* Wait for ready in timeout of 500ms */ + for (tmr = 1000; tmr>0; tmr--) { /* Wait for ready in timeout of 500ms */ sdcard->rcvr_mmc(sdcard->phy,&d, 1); if (d == 0xFF) break; - for(i=0;i<128;i++); + delay_100us(10); } - return tmr ? 1 : 0; + return tmr != 0; } int sdcardrcvr_datablock (sdcardDev* sdcard,char *buff,uint32_t btr) @@ -123,7 +125,7 @@ char sdcardsend_cmd (blkdeviceptr _this, } /* Select the card and wait for ready */ sdcarddeselect(_this); - if (!sdcardselect(_this)) return 0xFF; + if (!sdcardselect(_this)) {printf("Can't select SDCARD\n");return 0xFF;} /* Send a command packet */ buf[0] = 0x40 | cmd; /* Start + Command index */ buf[1] = (char)(arg >> 24); /* Argument[31..24] */ @@ -190,12 +192,18 @@ DSTATUS sdcarddisk_initialize (blkdevice ((sdcardDev*)_this->phy)->setspeed(((sdcardDev*)_this->phy)->phy,350000); if (_this==0) return STA_NOINIT; /* Supports only drive 0 */ - if (((sdcardDev*)_this->phy)->Stat & STA_NODISK) return ((sdcardDev*)_this->phy)->Stat; /* Is card existing in the soket? */ - + /* Is card existing in the soket? */ + if (((sdcardDev*)_this->phy)->Stat & STA_NODISK) + { + printf("No SDCARD\n"); + return ((sdcardDev*)_this->phy)->Stat; + } + printf("SDCARD Detected\n"); for (n = 10; n; n--) ((sdcardDev*)_this->phy)->xmit_mmc(((sdcardDev*)_this->phy)->phy,&dummy, 1); /* Send 80 dummy clocks */ ty = 0; if (sdcardsend_cmd(_this,CMD0, 0) == 1) { /* Put the card SPI/Idle state */ + printf("SDCARD in Idle mode\n"); Timer1 = 1000; /* Initialization timeout = 1 sec */ if (sdcardsend_cmd(_this,CMD8, 0x1AA) == 1) { /* SDv2? */ ((sdcardDev*)_this->phy)->rcvr_mmc(((sdcardDev*)_this->phy)->phy,ocr, 4); @@ -454,7 +462,7 @@ DRESULT sdcarddisk_ioctl (blkdeviceptr _ -void sdcardmake(sdcardDev* sdcard,UHANDLE phy,void (*rcvr_mmc) (UHANDLE,char *,uint32_t),void (*xmit_mmc) (UHANDLE,const char *,uint32_t ),void (*setspeed) (UHANDLE phy,uint32_t speed),uint32_t (*getspeed) (UHANDLE phy)) +void sdcardspimake(sdcardDev* sdcard,UHANDLE phy,void (*rcvr_mmc) (UHANDLE,char *,uint32_t),void (*xmit_mmc) (UHANDLE,const char *,uint32_t ),void (*setspeed) (UHANDLE phy,uint32_t speed),uint32_t (*getspeed) (UHANDLE phy)) { sdcard->phy = phy; sdcard->rcvr_mmc = rcvr_mmc; @@ -463,7 +471,7 @@ void sdcardmake(sdcardDev* sdcard,UHANDL sdcard->getspeed = getspeed; } - void sdcardmakeblkdev(blkdevice* dev,sdcardDev* sdcard, blkdevselect_t select,blkdevpower_t power,blkdevdetect_t detect,blkdevwriteprotected_t writeprotected) + void sdcardspimakeblkdev(blkdevice* dev,sdcardDev* sdcard, blkdevselect_t select,blkdevpower_t power,blkdevdetect_t detect,blkdevwriteprotected_t writeprotected) { dev->phy=sdcard; dev->select=select; diff --git a/lib/src/common/FILE_SYSTEM/SDCARD/sdcard_STM32F4.pro b/lib/src/common/FILE_SYSTEM/SDCARD/sdcard_STM32F4.pro --- a/lib/src/common/FILE_SYSTEM/SDCARD/sdcard_STM32F4.pro +++ b/lib/src/common/FILE_SYSTEM/SDCARD/sdcard_STM32F4.pro @@ -15,3 +15,6 @@ UCMODEL=stm32f4 target.path = $$[QT_INSTALL_LIBS]/$$UCMODEL INSTALLS += target +HEADERS += \ + ../../../includes/sdcard.h + diff --git a/lib/src/common/GRAPHIC/CONTROLERS/ILI9328/ili9328.c b/lib/src/common/GRAPHIC/CONTROLERS/ILI9328/ili9328.c --- a/lib/src/common/GRAPHIC/CONTROLERS/ILI9328/ili9328.c +++ b/lib/src/common/GRAPHIC/CONTROLERS/ILI9328/ili9328.c @@ -33,115 +33,115 @@ #define ilipaintLine(LCD,X,Y,W,buffer,buffsize) \ for(int l=0;l<1;l++)\ - {\ - ili9328setFrame(LCD,X,Y,W,1);\ - int rem=(W)%buffsize;\ - if(rem)LCD->interface->writeGRAM(buffer,rem);\ - for(int i=rem;i<(W);i+=buffsize)\ - {\ - LCD->interface->writeGRAM(buffer,buffsize);\ - }\ +{\ + ili9328setFrame(LCD,X,Y,W,1);\ + int rem=(W)%buffsize;\ + if(rem)LCD->interface->writeGRAM(buffer,rem);\ + for(int i=rem;i<(W);i+=buffsize)\ +{\ + LCD->interface->writeGRAM(buffer,buffsize);\ + }\ } #define ilipaintHLineWithCont(LCD,X,Y,W,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \ for(int l=0;l<1;l++)\ - {\ - ili9328setFrame(LCD,X,Y,W,1);\ - int rem=(ContSz)%buffContsize;\ - if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ - for(int i=rem;i<(ContSz);i+=buffContsize)\ - {\ - LCD->interface->writeGRAM(bufferCont,buffContsize);\ - }\ +{\ + ili9328setFrame(LCD,X,Y,W,1);\ + int rem=(ContSz)%buffContsize;\ + if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ + for(int i=rem;i<(ContSz);i+=buffContsize)\ +{\ + LCD->interface->writeGRAM(bufferCont,buffContsize);\ + }\ if((2*ContSz)interface->writeGRAM(bufferInt,rem);\ - for(int i=rem;i<(W-(2*ContSz));i+=buffIntsize)\ - {\ - LCD->interface->writeGRAM(bufferInt,buffIntsize);\ - }\ +{\ + rem=(W-(2*ContSz))%buffIntsize;\ + if(rem)LCD->interface->writeGRAM(bufferInt,rem);\ + for(int i=rem;i<(W-(2*ContSz));i+=buffIntsize)\ +{\ + LCD->interface->writeGRAM(bufferInt,buffIntsize);\ + }\ }\ rem=(ContSz)%buffContsize;\ if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ for(int i=rem;i<(ContSz);i+=buffContsize)\ - {\ - LCD->interface->writeGRAM(bufferCont,buffContsize);\ +{\ + LCD->interface->writeGRAM(bufferCont,buffContsize);\ }\ - }\ + }\ #define ilipaintVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \ for(int l=0;l<1;l++)\ - {\ - ili9328setFrame(LCD,X,Y,1,H);\ - int rem=(ContSz)%buffContsize;\ - if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ - for(int i=rem;i<(ContSz);i+=buffContsize)\ - {\ - LCD->interface->writeGRAM(bufferCont,buffContsize);\ - }\ +{\ + ili9328setFrame(LCD,X,Y,1,H);\ + int rem=(ContSz)%buffContsize;\ + if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ + for(int i=rem;i<(ContSz);i+=buffContsize)\ +{\ + LCD->interface->writeGRAM(bufferCont,buffContsize);\ + }\ if((2*ContSz)interface->writeGRAM(bufferInt,rem);\ - for(int i=rem;i<(H-(2*ContSz));i+=buffIntsize)\ - {\ - LCD->interface->writeGRAM(bufferInt,buffIntsize);\ - }\ +{\ + rem=(H-(2*ContSz))%buffIntsize;\ + if(rem)LCD->interface->writeGRAM(bufferInt,rem);\ + for(int i=rem;i<(H-(2*ContSz));i+=buffIntsize)\ +{\ + LCD->interface->writeGRAM(bufferInt,buffIntsize);\ + }\ }\ rem=(ContSz)%buffContsize;\ if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ for(int i=rem;i<(ContSz);i+=buffContsize)\ - {\ - LCD->interface->writeGRAM(bufferCont,buffContsize);\ +{\ + LCD->interface->writeGRAM(bufferCont,buffContsize);\ }\ - }\ + }\ #define ilipaintHalfTopVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \ for(int l=0;l<1;l++)\ - {\ - ili9328setFrame(LCD,X,Y,1,H);\ - int rem=(ContSz)%buffContsize;\ - if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ - for(int i=rem;i<(ContSz);i+=buffContsize)\ - {\ - LCD->interface->writeGRAM(bufferCont,buffContsize);\ - }\ +{\ + ili9328setFrame(LCD,X,Y,1,H);\ + int rem=(ContSz)%buffContsize;\ + if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ + for(int i=rem;i<(ContSz);i+=buffContsize)\ +{\ + LCD->interface->writeGRAM(bufferCont,buffContsize);\ + }\ if(ContSzinterface->writeGRAM(bufferInt,rem);\ - for(int i=rem;i<(H-ContSz);i+=buffIntsize)\ - {\ - LCD->interface->writeGRAM(bufferInt,buffIntsize);\ - }\ +{\ + rem=(H-ContSz)%buffIntsize;\ + if(rem)LCD->interface->writeGRAM(bufferInt,rem);\ + for(int i=rem;i<(H-ContSz);i+=buffIntsize)\ +{\ + LCD->interface->writeGRAM(bufferInt,buffIntsize);\ }\ - }\ + }\ + }\ #define ilipaintHalfBottomVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \ for(int l=0;l<1;l++)\ - {\ - ili9328setFrame(LCD,X,Y,1,H);\ +{\ + ili9328setFrame(LCD,X,Y,1,H);\ int rem;\ if(ContSzinterface->writeGRAM(bufferInt,rem);\ - for(int i=rem;i<(H-ContSz);i+=buffIntsize)\ - {\ - LCD->interface->writeGRAM(bufferInt,buffIntsize);\ - }\ +{\ + rem=(H-ContSz)%buffIntsize;\ + if(rem)LCD->interface->writeGRAM(bufferInt,rem);\ + for(int i=rem;i<(H-ContSz);i+=buffIntsize)\ +{\ + LCD->interface->writeGRAM(bufferInt,buffIntsize);\ + }\ }\ rem=(ContSz)%buffContsize;\ if(rem)LCD->interface->writeGRAM(bufferCont,rem);\ for(int i=rem;i<(ContSz);i+=buffContsize)\ - {\ - LCD->interface->writeGRAM(bufferCont,buffContsize);\ +{\ + LCD->interface->writeGRAM(bufferCont,buffContsize);\ }\ - }\ + }\ void ili9328setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress) @@ -376,18 +376,18 @@ int ili9328init(struct LCD_t* LCD) LCD->interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL1, 0x0100); // Driver Output Control Register (R01h) LCD->interface->writereg(ILI9328_REGISTER_LCDDRIVINGCONTROL, 0x0700); // LCD Driving Waveform Control (R02h) LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE, 0x1030); // Entry Mode (R03h) - LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL2, 0x0202); + LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL2, 0x0302); LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL3, 0x0000); LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL4, 0x0000); // Fmark On LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL1, 0x0000); // Power Control 1 (R10h) LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL2, 0x0007); // Power Control 2 (R11h) LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL3, 0x0000); // Power Control 3 (R12h) LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL4, 0x0000); // Power Control 4 (R13h) - delay_100us(10); + delay_100us(1000); LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL1, 0x14B0); // Power Control 1 (R10h) - delay_100us(10); + delay_100us(500); LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL2, 0x0007); // Power Control 2 (R11h) - delay_100us(10); + delay_100us(500); LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL3, 0x008E); // Power Control 3 (R12h) LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL4, 0x0C00); // Power Control 4 (R13h) LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL7, 0x0015); // NVM read data 2 (R29h) @@ -403,16 +403,16 @@ int ili9328init(struct LCD_t* LCD) LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL9, 0x0203); // Gamma Control 9 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL10, 0x0403); // Gamma Control 10 LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION, 0x0000); // Window Horizontal RAM Address Start (R50h) - LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION, 240 - 1); // Window Horizontal RAM Address End (R51h) + LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION, LCD->width - 1); // Window Horizontal RAM Address End (R51h) LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION, 0X0000); // Window Vertical RAM Address Start (R52h) - LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION, 320 - 1); // Window Vertical RAM Address End (R53h) + LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION, LCD->height - 1); // Window Vertical RAM Address End (R53h) LCD->interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL2, 0xa700); // Driver Output Control (R60h) LCD->interface->writereg(ILI9328_REGISTER_BASEIMAGEDISPLAYCONTROL, 0x0003); // Driver Output Control (R61h) - enable VLE LCD->interface->writereg(ILI9328_REGISTER_PANELINTERFACECONTROL1, 0X0010); // Panel Interface Control 1 (R90h) // Display On LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL1, 0x0133); // Display Control (R07h) delay_100us(500); - LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE, 0x0038); + LCD->paintFilRect(LCD,0,0,LCD->width,LCD->height,0,0,0xFFFF); } return 0; } diff --git a/lib/src/includes/VS10XX.h b/lib/src/includes/VS10XX.h --- a/lib/src/includes/VS10XX.h +++ b/lib/src/includes/VS10XX.h @@ -44,11 +44,15 @@ typedef struct vs10XXDev { spi_t SPIdev; + void (*setxCS)(char); + void (*setxRST)(char); + void (*setxDCS)(char); + int (*getDREQ)(); int a; }vs10XXDev; -void vs10XXopen(vs10XXDev* codec,spi_t dev); +void vs10XXopen(vs10XXDev* codec,spi_t dev, void (*setxCS)(char),void (*setxRST)(char),void (*setxDCS)(char),int (*getDREQ)()); void vs10XXsoftreset(vs10XXDev* dev); int vs10XXcmdread(vs10XXDev* dev,char address); void vs10XXcmdwrite(vs10XXDev* dev,char address,int value); diff --git a/lib/src/includes/sdcard.h b/lib/src/includes/sdcard.h --- a/lib/src/includes/sdcard.h +++ b/lib/src/includes/sdcard.h @@ -57,9 +57,9 @@ struct sdcard_str { UHANDLE phy; - void (*rcvr_mmc) (UHANDLE phy,char *buff,uint32_t bc); - void (*xmit_mmc) (UHANDLE phy,const char *buff,uint32_t bc); - void (*setspeed) (UHANDLE phy,uint32_t speed); + int (*rcvr_mmc) (UHANDLE phy,char *buff,uint32_t bc); + int (*xmit_mmc) (UHANDLE phy,const char *buff,uint32_t bc); + int (*setspeed) (UHANDLE phy,uint32_t speed); uint32_t (*getspeed) (UHANDLE phy); DSTATUS Stat; char CardType; diff --git a/lib/src/includes/spi.h b/lib/src/includes/spi.h --- a/lib/src/includes/spi.h +++ b/lib/src/includes/spi.h @@ -117,6 +117,7 @@ extern int spidisable(spi_t spidev); extern int spitransactionfinished(spi_t spidev); extern int spisetconfig(spi_t spidev,uint32_t config,uint32_t speed); extern int spisetspeed(spi_t spidev, uint32_t speed); +extern uint32_t spigetspeed(spi_t spidev); extern int spisetbitorder(spi_t spidev,spibitorder_t order); extern int spisetdatabits(spi_t spidev,spibits_t bitscnt); extern int spisetclkinhlevel(spi_t spidev,spiclkinhlvl_t level); diff --git a/lib/src/stm32f4/GPIO/gpio.c b/lib/src/stm32f4/GPIO/gpio.c --- a/lib/src/stm32f4/GPIO/gpio.c +++ b/lib/src/stm32f4/GPIO/gpio.c @@ -347,7 +347,10 @@ void gpiosetval(gpio_t gpio,int val) } else { - GPIOx->ODR = (val & 1)<<(gpio & 0xFF); + if(val) + GPIOx->BSRRL = 1<<(gpio & 0xFF); + else + GPIOx->BSRRH = 1<<(gpio & 0xFF); } } diff --git a/lib/src/stm32f4/SPI/spi.c b/lib/src/stm32f4/SPI/spi.c --- a/lib/src/stm32f4/SPI/spi.c +++ b/lib/src/stm32f4/SPI/spi.c @@ -239,6 +239,27 @@ int spisetspeed(spi_t spidev, uint32_t s return -1; } +uint32_t spigetspeed(spi_t spidev) +{ + if((spidev<3)&&(spidev>=0)) + { + SPI_TypeDef* _dev_ = _spi_dev_table[(int)spidev]; + uint32_t apbclock = 0x00; + RCC_ClocksTypeDef RCC_ClocksStatus; + RCC_GetClocksFreq(&RCC_ClocksStatus); + if (_dev_ == SPI1) + { + apbclock = RCC_ClocksStatus.PCLK2_Frequency; + } + else + { + apbclock = RCC_ClocksStatus.PCLK1_Frequency; + } + int BR= (_dev_->CR1>>3)&0x7; + return apbclock>>(BR+1); + } + return -1; +} int spisetdatabits(spi_t spidev,spibits_t bitscnt) { diff --git a/mkspecs/common/libuc2libs.conf b/mkspecs/common/libuc2libs.conf --- a/mkspecs/common/libuc2libs.conf +++ b/mkspecs/common/libuc2libs.conf @@ -7,7 +7,7 @@ INCLUDEPATH += $$[QT_INSTALL_HEADERS] \ $$[QT_INSTALL_HEADERS]/$$ARCH -LIBS += -L$$[QT_INSTALL_LIBS]/$$ARCH -lterminal -lCS43L22 -lina226 -lili9328 -lssd2119 -lSTMPE811 -lfonts -lsdcard -lfat32 -lmbr -luart -li2c -lgpio -lspi -lcpu -lcore -lm +LIBS += -L$$[QT_INSTALL_LIBS]/$$ARCH -lterminal -lCS43L22 -lina226 -lili9328 -lssd2119 -lSTMPE811 -lvs10XX -lfonts -lsdcard -lfat32 -lmbr -luart -li2c -lgpio -lspi -lcpu -lcore -lm