Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of FT810 by
src/FT_Hal_Utils.cpp@0:2d0ef4830603, 2016-09-07 (annotated)
- Committer:
- cpm219
- Date:
- Wed Sep 07 21:53:53 2016 +0000
- Revision:
- 0:2d0ef4830603
- Child:
- 5:506e2de9a9e6
first version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cpm219 | 0:2d0ef4830603 | 1 | #include "FT_Platform.h" |
cpm219 | 0:2d0ef4830603 | 2 | #include "mbed.h" |
cpm219 | 0:2d0ef4830603 | 3 | #include "SDFileSystem.h" |
cpm219 | 0:2d0ef4830603 | 4 | |
cpm219 | 0:2d0ef4830603 | 5 | /* function to load jpg file from filesystem */ |
cpm219 | 0:2d0ef4830603 | 6 | /* return 0 if jpg is ok */ |
cpm219 | 0:2d0ef4830603 | 7 | /* return x_size and y_size of jpg */ |
cpm219 | 0:2d0ef4830603 | 8 | |
cpm219 | 0:2d0ef4830603 | 9 | int FT800::Load_jpg(char* filename, ft_int16_t* x_size, ft_int16_t* y_size, ft_uint32_t address) |
cpm219 | 0:2d0ef4830603 | 10 | { |
cpm219 | 0:2d0ef4830603 | 11 | unsigned char pbuff[8291]; |
cpm219 | 0:2d0ef4830603 | 12 | unsigned short marker; |
cpm219 | 0:2d0ef4830603 | 13 | unsigned short length; |
cpm219 | 0:2d0ef4830603 | 14 | unsigned char data[4]; |
cpm219 | 0:2d0ef4830603 | 15 | |
cpm219 | 0:2d0ef4830603 | 16 | ft_uint16_t blocklen; |
cpm219 | 0:2d0ef4830603 | 17 | // sd.mount(); |
cpm219 | 0:2d0ef4830603 | 18 | FILE *fp = fopen(filename, "r"); |
cpm219 | 0:2d0ef4830603 | 19 | if(fp == NULL) return (-1); // connot open file |
cpm219 | 0:2d0ef4830603 | 20 | |
cpm219 | 0:2d0ef4830603 | 21 | // search for 0xFFC0 marker |
cpm219 | 0:2d0ef4830603 | 22 | fseek(fp, 0, SEEK_END); |
cpm219 | 0:2d0ef4830603 | 23 | unsigned int Fsize = ftell(fp); |
cpm219 | 0:2d0ef4830603 | 24 | fseek(fp, 2, SEEK_SET); |
cpm219 | 0:2d0ef4830603 | 25 | fread(data,4,1,fp); |
cpm219 | 0:2d0ef4830603 | 26 | marker = data[0] << 8 | data[1]; |
cpm219 | 0:2d0ef4830603 | 27 | length = data[2] << 8 | data[3]; |
cpm219 | 0:2d0ef4830603 | 28 | do { |
cpm219 | 0:2d0ef4830603 | 29 | if(marker == 0xFFC0) break; |
cpm219 | 0:2d0ef4830603 | 30 | if(marker & 0xFF00 != 0xFF00) break; |
cpm219 | 0:2d0ef4830603 | 31 | if (fseek(fp, length - 2,SEEK_CUR) != 0) break; |
cpm219 | 0:2d0ef4830603 | 32 | fread(data,4,1,fp); |
cpm219 | 0:2d0ef4830603 | 33 | marker = data[0] << 8 | data[1]; |
cpm219 | 0:2d0ef4830603 | 34 | length = data[2] << 8 | data[3]; |
cpm219 | 0:2d0ef4830603 | 35 | } while(1); |
cpm219 | 0:2d0ef4830603 | 36 | if(marker != 0xFFC0) return (-2); // no FFC0 Marker, wrong format no baseline DCT-based JPEG |
cpm219 | 0:2d0ef4830603 | 37 | fseek(fp, 1,SEEK_CUR); |
cpm219 | 0:2d0ef4830603 | 38 | fread(data,4,1,fp); |
cpm219 | 0:2d0ef4830603 | 39 | *y_size = (data[0] << 8 | data[1]); |
cpm219 | 0:2d0ef4830603 | 40 | *x_size = (data[2] << 8 | data[3]); |
cpm219 | 0:2d0ef4830603 | 41 | |
cpm219 | 0:2d0ef4830603 | 42 | //if(*x_size > DispWidth || *y_size > DispHeight) return (-3); // to big to fit on screen |
cpm219 | 0:2d0ef4830603 | 43 | |
cpm219 | 0:2d0ef4830603 | 44 | fseek(fp, 0, SEEK_SET); |
cpm219 | 0:2d0ef4830603 | 45 | WrCmd32(CMD_LOADIMAGE); // load a JPEG image |
cpm219 | 0:2d0ef4830603 | 46 | WrCmd32(address); //destination address of jpg decode |
cpm219 | 0:2d0ef4830603 | 47 | WrCmd32(0); //output format of the bitmap - default is rgb565 |
cpm219 | 0:2d0ef4830603 | 48 | while(Fsize > 0) { |
cpm219 | 0:2d0ef4830603 | 49 | /* download the data into the command buffer by 8kb one shot */ |
cpm219 | 0:2d0ef4830603 | 50 | blocklen = Fsize>8192?8192:Fsize; |
cpm219 | 0:2d0ef4830603 | 51 | /* copy the data into pbuff and then transfter it to command buffer */ |
cpm219 | 0:2d0ef4830603 | 52 | fread(pbuff,1,blocklen,fp); |
cpm219 | 0:2d0ef4830603 | 53 | Fsize -= blocklen; |
cpm219 | 0:2d0ef4830603 | 54 | /* copy data continuously into command memory */ |
cpm219 | 0:2d0ef4830603 | 55 | WrCmdBuf(pbuff, blocklen); //alignment is already taken care by this api |
cpm219 | 0:2d0ef4830603 | 56 | } |
cpm219 | 0:2d0ef4830603 | 57 | fclose(fp); |
cpm219 | 0:2d0ef4830603 | 58 | // sd.unmount(); |
cpm219 | 0:2d0ef4830603 | 59 | |
cpm219 | 0:2d0ef4830603 | 60 | return(0); |
cpm219 | 0:2d0ef4830603 | 61 | } |
cpm219 | 0:2d0ef4830603 | 62 | |
cpm219 | 0:2d0ef4830603 | 63 | //int FT800::Load_raw(char* filename) |
cpm219 | 0:2d0ef4830603 | 64 | //{ |
cpm219 | 0:2d0ef4830603 | 65 | // ft_uint8_t imbuff[8192]; |
cpm219 | 0:2d0ef4830603 | 66 | // ft_uint16_t filesize; |
cpm219 | 0:2d0ef4830603 | 67 | // ft_uint16_t blocklen; |
cpm219 | 0:2d0ef4830603 | 68 | //// ft_uint16_t ram_start = 0x00; |
cpm219 | 0:2d0ef4830603 | 69 | // |
cpm219 | 0:2d0ef4830603 | 70 | //// sd.mount(); |
cpm219 | 0:2d0ef4830603 | 71 | // FILE *fp = fopen(filename, "rb"); // open file |
cpm219 | 0:2d0ef4830603 | 72 | //// if(fp == NULL) return (-1); // connot open file |
cpm219 | 0:2d0ef4830603 | 73 | // fseek(fp, 0, SEEK_END); // set file position to end of file |
cpm219 | 0:2d0ef4830603 | 74 | // filesize= ftell(fp); // determine file size |
cpm219 | 0:2d0ef4830603 | 75 | // fseek(fp, 2, SEEK_SET); // return to beginning of file |
cpm219 | 0:2d0ef4830603 | 76 | // |
cpm219 | 0:2d0ef4830603 | 77 | // while(filesize > 0) |
cpm219 | 0:2d0ef4830603 | 78 | // { |
cpm219 | 0:2d0ef4830603 | 79 | // //copy the .raw file data to imbuff[8192] in 8k block |
cpm219 | 0:2d0ef4830603 | 80 | // blocklen = filesize>8192?8192:filesize; |
cpm219 | 0:2d0ef4830603 | 81 | // fread(imbuff,1,blocklen,fp); |
cpm219 | 0:2d0ef4830603 | 82 | // filesize-= blocklen; |
cpm219 | 0:2d0ef4830603 | 83 | // //write imbuff contents to graphics RAM at address ram_start = 0x00 |
cpm219 | 0:2d0ef4830603 | 84 | // WrCmdBuf(imbuff, blocklen); //alignment is already taken care by this api |
cpm219 | 0:2d0ef4830603 | 85 | //// ram_start += 8192; |
cpm219 | 0:2d0ef4830603 | 86 | // } |
cpm219 | 0:2d0ef4830603 | 87 | // fclose(fp); |
cpm219 | 0:2d0ef4830603 | 88 | //// sd.unmount(); |
cpm219 | 0:2d0ef4830603 | 89 | // |
cpm219 | 0:2d0ef4830603 | 90 | // return 0; |
cpm219 | 0:2d0ef4830603 | 91 | //} |
cpm219 | 0:2d0ef4830603 | 92 | |
cpm219 | 0:2d0ef4830603 | 93 | |
cpm219 | 0:2d0ef4830603 | 94 | |
cpm219 | 0:2d0ef4830603 | 95 | |
cpm219 | 0:2d0ef4830603 | 96 | |
cpm219 | 0:2d0ef4830603 | 97 | |
cpm219 | 0:2d0ef4830603 | 98 | /* calibrate touch */ |
cpm219 | 0:2d0ef4830603 | 99 | ft_void_t FT800::Calibrate() |
cpm219 | 0:2d0ef4830603 | 100 | { |
cpm219 | 0:2d0ef4830603 | 101 | /*************************************************************************/ |
cpm219 | 0:2d0ef4830603 | 102 | /* Below code demonstrates the usage of calibrate function. Calibrate */ |
cpm219 | 0:2d0ef4830603 | 103 | /* function will wait untill user presses all the three dots. Only way to*/ |
cpm219 | 0:2d0ef4830603 | 104 | /* come out of this api is to reset the coprocessor bit. */ |
cpm219 | 0:2d0ef4830603 | 105 | /*************************************************************************/ |
cpm219 | 0:2d0ef4830603 | 106 | { |
cpm219 | 0:2d0ef4830603 | 107 | |
cpm219 | 0:2d0ef4830603 | 108 | DLstart(); // start a new display command list |
cpm219 | 0:2d0ef4830603 | 109 | DL(CLEAR_COLOR_RGB(64,64,64)); // set the clear color R, G, B |
cpm219 | 0:2d0ef4830603 | 110 | DL(CLEAR(1,1,1)); // clear buffers -> color buffer,stencil buffer, tag buffer |
cpm219 | 0:2d0ef4830603 | 111 | DL(COLOR_RGB(0xff,0xff,0xff)); // set the current color R, G, B |
cpm219 | 0:2d0ef4830603 | 112 | Text((DispWidth/2), (DispHeight/2), 27, OPT_CENTER, "Please Tap on the dot"); // draw Text at x,y, font 27, centered |
cpm219 | 0:2d0ef4830603 | 113 | Calibrate(0); // start the calibration of touch screen |
cpm219 | 0:2d0ef4830603 | 114 | Flush_Co_Buffer(); // download the commands into FT800 FIFO |
cpm219 | 0:2d0ef4830603 | 115 | WaitCmdfifo_empty(); // Wait till coprocessor completes the operation |
cpm219 | 0:2d0ef4830603 | 116 | } |
cpm219 | 0:2d0ef4830603 | 117 | } |
cpm219 | 0:2d0ef4830603 | 118 | |
cpm219 | 0:2d0ef4830603 | 119 | |
cpm219 | 0:2d0ef4830603 | 120 | /* API to give fadeout effect by changing the display PWM from 100 till 0 */ |
cpm219 | 0:2d0ef4830603 | 121 | ft_void_t FT800::fadeout() |
cpm219 | 0:2d0ef4830603 | 122 | { |
cpm219 | 0:2d0ef4830603 | 123 | ft_int32_t i; |
cpm219 | 0:2d0ef4830603 | 124 | |
cpm219 | 0:2d0ef4830603 | 125 | for (i = 100; i >= 0; i -= 3) |
cpm219 | 0:2d0ef4830603 | 126 | { |
cpm219 | 0:2d0ef4830603 | 127 | Wr8(REG_PWM_DUTY,i); |
cpm219 | 0:2d0ef4830603 | 128 | Sleep(2);//sleep for 2 ms |
cpm219 | 0:2d0ef4830603 | 129 | } |
cpm219 | 0:2d0ef4830603 | 130 | } |
cpm219 | 0:2d0ef4830603 | 131 | |
cpm219 | 0:2d0ef4830603 | 132 | /* API to perform display fadein effect by changing the display PWM from 0 till 100 and finally 128 */ |
cpm219 | 0:2d0ef4830603 | 133 | ft_void_t FT800::fadein() |
cpm219 | 0:2d0ef4830603 | 134 | { |
cpm219 | 0:2d0ef4830603 | 135 | ft_int32_t i; |
cpm219 | 0:2d0ef4830603 | 136 | |
cpm219 | 0:2d0ef4830603 | 137 | for (i = 0; i <=100 ; i += 3) |
cpm219 | 0:2d0ef4830603 | 138 | { |
cpm219 | 0:2d0ef4830603 | 139 | Wr8(REG_PWM_DUTY,i); |
cpm219 | 0:2d0ef4830603 | 140 | Sleep(2);//sleep for 2 ms |
cpm219 | 0:2d0ef4830603 | 141 | } |
cpm219 | 0:2d0ef4830603 | 142 | /* Finally make the PWM 100% */ |
cpm219 | 0:2d0ef4830603 | 143 | i = 128; |
cpm219 | 0:2d0ef4830603 | 144 | Wr8(REG_PWM_DUTY,i); |
cpm219 | 0:2d0ef4830603 | 145 | } |
cpm219 | 0:2d0ef4830603 | 146 | |
cpm219 | 0:2d0ef4830603 | 147 | ft_void_t FT800::read_calibrate(ft_uint8_t data[24]){ |
cpm219 | 0:2d0ef4830603 | 148 | unsigned int i; |
cpm219 | 0:2d0ef4830603 | 149 | for(i=0;i<24;i++){ |
cpm219 | 0:2d0ef4830603 | 150 | data[i] = Rd8(REG_TOUCH_TRANSFORM_A + i); |
cpm219 | 0:2d0ef4830603 | 151 | } |
cpm219 | 0:2d0ef4830603 | 152 | } |
cpm219 | 0:2d0ef4830603 | 153 | |
cpm219 | 0:2d0ef4830603 | 154 | ft_void_t FT800::write_calibrate(ft_uint8_t data[24]){ |
cpm219 | 0:2d0ef4830603 | 155 | unsigned int i; |
cpm219 | 0:2d0ef4830603 | 156 | for(i=0;i<24;i++) { |
cpm219 | 0:2d0ef4830603 | 157 | Wr8(REG_TOUCH_TRANSFORM_A + i,data[i]); |
cpm219 | 0:2d0ef4830603 | 158 | } |
cpm219 | 0:2d0ef4830603 | 159 | } |
cpm219 | 0:2d0ef4830603 | 160 | |
cpm219 | 0:2d0ef4830603 | 161 | ft_uint32_t FT800::color_rgb(ft_uint8_t red,ft_uint8_t green, ft_uint8_t blue){ |
cpm219 | 0:2d0ef4830603 | 162 | return ((4UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0)); |
cpm219 | 0:2d0ef4830603 | 163 | } |
cpm219 | 0:2d0ef4830603 | 164 | |
cpm219 | 0:2d0ef4830603 | 165 | ft_uint32_t FT800::clear_color_rgb(ft_uint8_t red,ft_uint8_t green, ft_uint8_t blue){ |
cpm219 | 0:2d0ef4830603 | 166 | return ((2UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0)); |
cpm219 | 0:2d0ef4830603 | 167 | } |
cpm219 | 0:2d0ef4830603 | 168 |