teste

Dependencies:   mbed BSP_DISCO_F746NG FatFS

Revision:
0:020195991898
Child:
1:28e2f24b11b3
diff -r 000000000000 -r 020195991898 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Feb 03 14:39:39 2018 +0000
@@ -0,0 +1,200 @@
+#include "mbed.h"
+#define USE_STM32746G_DISCOVERY
+#include "stm32f7xx_hal.h"
+#include "stm32746g_discovery.h"
+#include "stm32746g_discovery_sd.h"
+#include "string.h"
+#include "stm32746g_discovery_lcd.h"
+#include "ff_gen_drv.h"
+#include "sd_diskio.h"
+
+#define FRAME_BUFFER    0xC0000000
+#define SD_IN_BUFFER    0xC0140000
+#define SD_OUT_BUFFER   0xC0280000
+
+FATFS SDFatFs;  
+FIL MyFile;  
+
+
+ 
+
+static void LCD_LL_ConvertFrameToARGB8888(void *pSrc, void *pDst);
+static void LCD_LL_ConvertFrameToRGB888(void *pSrc, void *pDst);
+extern SD_HandleTypeDef uSdHandle;
+DMA2D_HandleTypeDef hdma2d_disco;
+
+Serial pc(USBTX, USBRX);
+uint32_t i = 0, image_width = 0, image_height = 0;
+const char image_header[] = "P6\n# Generated by STM32\n272 480\n255\n";
+
+char SDPath[4];
+char text [40];
+char c;
+
+int main(void)
+{
+    FRESULT res;
+    uint32_t  bytesread;
+    uint32_t line_cnt=0;
+    pc.baud(115200);
+
+    BSP_LCD_Init();
+    BSP_LCD_DisplayOff();
+    BSP_LCD_LayerDefaultInit(0, FRAME_BUFFER);
+    BSP_LCD_SelectLayer(0);
+    BSP_LCD_DisplayOn();
+
+    FATFS_LinkDriver(&SD_Driver, SDPath);
+    
+    res = f_mount(&SDFatFs, (TCHAR const*)SDPath, 0);
+    if(res!= FR_OK)
+        pc.printf("Failed to mount SD\n");
+        
+    res = f_open(&MyFile, "image.ppm",  FA_READ);
+    if(res!= FR_OK)
+        pc.printf("Failed to open file\n");
+        
+    while(1) {
+        
+        res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
+        if (c!='#')
+            line_cnt++;
+        if(line_cnt==2) {
+            text[0] = c;
+            res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
+            i = 1;
+            while(c!=' ') {
+                text[i]=c;
+                res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
+                i++;
+            }
+            text[i]=0;
+            image_width = atoi(text);
+            res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
+            i = 0;
+            while(c!='\n') {
+                text[i]=c;
+                res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
+                i++;
+            }
+            text[i]=0;
+            image_height = atoi(text);
+        } else {
+            while(c!='\n')
+                res = f_read(&MyFile, &c, 1, (UINT*)&bytesread);
+        }
+        if(line_cnt == 3)
+            break;
+
+    }
+    pc.printf("w = %d \n",image_width);
+    pc.printf("h = %d \n",image_height);
+    
+    if(image_width != 480 || image_height != 272)
+        pc.printf("Image size should be 272x480");
+    
+    for(i = 0; i < image_width*image_width*3; i = i + 512) {
+        res = f_read(&MyFile, (void *)(SD_IN_BUFFER+i) , 512, (UINT*)&bytesread);
+    }
+    f_close(&MyFile);
+    
+    LCD_LL_ConvertFrameToARGB8888((uint32_t *)(SD_IN_BUFFER), (uint32_t *)(FRAME_BUFFER));
+    
+
+    LCD_LL_ConvertFrameToRGB888((uint32_t *)(FRAME_BUFFER), (uint32_t *)(SD_OUT_BUFFER));
+    
+    res = f_open(&MyFile, "image_ou.ppm",   FA_CREATE_ALWAYS | FA_WRITE);
+    if(res!= FR_OK)
+        pc.printf("Failed to open file\n");
+
+
+    res = f_write(&MyFile, image_header, 15, &bytesread);
+    if(res!= FR_OK)
+        pc.printf("Failed to write file 1\n");
+        
+    for(i = 0; i < 480*272*3; i = i + 512) {
+        res = f_write(&MyFile, (uint8_t *)(SD_OUT_BUFFER+i), 512, &bytesread);
+        if(res!= FR_OK)
+            pc.printf("Failed to write file\n");
+    }
+    f_close(&MyFile);
+    FATFS_UnLinkDriver(SDPath);
+
+    while (1) {
+    }
+}
+extern "C" {
+    void BSP_SDMMC_IRQHandler(void)
+    {
+        HAL_SD_IRQHandler(&uSdHandle);
+    }
+    void BSP_SDMMC_DMA_Tx_IRQHandler(void)
+    {
+        HAL_DMA_IRQHandler(uSdHandle.hdmatx);
+    }
+    void BSP_SDMMC_DMA_Rx_IRQHandler(void)
+    {
+        HAL_DMA_IRQHandler(uSdHandle.hdmarx);
+    }
+    static void LCD_LL_ConvertFrameToARGB8888(void *pSrc, void *pDst)
+    {
+        /* Enable DMA2D clock */
+        __HAL_RCC_DMA2D_CLK_ENABLE();
+
+        /* Configure the DMA2D Mode, Color Mode and output offset */
+        hdma2d_disco.Init.Mode         = DMA2D_M2M_PFC;
+        hdma2d_disco.Init.ColorMode    = DMA2D_ARGB8888;
+        hdma2d_disco.Init.OutputOffset = 0;
+
+        /* Foreground Configuration */
+        hdma2d_disco.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+        hdma2d_disco.LayerCfg[1].InputAlpha = 0xFF;
+        hdma2d_disco.LayerCfg[1].InputColorMode = CM_RGB888;
+        hdma2d_disco.LayerCfg[1].InputOffset = 0;
+
+        hdma2d_disco.Instance = DMA2D;
+
+        /* DMA2D Initialization */
+        if(HAL_DMA2D_Init(&hdma2d_disco) == HAL_OK) {
+            if(HAL_DMA2D_ConfigLayer(&hdma2d_disco, 1) == HAL_OK) {
+                if (HAL_DMA2D_Start(&hdma2d_disco, (uint32_t)pSrc, (uint32_t)pDst, 480, 272) == HAL_OK) {
+                    /* Polling For DMA transfer */
+                    HAL_DMA2D_PollForTransfer(&hdma2d_disco, 10);
+                }
+            }
+        } else {
+
+        }
+    }
+    static void LCD_LL_ConvertFrameToRGB888(void *pSrc, void *pDst)
+    {
+        /* Enable DMA2D clock */
+        __HAL_RCC_DMA2D_CLK_ENABLE();
+
+        /* Configure the DMA2D Mode, Color Mode and output offset */
+        hdma2d_disco.Init.Mode         = DMA2D_M2M_PFC;
+        hdma2d_disco.Init.ColorMode    = DMA2D_RGB888;
+        hdma2d_disco.Init.OutputOffset = 0;
+
+        /* Foreground Configuration */
+        hdma2d_disco.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+        hdma2d_disco.LayerCfg[1].InputAlpha = 0xFF;
+        hdma2d_disco.LayerCfg[1].InputColorMode = CM_ARGB8888;
+        hdma2d_disco.LayerCfg[1].InputOffset = 0;
+
+        hdma2d_disco.Instance = DMA2D;
+
+        /* DMA2D Initialization */
+        if(HAL_DMA2D_Init(&hdma2d_disco) == HAL_OK) {
+            if(HAL_DMA2D_ConfigLayer(&hdma2d_disco, 1) == HAL_OK) {
+                if (HAL_DMA2D_Start(&hdma2d_disco, (uint32_t)pSrc, (uint32_t)pDst, 480, 272) == HAL_OK) {
+                    /* Polling For DMA transfer */
+                    HAL_DMA2D_PollForTransfer(&hdma2d_disco, 10);
+                }
+            }
+        } else {
+
+        }
+    }
+
+}
\ No newline at end of file