x
Fork of FT810 by
Embed:
(wiki syntax)
Show/hide line numbers
FT_GPU_Hal.cpp
00001 /* mbed Library for FTDI FT813 Enbedded Video Engine "EVE" 00002 * based on Original Code Sample from FTDI 00003 * ported to mbed by Peter Drescher, DC2PD 2014 00004 * Released under the MIT License: http://mbed.org/license/mit 00005 * 19.09.14 changed to shorter function names 00006 * FTDI was using very long names. 00007 * Ft_App_Flush_Co_Buffer -> Flush_Co_Buffer ... */ 00008 00009 #include "FT_Platform.h" 00010 #include "mbed.h" 00011 #include "FT_LCD_Type.h" 00012 //Serial pc(USBTX, USBRX); 00013 00014 #define SPI_SPEED_START 10000000 00015 #define SPI_SPEED_AFTER 27000000 00016 00017 FT813::FT813(PinName mosi, 00018 PinName miso, 00019 PinName sck, 00020 PinName ss, 00021 PinName intr, 00022 PinName pd) 00023 : 00024 _spi(mosi, miso, sck), 00025 _ss(ss), 00026 _pd(pd), 00027 _f800_isr(InterruptIn(intr)) 00028 { 00029 _spi.format(8, 0); // 8 bit spi mode 0 00030 _spi.frequency(SPI_SPEED_START); // start with 10 Mhz SPI clock 00031 _ss = 1; // cs high 00032 _pd = 1; // PD high 00033 Bootup(); 00034 _address = 0; 00035 _bitmap_count = 0; 00036 _bitmapCount = 0; 00037 _bitmapAddress = 0; 00038 } 00039 00040 00041 ft_bool_t FT813::Bootup(void) 00042 { 00043 // terminal.printf("Bootup() entered\r\n"); 00044 Open(); 00045 00046 BootupConfig(); 00047 00048 return(1); 00049 } 00050 00051 00052 ft_void_t FT813::BootupConfig(void) 00053 { 00054 ft_uint8_t chipid; 00055 /* Do a power cycle for safer side */ 00056 Powercycle(FT_TRUE); 00057 /* 00058 7/8/16: Curt added the sleep delay below... 00059 */ 00060 // Sleep(30); 00061 00062 /* Set the clk to external clock */ 00063 HostCommand(FT_GPU_EXTERNAL_OSC); 00064 Sleep(10); 00065 00066 /* Access address 0 to wake up the FT813 */ 00067 HostCommand(FT_GPU_ACTIVE_M); 00068 Sleep(500); 00069 00070 /* Switch PLL output to 48MHz */ 00071 HostCommand(FT_GPU_PLL_48M); 00072 Sleep(10); 00073 00074 /* Do a core reset for safer side */ 00075 HostCommand(FT_GPU_CORE_RESET); 00076 Sleep(500); 00077 //Read Register ID to check if FT813 is ready. 00078 chipid = Rd8(REG_ID); 00079 // chipid = Rd8(0x0C0000); 00080 // printf("ID1: 0x%08X\n", chipid); 00081 while(chipid != 0x7C) 00082 // wait(1); 00083 // printf("ID2: 0x%08X\n", chipid); 00084 00085 // Speed up 00086 // _spi.frequency(50000000); // 30 Mhz SPI clock DC 00087 _spi.frequency(SPI_SPEED_AFTER); // 20 Mhz SPI clock DC 00088 // _spi.frequency(12000000); // 12 Mhz SPI clock 00089 /* Configuration of LCD display */ 00090 DispHCycle = my_DispHCycle; 00091 Wr16(REG_HCYCLE, DispHCycle); 00092 DispHOffset = my_DispHOffset; 00093 Wr16(REG_HOFFSET, DispHOffset); 00094 DispWidth = my_DispWidth; 00095 Wr16(REG_HSIZE, DispWidth); 00096 DispHSync0 = my_DispHSync0; 00097 Wr16(REG_HSYNC0, DispHSync0); 00098 DispHSync1 = my_DispHSync1; 00099 Wr16(REG_HSYNC1, DispHSync1); 00100 DispVCycle = my_DispVCycle; 00101 Wr16(REG_VCYCLE, DispVCycle); 00102 DispVOffset = my_DispVOffset; 00103 Wr16(REG_VOFFSET, DispVOffset); 00104 DispHeight = my_DispHeight; 00105 Wr16(REG_VSIZE, DispHeight); 00106 DispVSync0 = my_DispVSync0; 00107 Wr16(REG_VSYNC0, DispVSync0); 00108 DispVSync1 = my_DispVSync1; 00109 Wr16(REG_VSYNC1, DispVSync1); 00110 DispSwizzle = my_DispSwizzle; 00111 Wr8(REG_SWIZZLE, DispSwizzle); 00112 DispPCLKPol = my_DispPCLKPol; 00113 Wr8(REG_PCLK_POL, DispPCLKPol); 00114 Wr8(REG_CSPREAD, 0); 00115 DispPCLK = my_DispPCLK; 00116 Wr8(REG_PCLK, DispPCLK); // After this display is visible on the LCD 00117 00118 Wr16(REG_PWM_HZ, 10000); 00119 //#ifdef Inv_Backlite // turn on backlite 00120 // Wr16(REG_PWM_DUTY, 0); 00121 //#else 00122 Wr16(REG_PWM_DUTY, 255); // Brightness 127 00123 //#endif 00124 Wr8(REG_GPIO_DIR, 0x82); //| Rd8(REG_GPIO_DIR)); 00125 Wr8(REG_GPIO, 0x080); //| Rd8(REG_GPIO)); 00126 00127 Wr32(RAM_DL, CLEAR(1, 1, 1)); 00128 Wr32(RAM_DL+4, DISPLAY()); 00129 Wr32(REG_DLSWAP, 1); 00130 00131 Wr16(REG_PCLK, DispPCLK); 00132 00133 /* Touch configuration - configure the resistance value to 1200 */ 00134 /* This value is specific to customer requirement and derived by experiment */ 00135 // Wr16(REG_TOUCH_RZTHRESH,2400); 00136 Wr16(REG_TOUCH_RZTHRESH, 0xFFFF); 00137 } 00138 00139 /* API to initialize the SPI interface */ 00140 ft_bool_t FT813::Init() 00141 { 00142 // This is done in the constructor 00143 return 1; 00144 } 00145 00146 ft_bool_t FT813::Open() 00147 { 00148 cmd_fifo_wp = dl_buff_wp = 0; 00149 status = OPENED; 00150 return 1; 00151 } 00152 00153 ft_void_t FT813::Close() 00154 { 00155 status = CLOSED; 00156 } 00157 00158 ft_void_t FT813::DeInit() 00159 { 00160 } 00161 00162 /*The APIs for reading/writing transfer continuously only with small buffer system*/ 00163 ft_void_t FT813::StartTransfer(FT_GPU_TRANSFERDIR_T rw, ft_uint32_t addr) 00164 { 00165 if (FT_GPU_READ == rw) { 00166 _ss = 0; // cs low 00167 _spi.write(addr >> 16); 00168 _spi.write(addr >> 8); 00169 _spi.write(addr & 0xff); 00170 _spi.write(0); //Dummy Read Byte 00171 status = READING; 00172 } else { 00173 _ss = 0; // cs low 00174 _spi.write(0x80 | (addr >> 16)); 00175 _spi.write(addr >> 8); 00176 _spi.write(addr & 0xff); 00177 status = WRITING; 00178 } 00179 } 00180 00181 00182 /*The APIs for writing transfer continuously only*/ 00183 ft_void_t FT813::StartCmdTransfer(FT_GPU_TRANSFERDIR_T rw, ft_uint16_t count) 00184 { 00185 StartTransfer(rw, cmd_fifo_wp + RAM_CMD); 00186 } 00187 00188 ft_uint8_t FT813::TransferString(const ft_char8_t *string) 00189 { 00190 ft_uint16_t length = strlen(string); 00191 while(length --) { 00192 Transfer8(*string); 00193 string++; 00194 } 00195 //Append one null as ending flag 00196 Transfer8(0); 00197 return(1); 00198 } 00199 00200 00201 ft_uint8_t FT813::Transfer8(ft_uint8_t value) 00202 { 00203 return _spi.write(value); 00204 } 00205 00206 00207 ft_uint16_t FT813::Transfer16(ft_uint16_t value) 00208 { 00209 ft_uint16_t retVal = 0; 00210 00211 if (status == WRITING) { 00212 Transfer8(value & 0xFF);//LSB first 00213 Transfer8((value >> 8) & 0xFF); 00214 } else { 00215 retVal = Transfer8(0); 00216 retVal |= (ft_uint16_t)Transfer8(0) << 8; 00217 } 00218 00219 return retVal; 00220 } 00221 00222 ft_uint32_t FT813::Transfer32(ft_uint32_t value) 00223 { 00224 ft_uint32_t retVal = 0; 00225 if (status == WRITING) { 00226 Transfer16(value & 0xFFFF);//LSB first 00227 Transfer16((value >> 16) & 0xFFFF); 00228 } else { 00229 retVal = Transfer16(0); 00230 retVal |= (ft_uint32_t)Transfer16(0) << 16; 00231 } 00232 return retVal; 00233 } 00234 00235 ft_void_t FT813::EndTransfer() 00236 { 00237 _ss = 1; 00238 status = OPENED; 00239 } 00240 00241 ft_uint8_t FT813::Rd8(ft_uint32_t addr) 00242 { 00243 ft_uint8_t value; 00244 StartTransfer(FT_GPU_READ, addr); 00245 value = Transfer8(0); 00246 EndTransfer(); 00247 return value; 00248 } 00249 00250 ft_uint16_t FT813::Rd16(ft_uint32_t addr) 00251 { 00252 ft_uint16_t value; 00253 StartTransfer(FT_GPU_READ, addr); 00254 value = Transfer16(0); 00255 EndTransfer(); 00256 return value; 00257 } 00258 00259 ft_uint32_t FT813::Rd32(ft_uint32_t addr) 00260 { 00261 ft_uint32_t value; 00262 StartTransfer(FT_GPU_READ, addr); 00263 value = Transfer32(0); 00264 EndTransfer(); 00265 return value; 00266 } 00267 00268 ft_void_t FT813::Wr8(ft_uint32_t addr, ft_uint8_t v) 00269 { 00270 // StartTransfer(FT_GPU_WRITE, addr); 00271 // if (FT_GPU_READ == rw) { // if (FT_GPU_READ == FT_GPU_WRITE) 00272 // _ss = 0; // cs low 00273 // _spi.write(addr >> 16); 00274 // _spi.write(addr >> 8); 00275 // _spi.write(addr & 0xff); 00276 // _spi.write(0); //Dummy Read Byte 00277 // status = READING; 00278 // } else { 00279 _ss = 0; // cs low 00280 _spi.write(0x80 | (addr >> 16)); 00281 _spi.write(addr >> 8); 00282 _spi.write(addr & 0xff); 00283 status = WRITING; 00284 // } 00285 00286 // Transfer8(v); 00287 _spi.write(v); 00288 // EndTransfer(); 00289 _ss = 1; 00290 status = OPENED; 00291 } 00292 00293 ft_void_t FT813::Wr16(ft_uint32_t addr, ft_uint16_t v) 00294 { 00295 StartTransfer(FT_GPU_WRITE, addr); 00296 Transfer16(v); 00297 EndTransfer(); 00298 } 00299 00300 ft_void_t FT813::Wr32(ft_uint32_t addr, ft_uint32_t v) 00301 { 00302 StartTransfer(FT_GPU_WRITE, addr); 00303 Transfer32(v); 00304 EndTransfer(); 00305 } 00306 00307 ft_void_t FT813::HostCommand(ft_uint8_t cmd) 00308 { 00309 _ss = 0; 00310 _spi.write(cmd); 00311 _spi.write(0); 00312 _spi.write(0); 00313 _ss = 1; 00314 } 00315 00316 ft_void_t FT813::ClockSelect(FT_GPU_PLL_SOURCE_T pllsource) 00317 { 00318 HostCommand(pllsource); 00319 } 00320 00321 ft_void_t FT813::PLL_FreqSelect(FT_GPU_PLL_FREQ_T freq) 00322 { 00323 HostCommand(freq); 00324 } 00325 00326 ft_void_t FT813::PowerModeSwitch(FT_GPU_POWER_MODE_T pwrmode) 00327 { 00328 HostCommand(pwrmode); 00329 } 00330 00331 ft_void_t FT813::CoreReset() 00332 { 00333 HostCommand(0x68); 00334 } 00335 00336 ft_void_t FT813::Updatecmdfifo(ft_uint16_t count) 00337 { 00338 cmd_fifo_wp = (cmd_fifo_wp + count) & 4095; 00339 //4 byte alignment 00340 cmd_fifo_wp = (cmd_fifo_wp + 3) & 0xffc; 00341 Wr16(REG_CMD_WRITE, cmd_fifo_wp); 00342 } 00343 00344 ft_uint16_t FT813::fifo_Freespace() 00345 { 00346 ft_uint16_t fullness,retval; 00347 00348 fullness = (cmd_fifo_wp - Rd16(REG_CMD_READ)) & 4095; 00349 retval = (FT_CMD_FIFO_SIZE - 4) - fullness; 00350 return (retval); 00351 } 00352 00353 ft_void_t FT813::WrCmdBuf(ft_uint8_t *buffer, ft_uint16_t count) 00354 { 00355 ft_uint32_t length =0, SizeTransfered = 0; 00356 00357 #define MAX_CMD_FIFO_TRANSFER fifo_Freespace() 00358 do { 00359 length = count; 00360 if (length > MAX_CMD_FIFO_TRANSFER) { 00361 length = MAX_CMD_FIFO_TRANSFER; 00362 } 00363 CheckCmdBuffer(length); 00364 00365 StartCmdTransfer(FT_GPU_WRITE, length); 00366 00367 SizeTransfered = 0; 00368 while (length--) { 00369 // Transfer8(*buffer); 00370 _spi.write(*buffer); 00371 buffer++; 00372 SizeTransfered++; 00373 } 00374 length = SizeTransfered; 00375 00376 EndTransfer(); 00377 Updatecmdfifo(length); 00378 00379 WaitCmdfifo_empty(); 00380 00381 count -= length; 00382 } while (count > 0); 00383 } 00384 00385 ft_void_t FT813::WrCmdBufFromFlash(FT_PROGMEM ft_prog_uchar8_t *buffer, ft_uint16_t count) 00386 { 00387 ft_uint32_t length =0, SizeTransfered = 0; 00388 00389 #define MAX_CMD_FIFO_TRANSFER fifo_Freespace() 00390 do { 00391 length = count; 00392 if (length > MAX_CMD_FIFO_TRANSFER) { 00393 length = MAX_CMD_FIFO_TRANSFER; 00394 } 00395 CheckCmdBuffer(length); 00396 00397 StartCmdTransfer(FT_GPU_WRITE,length); 00398 00399 SizeTransfered = 0; 00400 while (length--) { 00401 Transfer8(ft_pgm_read_byte_near(buffer)); 00402 buffer++; 00403 SizeTransfered++; 00404 } 00405 length = SizeTransfered; 00406 00407 EndTransfer(); 00408 Updatecmdfifo(length); 00409 00410 WaitCmdfifo_empty(); 00411 00412 count -= length; 00413 } while (count > 0); 00414 } 00415 00416 ft_void_t FT813::CheckCmdBuffer(ft_uint16_t count) 00417 { 00418 ft_uint16_t getfreespace; 00419 do { 00420 getfreespace = fifo_Freespace(); 00421 } while(getfreespace < count); 00422 } 00423 00424 ft_void_t FT813::WaitCmdfifo_empty() 00425 { 00426 while(Rd16(REG_CMD_READ) != Rd16(REG_CMD_WRITE)); 00427 00428 cmd_fifo_wp = Rd16(REG_CMD_WRITE); 00429 } 00430 00431 ft_void_t FT813::WaitLogo_Finish() 00432 { 00433 ft_int16_t cmdrdptr, cmdwrptr; 00434 00435 do { 00436 cmdrdptr = Rd16(REG_CMD_READ); 00437 cmdwrptr = Rd16(REG_CMD_WRITE); 00438 } while ((cmdwrptr != cmdrdptr) || (cmdrdptr != 0)); 00439 cmd_fifo_wp = 0; 00440 } 00441 00442 ft_void_t FT813::ResetCmdFifo() 00443 { 00444 cmd_fifo_wp = 0; 00445 } 00446 00447 ft_void_t FT813::WrCmd32(ft_uint32_t cmd) 00448 { 00449 CheckCmdBuffer(sizeof(cmd)); 00450 00451 Wr32(RAM_CMD + cmd_fifo_wp, cmd); 00452 00453 Updatecmdfifo(sizeof(cmd)); 00454 } 00455 00456 ft_void_t FT813::ResetDLBuffer() 00457 { 00458 dl_buff_wp = 0; 00459 } 00460 00461 /* Toggle PD_N pin of FT813 board for a power cycle*/ 00462 ft_void_t FT813::Powercycle(ft_bool_t up) 00463 { 00464 if (up) 00465 { 00466 //Toggle PD_N from low to high for power up switch 00467 _pd = 0; 00468 Sleep(20); 00469 00470 _pd = 1; 00471 Sleep(20); 00472 } else { 00473 //Toggle PD_N from high to low for power down switch 00474 _pd = 1; 00475 Sleep(20); 00476 00477 _pd = 0; 00478 Sleep(20); 00479 } 00480 } 00481 00482 ft_void_t FT813::WrMemFromFlash(ft_uint32_t addr, const ft_prog_uchar8_t *buffer, ft_uint32_t length) 00483 { 00484 //ft_uint32_t SizeTransfered = 0; 00485 00486 StartTransfer(FT_GPU_WRITE,addr); 00487 00488 while (length--) { 00489 Transfer8(ft_pgm_read_byte_near(buffer)); 00490 buffer++; 00491 } 00492 00493 EndTransfer(); 00494 } 00495 00496 ft_void_t FT813::WrMem(ft_uint32_t addr, const ft_uint8_t *buffer, ft_uint32_t length) 00497 { 00498 //ft_uint32_t SizeTransfered = 0; 00499 00500 StartTransfer(FT_GPU_WRITE,addr); 00501 00502 while (length--) { 00503 Transfer8(*buffer); 00504 buffer++; 00505 } 00506 00507 EndTransfer(); 00508 } 00509 00510 ft_void_t FT813::RdMem(ft_uint32_t addr, ft_uint8_t *buffer, ft_uint32_t length) 00511 { 00512 //ft_uint32_t SizeTransfered = 0; 00513 00514 StartTransfer(FT_GPU_READ,addr); 00515 00516 while (length--) { 00517 *buffer = Transfer8(0); 00518 buffer++; 00519 } 00520 00521 EndTransfer(); 00522 } 00523 00524 ft_int32_t FT813::Dec2Ascii(ft_char8_t *pSrc, ft_int32_t value) 00525 { 00526 ft_int16_t Length; 00527 ft_char8_t *pdst, charval; 00528 ft_int32_t CurrVal = value, tmpval,i; 00529 ft_char8_t tmparray[16], idx = 0; 00530 00531 Length = strlen(pSrc); 00532 pdst = pSrc + Length; 00533 00534 if(0 == value) { 00535 *pdst++ = '0'; 00536 *pdst++ = '\0'; 00537 return 0; 00538 } 00539 00540 if(CurrVal < 0) { 00541 *pdst++ = '-'; 00542 CurrVal = - CurrVal; 00543 } 00544 /* insert the value */ 00545 while(CurrVal > 0) { 00546 tmpval = CurrVal; 00547 CurrVal /= 10; 00548 tmpval = tmpval - CurrVal*10; 00549 charval = '0' + tmpval; 00550 tmparray[idx++] = charval; 00551 } 00552 00553 for(i = 0; i < idx; i++) { 00554 *pdst++ = tmparray[idx - i - 1]; 00555 } 00556 *pdst++ = '\0'; 00557 00558 return 0; 00559 } 00560 00561 ft_void_t FT813::Sleep(ft_uint16_t ms) 00562 { 00563 wait_ms(ms); 00564 } 00565 00566 ft_void_t FT813::Sound_ON() 00567 { 00568 Wr8(REG_GPIO, 0x02 | Rd8(REG_GPIO)); 00569 } 00570 00571 ft_void_t FT813::Sound_OFF() 00572 { 00573 Wr8(REG_GPIO, 0xFD & Rd8(REG_GPIO)); 00574 }
Generated on Tue Jul 19 2022 11:45:29 by
![doxygen](doxygen.png)