Files
FireAlarmCtrlCn/FW/Core/my_src/file_cache.c
2026-04-06 19:02:09 +08:00

406 lines
9.5 KiB
C

#include "file_cache.h"
#include "sdram_addr_map.h"
#include "lcd_base_display.h"
static uint32_t const sdram_cache_buffer_address = SDRAM_BUF_CACHE_ADDRESS;
uint8_t sector[512];
uint32_t BytesRead;
unsigned int load_file_to_sdramcache(const TCHAR* path, unsigned int cache_buffer_address, int *pState)
{
uint32_t index = 0, file_size = 0, size = 0, i1 = 0;
uint32_t BmpAddress;
uint32_t Address = cache_buffer_address;
FIL F1;
if(pState != 0)return 0;
if(f_open (&F1, path, FA_READ)){
/* Set the Text Color */
set_font_color(0xFFFF0000, 0xFFFFFFFF);
*pState = -1;
return 0;
}
file_size = F1.obj.objsize;
size = file_size;
if(0 == size){
*pState = -2;
return 0;
}
do{
//256*2
if (size < 512){
i1 = size;
}else{
i1 = 512;//256*2
}
size -= i1;
f_read (&F1, sector, i1, &BytesRead);
for (index = 0; index < i1; index++){
*(__IO uint8_t*) (Address) = *(__IO uint8_t *)BmpAddress;
BmpAddress++;
Address++;
}
BmpAddress = (uint32_t)sector;
}while (size > 0);
f_close (&F1);
*pState =0;
return file_size;
}
void load_bmpfile_to_sdramcache(const TCHAR* path,uint32_t cache_buffer_address)
{
uint32_t index = 0, size = 0, i1 = 0;
uint32_t BmpAddress;
uint32_t Address = cache_buffer_address;
FIL F1;
if(f_open (&F1, path, FA_READ))
{
set_font_color(0xFFFF0000, 0xFFFFFFFF);
LCD_ShowString(20,360,400,24,24,"File type or name not supported!");
while(1);
}
f_read (&F1, sector, 32, &BytesRead);
BmpAddress = (uint32_t)sector;
/* Read bitmap size */
size = *(uint16_t *) (BmpAddress + 2);
size |= (*(uint16_t *) (BmpAddress + 4)) << 16;
/* Get bitmap data address offset */
index = *(uint16_t *) (BmpAddress + 10);
index |= (*(uint16_t *) (BmpAddress + 12)) << 16;
f_close (&F1);
f_open (&F1, path, FA_READ);
do
{
if (size < 512)//256*2
{
i1 = size;
}
else
{
i1 = 512;//256*2
}
size -= i1;
f_read (&F1, sector, i1, &BytesRead);
for (index = 0; index < i1; index++)
{
*(__IO uint8_t*) (Address) = *(__IO uint8_t *)BmpAddress;
BmpAddress++;
Address++;
}
BmpAddress = (uint32_t)sector;
}
while (size > 0);
f_close (&F1);
}
void load_bmpfile_sdramcache_to_sdramaddress(uint32_t BmpCacheAddress,Bmp_Parameter_TypeDef* bmp_parameter)//24bit bmp
{
uint16_t temp_rg;
uint16_t temp_b;
uint32_t temp;
uint16_t temp_r;
uint16_t temp_g;
uint32_t index = 0, size = 0, width = 0, height = 0, bit_pixel = 0;
uint32_t Address;
uint32_t currentline = 0, linenumber = 0;
uint32_t read_width = 0;
uint32_t index_width = 0;
uint32_t index_height = 0;
uint32_t fifo_32bit = 0;
uint32_t point_32bit_data = 0;
uint32_t bit1_index = 0;
uint32_t bit1_size = 0;
uint32_t bit4_index = 0;
uint32_t bit4_size = 0;
uint32_t Bmp4BitColor = 0;
uint32_t read_width_index = 0;
uint32_t max_value = 0;
uint32_t i = 0;
Address = bmp_parameter->start_address;
/* Read bitmap size */
size = *(__IO uint16_t *) (BmpCacheAddress + 2);
size |= (*(__IO uint16_t *) (BmpCacheAddress + 4)) << 16;
/* Get bitmap data address offset */
index = *(__IO uint16_t *) (BmpCacheAddress + 10);
index |= (*(__IO uint16_t *) (BmpCacheAddress + 12)) << 16;
/* Read bitmap width */
width = *(uint16_t *) (BmpCacheAddress + 18);
width |= (*(uint16_t *) (BmpCacheAddress + 20)) << 16;
/* Read bitmap height */
height = *(uint16_t *) (BmpCacheAddress + 22);
height |= (*(uint16_t *) (BmpCacheAddress + 24)) << 16;
bmp_parameter->pic_width = width;
bmp_parameter->pic_height= height;
/* Read bit/pixel */
bit_pixel = *(uint16_t *) (BmpCacheAddress + 28);
/* compute the real size of the picture (without the header)) */
size = (size - index);
/* bypass the bitmap header */
BmpCacheAddress += index;
//16bit bmp
if(16 == bit_pixel)
{
if(width & 0x01)
{
read_width = width + 1;// 2 byte
}
else
{
read_width = width + 0;
}
size = read_width*height*2;
BmpCacheAddress+=(size-(read_width*2));
for(index_height = 0; index_height < height; index_height++)
{
for(index_width = 0; index_width < width; index_width++)
{
temp = *(__IO uint16_t *)BmpCacheAddress;
temp_r = (temp&0x7C00)>>7;
temp_g = (temp&0x03E0)>>2;
temp_b = (temp&0x001F)<<3;
temp = temp_r;
temp<<=8;
temp|=temp_g;
temp<<=8;
temp|=temp_b;
*(__IO uint32_t*) (Address) = (temp | 0xFF000000);
//jump on point pixel
BmpCacheAddress+=2;
Address+=4;
}
BmpCacheAddress-=((read_width + width)*2);
}
}
//24bit bmp
else if(24 == bit_pixel)
{
if((width * 3) & 0x03)
{
read_width = (((width * 3)>>2) + 1)<<2;// 4 byte
}
else
{
read_width = width * 3;
}
size = read_width*height;
BmpCacheAddress+=(size-read_width);
for(index_height = 0; index_height < height; index_height++)
{
for(index_width = 0; index_width < width; index_width++)
{
temp_b = *(__IO uint8_t *)BmpCacheAddress;
BmpCacheAddress++;
temp_g = *(__IO uint8_t *)BmpCacheAddress;
BmpCacheAddress++;
temp_r = *(__IO uint8_t *)BmpCacheAddress;
BmpCacheAddress++;
temp = temp_r;
temp<<=8;
temp|=temp_g;
temp<<=8;
temp|=temp_b;
*(__IO uint32_t*) (Address) = (temp | 0xFF000000);
//jump on point pixel
Address+=4;
}
BmpCacheAddress-=(read_width + width * 3);
}
}
//4bit bmp
else if(4 == bit_pixel)
{
if(width & 0x07)
{
read_width = (width>>3) + 1;//read length 32bit
}
else
{
read_width = (width>>3) + 0;
}
size = read_width * height * 4;// 4 byte
BmpCacheAddress +=(size - (read_width * 4));//from bottom to top
bit4_size = width * height;//total 4bit size
index_height = height;
read_width_index = read_width;
do
{
point_32bit_data = (*(__IO uint8_t *)BmpCacheAddress);
BmpCacheAddress++;
point_32bit_data = (point_32bit_data<<8) | (*(__IO uint8_t *)BmpCacheAddress);
BmpCacheAddress++;
point_32bit_data = (point_32bit_data<<8) | (*(__IO uint8_t *)BmpCacheAddress);
BmpCacheAddress++;
point_32bit_data = (point_32bit_data<<8) | (*(__IO uint8_t *)BmpCacheAddress);
BmpCacheAddress++;
read_width_index--;
if(0 == read_width_index)
{
max_value = width - ((read_width-1)<<3);
read_width_index = read_width;
index_height--;
BmpCacheAddress -=(read_width * 4 * 2);//read from bottom address to top address
if(0 == index_height)
{
;
}
}
else
{
max_value = 8;
}
for(i = 0;i < max_value;i++)
{
switch((point_32bit_data & 0xF0000000)>>28){
case 0 : *(__IO uint32_t*)(Address) = 0xFF000000;break;
case 1 : *(__IO uint32_t*)(Address) = 0xFF800000;break;
case 2 : *(__IO uint32_t*)(Address) = 0xFF008000;break;
case 3 : *(__IO uint32_t*)(Address) = 0xFF808000;break;
case 4 : *(__IO uint32_t*)(Address) = 0xFF000080;break;
case 5 : *(__IO uint32_t*)(Address) = 0xFF800080;break;
case 6 : *(__IO uint32_t*)(Address) = 0xFF008080;break;
case 7 : *(__IO uint32_t*)(Address) = 0xFF808080;break;
case 8 : *(__IO uint32_t*)(Address) = 0xFFC0C0C0;break;
case 9 : *(__IO uint32_t*)(Address) = 0xFFFF0000;break;
case 10: *(__IO uint32_t*)(Address) = 0xFF00FF00;break;
case 11: *(__IO uint32_t*)(Address) = 0xFFFFFF00;break;
case 12: *(__IO uint32_t*)(Address) = 0xFF0000FF;break;
case 13: *(__IO uint32_t*)(Address) = 0xFFFF00FF;break;
case 14: *(__IO uint32_t*)(Address) = 0xFF00FFFF;break;
case 15: *(__IO uint32_t*)(Address) = 0xFFFFFFFF;break;
default : break;
}
point_32bit_data<<=4;
bit4_index++;
Address+=4;
if(bit4_index == bit4_size)
{
break;
}
}
}while(bit4_index < bit4_size);
}
//1bit bmp
else if(1 == bit_pixel)
{
if(width & 0x1F)
{
read_width = (width>>5) + 1;//read length 32bit
}
else
{
read_width = (width>>5) + 0;
}
size = read_width * height * 4;// 4 byte
BmpCacheAddress +=(size - (read_width * 4));//from bottom to top
bit1_size = width * height;//total bit size
index_height = height;
read_width_index = read_width;
do
{
point_32bit_data = (*(__IO uint8_t *)BmpCacheAddress);
BmpCacheAddress++;
point_32bit_data = (point_32bit_data<<8) | (*(__IO uint8_t *)BmpCacheAddress);
BmpCacheAddress++;
point_32bit_data = (point_32bit_data<<8) | (*(__IO uint8_t *)BmpCacheAddress);
BmpCacheAddress++;
point_32bit_data = (point_32bit_data<<8) | (*(__IO uint8_t *)BmpCacheAddress);
BmpCacheAddress++;
read_width_index--;
if(0 == read_width_index)
{
max_value = width - ((read_width-1)<<5);
read_width_index = read_width;
index_height--;
BmpCacheAddress -=(read_width * 4 * 2);//read from bottom address to top address
if(0 == index_height)
{
;
}
}
else
{
max_value = 32;
}
for(i = 0;i < max_value;i++)
{
fifo_32bit<<=1;
if(point_32bit_data & 0x80000000)
{
fifo_32bit|=0x01;
}
else
{
fifo_32bit&=~0x01;
}
point_32bit_data<<=1;
bit1_index++;
if(!(bit1_index & 0x1f))
{
*(__IO uint32_t*)(Address) = fifo_32bit;
Address+=4;
}
else if(bit1_index == bit1_size)
{
fifo_32bit<<=(32-(bit1_index & 0x1F));
*(__IO uint32_t*)(Address) = fifo_32bit;
Address+=4;
break;
}
}
}while(bit1_index < bit1_size);
}
}
void load_bmpfile_to_sdram(Bmp_Parameter_TypeDef* BmpFileParameter)
{
load_bmpfile_to_sdramcache((const char *)BmpFileParameter->name_str,sdram_cache_buffer_address);
load_bmpfile_sdramcache_to_sdramaddress(sdram_cache_buffer_address,BmpFileParameter);
}