From 37fe295bd4da7e34b3ec4b15f82d207b433be79d Mon Sep 17 00:00:00 2001 From: Sam Calisch <s.calisch@gmail.com> Date: Fri, 28 Jul 2017 13:47:50 -0400 Subject: [PATCH] added raspberry pi programming adapter, openocd.cfg --- openocd/openocd.cfg | 23 ++ .../rpi-swd-programming-adapter-interior.png | Bin 0 -> 5512 bytes .../rpi-swd-programming-adapter-traces.png | Bin 0 -> 4356 bytes openocd/rpi-swd-programming-adapter.ko | 273 ++++++++++++++++++ 4 files changed, 296 insertions(+) create mode 100644 openocd/openocd.cfg create mode 100644 openocd/rpi-swd-programming-adapter-interior.png create mode 100644 openocd/rpi-swd-programming-adapter-traces.png create mode 100644 openocd/rpi-swd-programming-adapter.ko diff --git a/openocd/openocd.cfg b/openocd/openocd.cfg new file mode 100644 index 0000000..87dbfc5 --- /dev/null +++ b/openocd/openocd.cfg @@ -0,0 +1,23 @@ +source [find interface/raspberrypi-native.cfg] +transport select swd +#adapter_nsrst_delay 100 +#adapter_nsrst_assert_width 100 +#adapter_khz 4061 + +#set CHIPNAME nrf52832 +#set WORKAREASIZE 0 +source [find target/nrf52.cfg] +bcm2835gpio_swd_nums 25 24 +bcm2835gpio_trst_num 7 +bcm2835gpio_srst_num 18 + +#reset_config srst_only +#reset_config srst_nogate + +init +targets +reset halt +nrf52 mass_erase 0 +program feather52_bootloader_v050_s132_v201.hex verify +reset +shutdown diff --git a/openocd/rpi-swd-programming-adapter-interior.png b/openocd/rpi-swd-programming-adapter-interior.png new file mode 100644 index 0000000000000000000000000000000000000000..0a04b90e4ae7f16958dfb8e09b18e3aae5f40b48 GIT binary patch literal 5512 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 HN@xNA@vQ$^ literal 0 HcmV?d00001 diff --git a/openocd/rpi-swd-programming-adapter-traces.png b/openocd/rpi-swd-programming-adapter-traces.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e4c3777a7559edfc1f4bef8ef59a97ee23268e GIT binary patch literal 4356 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 DgVL#k literal 0 HcmV?d00001 diff --git a/openocd/rpi-swd-programming-adapter.ko b/openocd/rpi-swd-programming-adapter.ko new file mode 100644 index 0000000..a50caca --- /dev/null +++ b/openocd/rpi-swd-programming-adapter.ko @@ -0,0 +1,273 @@ +from koko.lib.pcb import * +from koko.lib.sam import * + +class TagConnectPDI(Component): + ''' + ''' + _pad = s2d.circle(0,0,.5*.031) + _via = s2d.circle(0,0,.5*.039) + pins = [ + Pin(-.05,-.025,_pad,'CLK',label_size=.02), + Pin( .00,-.025,_pad,'NC',label_size=.02), + Pin( .05,-.025,_pad,'DAT',label_size=.02), + Pin(-.05,.025,_pad,'VCC',label_size=.02), + Pin( .00,.025,_pad,'NC',label_size=.02), + Pin( .05,.025,_pad,'GND',label_size=.02) + ] + vias = [ + Via(-.1,0,_via), + Via(.1,0.04,_via), + Via(.1,-.04,_via), + + ] + +class Button(Component): + ''' SW262CT-ND + ''' + rect = rectangle(-.75/25.4,.75/25.4,-.5/25.4,.5/25.4) + pins = [ + Pin(-2/25.4,.8/25.4,rect), + Pin( 2/25.4,.8/25.4,rect), + Pin(-2/25.4,-.8/25.4,rect), + Pin( 2/25.4,-.8/25.4,rect) + ] + prefix = 'button' + vias = [] + shadow = rectangle(-2.1/25.4,2.1/25.4,-1.4/25.4,1.4/25.4) + +class TagConnectSWD(Component): + ''' + ''' + _pad = s2d.circle(0,0,.5*.031) + _via = s2d.circle(0,0,.5*.039) + pins = [ + Pin(-.05,-.025,_pad,'GND',label_size=.012), + Pin( .00,-.025,_pad,'NC',label_size=.012), + Pin( .05,-.025,_pad,'VCC',label_size=.012), + Pin(-.05,.025,_pad,'RST',label_size=.012), + Pin( .00,.025,_pad,'SWDCLK',label_size=.012), + Pin( .05,.025,_pad,'SWDIO',label_size=.012) + ] + vias = [ + Via(-.1,0,_via), + Via(.1,0.04,_via), + Via(.1,-.04,_via), + + ] + + +class Regulator_SOT23(Component): + ''' SOT23 voltage regulator + ''' + _pad_SOT23 = s2d.rectangle(-.02,.02,-.012,.012) + pins = [ + Pin(-0.045, -0.0375, _pad_SOT23,'IN'), + Pin(-0.045, 0.0375, _pad_SOT23,'OUT'), + Pin(0.045, 0, _pad_SOT23,'GND') + ] + prefix = 'U' + vias = [] + +class Crystal_FC135(Component): + ''' CRYSTAL 32.7680KHZ 12.5PF SMT + ''' + _pad = s2d.rectangle(-.5/25.4,.5/25.4,-.9/25.4,.9/25.4) + pins = [ + Pin(-1.25/25.4, 0, _pad), + Pin( 1.25/25.4, 0, _pad), + ] + prefix = 'U' + vias = [] + + +class Header_FTDI(Component): + ''' FTDI cable header + ''' + _pad_header = chamfered_rectangle(-0.06, 0.08,-0.035, 0.035,.007) + pins = [ + Pin(0, 0.25, _pad_header, 'RTS'), + Pin(0, 0.15, _pad_header, 'RX'), + Pin(0, 0.05, _pad_header, 'TX'), + Pin(0, -0.05, _pad_header, 'VCC'), + Pin(0, -0.15, _pad_header, 'CTS'), + Pin(0, -0.25, _pad_header, 'GND') + ] + prefix = 'J' + vias = [] + shadow = s2d.rectangle(-.06,8/25.4,-.3,.3) + + +class Header_RPi_SWD(Component): + ''' Header for Raspberry pi swd programming + ''' + _pad_header = chamfered_rectangle(-0.06, 0.06,-0.04, 0.04,.007) + pins = [ + Pin(0, 0.25, _pad_header, 'SWDCLK'), + Pin(0, 0.15, _pad_header, ''), + Pin(0, 0.05, _pad_header, 'SWDIO'), + Pin(0, -0.05, _pad_header, ''), + Pin(0, -0.15, _pad_header, 'GND'), + Pin(0, -0.25, _pad_header, 'nRST') + ] + prefix = 'J' + vias = [Via(p.x,p.y,circle(0,0,.018)) for p in pins] + shadow = s2d.rectangle(-.07,.07,-.3,.3) + shadow = s2d.rectangle(-.07,.07,-.3,.3) + +class Header_TC_SWD(Component): + ''' Header for tag connect swd programming + ''' + _pad_header = chamfered_rectangle(-0.04, 0.04,-0.04, 0.04,.007) + pins = [ + Pin( .05, 0.1, _pad_header, ''), + Pin( .05, 0.0, _pad_header, ''), + Pin( .05, -0.1, _pad_header, 'GND'), + Pin(-.05, 0.1, _pad_header, 'SWDIO'), + Pin(-.05, 0.0, _pad_header, 'SWDCLK'), + Pin(-.05, -0.1, _pad_header, 'nRST'), + ] + prefix = 'J' + vias = [Via(p.x,p.y,circle(0,0,.018)) for p in pins] + shadow = s2d.rectangle(-.1,.1,-.15,.15) + + +class Header_Daughter(Component): + ''' FTDI cable header + ''' + _pad_header = chamfered_rectangle(-0.03, 0.03,-0.015, 0.015,.002) + labels=['SDA','SCL','A4','A5'] + pins = [ Pin(0,.05*(i-1.5),_pad_header,l) for i,l in enumerate(labels)] + prefix = 'J' + vias = [Via(p.x,p.y,circle(0,0,.017)) for p in pins] + shadow = s2d.rectangle(-.03,.03,-.1,.1) + +def bot_chamfered_rectangle(x0,x1,y0,y1,c): + r = rectangle(x0,x1,y0,y1) + c1 = triangle(x0,y0,x0,y0+c,x0+c,y0) + c2 = triangle(x1,y1, x1, y1-c, x1-c, y1) + c3 = triangle(x0,y1, x0+c, y1, x0, y1-c) + c4 = triangle(x1,y0, x1-c, y0, x1, y0+c) + return r-c2-c3 + +class CR20XX(Component): + #coin cell battery, e.g. 2032 + pins = [ + Pin(0,0,circle(0,0,5./25.4),'-') + ] + shadow = circle(0,0,10./25.4) + vias = [] + +class AAA(Component): + #AAA battery smd holder + pad = chamfered_rectangle(-.125,.125,-.12,.12,.05) + pins = [ + Pin(1.21-.125,0,pad,'+',label_size=.08), + Pin(-1.21+.125,0,pad,'-',label_size=.08), + ] + shadow = rectangle(-1.07,1.07,-.25,.25) + vias = [ + Via(-1.21+.25,.209,circle(0,0,.039)) + ] + +class MDBT42(Component): + #Raytach nrf52 module + p = .7/25.4 + pad_hw = .15/25.4 + pad_hh = .8/25.4 + _padv = rectangle(-pad_hw,pad_hw,-pad_hh,pad_hh) + _padh = rectangle(-pad_hh,pad_hh,-pad_hw,pad_hw) + _padg = rectangle(-pad_hh,pad_hh,-.35/25.4,.4/25.4) + c= 5/25.4 + start_y = 11.8/25.4 + start_x = .8/25.4 + y_os = .25 + names = [ + 'GND1','SDA','SCL','P27','A4','A5','A6','A7','DEC4','DCC','VDD', + 'GND2','XL1','XL2','P2','P3','P4','P5','P6','P7','P8','P9','P10','GND3', + 'P11','P12','P13','P14','P15','P16','P17','P18','P19','P20','RESET','SWDCLK','SWDIO','P22','GND4' + ] + pins = [Pin(-c,start_y-y_os,_padg,n,label_size=.018) for i,n in enumerate(names[:1])] + pins += [Pin(-c,start_y-3./25.4-i*p-y_os,_padh,n,label_size=.018) for i,n in enumerate(names[1:11])] + pins += [Pin(-c+start_x+i*p,-y_os,_padv,n,label_size=.018,label_rot=-90) for i,n in enumerate(names[11:24])] + pins += [Pin(c,start_y-.9/25.4-i*p-y_os,_padh,n,label_size=.018) for i,n in enumerate(names[24:38][::-1])] + pins += [Pin(c,start_y-y_os,_padg,n,label_size=.018) for i,n in enumerate(names[38:])] + vias = [] + shadow = rectangle(-c,c,-y_os,start_y+4.2/25.4-y_os) + + +class BT832(Component): + #Fanstel BT832 nrf52 module + p = 1.1/25.4 + pad_hw = .7/25.4 + pad_hh = .35/25.4 + _pad = rectangle(-pad_hw,pad_hw,-pad_hh,pad_hh) + c= 7/25.4 + start_y = 1.1/25.4 + y_os = .25 + names = [ + 'SDA','SCL','XL1','XL2','AIN0','AIN1','NFC1','NFC2', + 'VCC','GND','P13','P18','P20','RESET','SWDCLK','SWDIO' + ] + pins = [Pin(-c,start_y+i*p-y_os,_pad,n,label_size=.018) for i,n in enumerate(names[:8][::-1])] + pins += [Pin(c,start_y+i*p-y_os,_pad,n,label_size=.018) for i,n in enumerate(names[8:16])] + vias = [] + shadow = rectangle(-c,c,-y_os,16/25.4-y_os) + +class BC832(Component): + #Fanstel BC832 micro nrf52 module + p = 1.1/25.4 + pad_hw = .7/25.4 + pad_hh = .35/25.4 + _pad = rectangle(-pad_hw,pad_hw,-pad_hh,pad_hh) + c= 3.9/25.4 + start_y = .618/25.4 + y_os = .18 + names = [ + 'P26/SDA','P27/SCL','XL1','XL2','AIN0','AIN1','P9/NFC1','P10/NFC2', + 'VCC','GND','P13','P18','P20','RESET','SWDCLK','SWDIO' + ] + pins = [Pin(-c,start_y+i*p-y_os,_pad,n,label_size=.018) for i,n in enumerate(names[:8][::-1])] + pins += [Pin(c,start_y+i*p-y_os,_pad,n,label_size=.018) for i,n in enumerate(names[8:16])] + vias = [] + shadow = rectangle(-c,c,-y_os,8.8/25.4-y_os) + + +class Hole(Component): + pins = [Pin(0,0,circle(0,0,0.01))] + vias = [Via(0,0,circle(0,0,.5*2.1/25.4))] + tap = circle(0,0,.5*1.9/25.5) + + +width = .6 +height = .45 +pcb = PCB(0,0,width,height,chamfer_distance=.03) + + +def connectG(pin,dx,dy,width=.012): + ''' + Convenience function for connecting to ground plane + ''' + pcb.connectD(pin,[pin.x+dx,pin.y+dy],[pin.x+dx-.0001,pin.y+dy],width=width,sides=[0,1,1]) +def connectS(pin,dx,dy,width=.012): + pcb.connectD(pin,[pin.x+dx+.0001,pin.y+dy],width=width) +def connectM(pin1,pin2,dx,width=.012): + pcb.connectD(pin1,[pin1.x+dx,pin1.y],pin2,width=width) + + +rpi = Header_RPi_SWD(.5*width,.35,90,'rpi') +pcb += rpi + +tc = Header_TC_SWD(rpi.x+.05,rpi.y-.21,90,'tc') +pcb += tc + +pcb.connectH(tc['SWDCLK'],[tc['SWDCLK'].x,tc['SWDCLK'].y-.07],rpi['SWDCLK']) +pcb.connectH(tc['SWDIO'],[tc['SWDIO'].x-.1,rpi['SWDCLK'].y-.09],rpi['SWDIO']) +pcb.connectH(tc['nRST'],rpi['nRST']) +pcb.connectH(tc['GND'],rpi['GND']) + +eps = .02 +extra = rectangle(-eps,width+eps,-eps,height+eps) + +cad.shapes = pcb.layout() +#cad.shape = pcb.traces+(pcb.cutout-pcb.cutout)+(extra-extra) +#cad.shape = pcb.cutout+(pcb.traces-pcb.traces)+(extra-extra) -- GitLab