# HG changeset patch # User jeandet # Date 2013-02-18 22:10:44 # Node ID 1f8d622aedf1755199bde4d8e90ab6cf0294de54 # Parent 7126c4937e8d4e9f32dcd72c7f3fc60e671d9245 Finished mid-point circle algorithm for ili9328 controler diff --git a/bin/dfu.py b/bin/dfu.py new file mode 100644 --- /dev/null +++ b/bin/dfu.py @@ -0,0 +1,121 @@ +#!/usr/bin/python + +# Written by Antonio Galea - 2010/11/18 +# Distributed under Gnu LGPL 3.0 +# see http://www.gnu.org/licenses/lgpl-3.0.txt + +import sys,struct,zlib,os +from optparse import OptionParser + +DEFAULT_DEVICE="0x0483:0xdf11" + +def named(tuple,names): + return dict(zip(names.split(),tuple)) +def consume(fmt,data,names): + n = struct.calcsize(fmt) + return named(struct.unpack(fmt,data[:n]),names),data[n:] +def cstring(string): + return string.split('\0',1)[0] +def compute_crc(data): + return 0xFFFFFFFF & -zlib.crc32(data) -1 + +def parse(file,dump_images=False): + print 'File: "%s"' % file + data = open(file,'rb').read() + crc = compute_crc(data[:-4]) + prefix, data = consume('<5sBIB',data,'signature version size targets') + print '%(signature)s v%(version)d, image size: %(size)d, targets: %(targets)d' % prefix + for t in range(prefix['targets']): + tprefix, data = consume('<6sBI255s2I',data,'signature altsetting named name size elements') + tprefix['num'] = t + if tprefix['named']: + tprefix['name'] = cstring(tprefix['name']) + else: + tprefix['name'] = '' + print '%(signature)s %(num)d, alt setting: %(altsetting)s, name: "%(name)s", size: %(size)d, elements: %(elements)d' % tprefix + tsize = tprefix['size'] + target, data = data[:tsize], data[tsize:] + for e in range(tprefix['elements']): + eprefix, target = consume('<2I',target,'address size') + eprefix['num'] = e + print ' %(num)d, address: 0x%(address)08x, size: %(size)d' % eprefix + esize = eprefix['size'] + image, target = target[:esize], target[esize:] + if dump_images: + out = '%s.target%d.image%d.bin' % (file,t,e) + open(out,'wb').write(image) + print ' DUMPED IMAGE TO "%s"' % out + if len(target): + print "target %d: PARSE ERROR" % t + suffix = named(struct.unpack('<4H3sBI',data[:16]),'device product vendor dfu ufd len crc') + print 'usb: %(vendor)04x:%(product)04x, device: 0x%(device)04x, dfu: 0x%(dfu)04x, %(ufd)s, %(len)d, 0x%(crc)08x' % suffix + if crc != suffix['crc']: + print "CRC ERROR: computed crc32 is 0x%08x" % crc + data = data[16:] + if data: + print "PARSE ERROR" + +def build(file,targets,device=DEFAULT_DEVICE): + data = '' + for t,target in enumerate(targets): + tdata = '' + for image in target: + tdata += struct.pack('<2I',image['address'],len(image['data']))+image['data'] + tdata = struct.pack('<6sBI255s2I','Target',0,1,'ST...',len(tdata),len(target)) + tdata + data += tdata + data = struct.pack('<5sBIB','DfuSe',1,len(data)+11,len(targets)) + data + v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1)) + data += struct.pack('<4H3sB',0,d,v,0x011a,'UFD',16) + crc = compute_crc(data) + data += struct.pack('VAL); - printf("Sys Tick=%d\n\r",SysTick->VAL); - printf("Sys Tick=%d\n\r",SysTick->VAL); - printf("Sys Tick=%d\n\r",SysTick->VAL); - ili9328paintFilRect(&lcd0,0,0,240,320,LCD_COLOR_BLACK,1,LCD_COLOR_WHITE); - // while(1)randBoxesDemo();//monkDemo(); - ili9328paintFilCircMidPoint(&lcd0,120,160,100,LCD_COLOR_BLUE2,10,LCD_COLOR_GREEN); + uint16_t innerbuffer[16]; + uint16_t outterbuffer[16]; + for(int i=0;i<16;i++)innerbuffer[i]=LCD_COLOR_BLUE; + for(int i=0;i<16;i++)outterbuffer[i]=LCD_COLOR_RED; + ili9328paintFilRect(&lcd0,0,0,240,320,LCD_COLOR_CYAN,5,LCD_COLOR_WHITE); + ili9328paintFilCirc(&lcd0,100,150,40,LCD_COLOR_RED,5,LCD_COLOR_BLUE); + ili9328paintFilCirc(&lcd0,120,160,120,LCD_COLOR_RED,1,LCD_COLOR_BLUE); + //ili9328paintFilCirc(&lcd0,150,240,80,LCD_COLOR_RED,2,LCD_COLOR_BLUE); while(1) { delay_100us(5000); 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 @@ -99,6 +99,49 @@ }\ +#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);\ + }\ + if(ContSzinterface->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);\ + int rem;\ + if(ContSzinterface->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);\ + }\ + }\ void ili9328setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress) @@ -139,14 +182,14 @@ void ili9328paint(LCD_t* LCD,void* buffe } } -void ili9328paintFilCircMidPoint(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor) +void ili9328paintFilCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor) { //Based on the mid point circle algorithm from Wikipedia //http://en.wikipedia.org/wiki/Midpoint_circle_algorithm - uint16_t tmp1[16]; - uint16_t tmp2[16]; - for(int i=0;i<16;i++)tmp1[i]=fillColor; - for(int i=0;i<16;i++)tmp2[i]=contColor; + uint16_t innerbuffer[16]; + uint16_t outterbuffer[16]; + for(int i=0;i<16;i++)innerbuffer[i]=fillColor; + for(int i=0;i<16;i++)outterbuffer[i]=contColor; if(contSz= y) { - ilipaintHLineWithCont(LCD,(Xpos-x),(Ypos+y),(2*x),(x-x_int),tmp1,16,tmp2,16); - ilipaintHLineWithCont(LCD,(Xpos-x),(Ypos-y),(2*x),(x-x_int),tmp2,16,tmp1,16); - ilipaintVLineWithCont(LCD,(Xpos+y),(Ypos-x),(2*y),(x-x_int),tmp1,16,tmp2,16); - //ilipaintVSymLineWithCont(LCD,(Xpos-y),(Ypos+x),(2*y),(x-x_int),tmp2,16,tmp1,16); + ilipaintHLineWithCont(LCD,(Xpos-x),(Ypos+y),(2*x),(x-x_int),innerbuffer,16,outterbuffer,16); + ilipaintHLineWithCont(LCD,(Xpos-x),(Ypos-y),(2*x),(x-x_int),innerbuffer,16,outterbuffer,16); + ilipaintHalfTopVLineWithCont(LCD,(Xpos+y),(Ypos-x),(x),(x-x_int),innerbuffer,16,outterbuffer,16); + ilipaintHalfTopVLineWithCont(LCD,(Xpos-y),(Ypos-x),(x),(x-x_int),innerbuffer,16,outterbuffer,16); + ilipaintHalfBottomVLineWithCont(LCD,(Xpos-y),(Ypos),(x),(x-x_int),innerbuffer,16,outterbuffer,16); + ilipaintHalfBottomVLineWithCont(LCD,(Xpos+y),(Ypos),(x),(x-x_int),innerbuffer,16,outterbuffer,16); error += y; ++y; error += y; @@ -184,15 +229,15 @@ void ili9328paintFilCircMidPoint(LCD_t* } -void ili9328paintFilCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor) +void ili9328paintFilCirc_old(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor) { if(contSzinterface->writeGRAM(tmp2,rem); + if(rem)LCD->interface->writeGRAM(outterbuffer,rem); for(int i=rem;i<(contSz2);i+=16) { - LCD->interface->writeGRAM(tmp2,16); + LCD->interface->writeGRAM(outterbuffer,16); } W=2*Val1; @@ -218,18 +263,18 @@ void ili9328paintFilCirc(LCD_t* LCD,uint { W-=2*contSz2; rem=(W)%16; - if(rem)LCD->interface->writeGRAM(tmp1,rem); + if(rem)LCD->interface->writeGRAM(innerbuffer,rem); for(int i=rem;i<(W);i+=16) { - LCD->interface->writeGRAM(tmp1,16); + LCD->interface->writeGRAM(innerbuffer,16); } } rem=(contSz2)%16; - if(rem)LCD->interface->writeGRAM(tmp2,rem); + if(rem)LCD->interface->writeGRAM(outterbuffer,rem); for(int i=rem;i<(contSz2);i+=16) { - LCD->interface->writeGRAM(tmp2,16); + LCD->interface->writeGRAM(outterbuffer,16); } } } diff --git a/lib/src/stm32f4/CPU/cpuinit.c b/lib/src/stm32f4/CPU/cpuinit.c --- a/lib/src/stm32f4/CPU/cpuinit.c +++ b/lib/src/stm32f4/CPU/cpuinit.c @@ -12,7 +12,10 @@ extern int main(); void cpu_init() { extern uint32_t currentCpuFreq; - currentCpuFreq = 16*1000*1000; +#ifndef CPUFREQ + #define CPUFREQ (16*1000*1000) +#endif + currentCpuFreq = CPUFREQ; enable_FPU(); RCC->CR |= (uint32_t)0x00000001; FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; diff --git a/libuc2.pro b/libuc2.pro --- a/libuc2.pro +++ b/libuc2.pro @@ -4,3 +4,8 @@ SUBDIRS += lib \ bsp\ examples +binfiles.files = bin/dfu.py +binfiles.path = $$[QT_INSTALL_BINS] + +INSTALLS+=binfiles + diff --git a/mkspecs/stm32f4/qmake.conf b/mkspecs/stm32f4/qmake.conf --- a/mkspecs/stm32f4/qmake.conf +++ b/mkspecs/stm32f4/qmake.conf @@ -25,7 +25,7 @@ CONFIG += cpu contains( TEMPLATE, app ) { OBJECTS_DIR=obj DESTDIR=bin - unix:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" && arm-none-eabi-objcopy -O binary "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin" + unix:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" && arm-none-eabi-objcopy -O binary "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin && python $$[QT_INSTALL_BINS]/dfu.py -b 0x08000000:"$$DESTDIR/"$(QMAKE_TARGET).bin " $$DESTDIR/"$(QMAKE_TARGET).dfu" win32:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(DESTDIR_TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" && arm-none-eabi-objcopy -O binary "$(DESTDIR_TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin" LIBS += -L$$[QT_INSTALL_PREFIX]/bsp/lib/$$BSP @@ -45,7 +45,9 @@ contains( TEMPLATE, app ) { stflash.target = stflash stflash.commands = cd $$DESTDIR && sudo st-flash write $(QMAKE_TARGET).bin 0x08000000 - QMAKE_EXTRA_TARGETS += stflash + dfu-util.target = dfu-util + dfu-util.commands = cd $$DESTDIR && sudo dfu-util -i 0 -a 0 -d 0483:df11 -D $(QMAKE_TARGET).dfu + QMAKE_EXTRA_TARGETS += stflash dfu-util } contains( TEMPLATE, lib ) {