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
zcmeAS@N?(olHy`uVBq!ia0y~yU}0cjU=|QyU|?W4Gkppt0|NtRfk$L91H-Eb5N52d
zf9}h`Ah6BT#WAE}&fB{OH{Cul(IN1{!vFtM&mHQ1*~#gxW#15bruy8uhXQg&(mFAL
zc|Ui7j2oWV;(GRX-ajXQ@BPj9?#r(O`_yyK><hbjL+W=_a{Ow$jT`^pyJ&9yHgLzf
z=ko2D(wo<Zp3gh8FU<G$jM}wUmW=<l{${I7zqk0q7oX2&Y4NMo&V5nw2Wc+-<io!G
z<jL&cGnaQ2ygK$K`>HWWbFg_@{A$0yVh=9dp7lo~=DKnJ;U~Q}udn(I5?9MVvoCD!
zOosM<f(PEXKkWRO1`_a{|2}Wt2Geg_U!D2c$J1aOUb?<Iea?Qv-?y^=9kWTyev^H*
z(^&4u)+3$SRmWoExk5qicz1I~?b=m2AoISlGaj#HzECOhZr0Y#hQFgiXMN>^n71X8
z|MkSn*FNu=FP4~_{B7&2bdVFbg4{ECAFIVX>4sVJZU61%@2~x+<9}n;y(5!37#KK&
z7#IXp7#I{h7#JKTFfcSIFfuSWGBGeTu`n>OaE>Y%4Tph953~2i{jU3JzDa-HQ_kqi
zvnwV&{`YY2{oU^$On&#{!xT`KsM`lh{I@{)R(nR@u9@|(ZTQM<xu$}Wdo@Ub7AW<n
z@BP=$({So>!SlrdH)hnX-IbsGZR@HHhQFgqZ@vD1fkDHDuiT#NGAO&gyE~(H?JSU~
zrT1R{zrir$pM}jw4WD};UG>S|wq|_-W&6(c|C^Z;K0W?$WwAjiD3i?uS-28x*S>%K
zd<`r64^QqtbOa>&9OMi&Q28?V*Dre;1~ofAe|xUWAkleX%eH~s@$U8i9}F|TS=2lV
zoUz65chuKEAbXa84454MKVE?0dsO|FbN`MX&$LOj$^Oc@+CJWH;{M0$nb-zJUR@Bs
zJHO%mr@H^2?f1t0f4TqR`#;6a4D(eOeq{guFZzBd|A)1I1R3g2o|a1xy3g=Ie9s@o
zWgmGN>Yse&H|S?*$o=Eb&{)gDQ2*fje+FSrh8u1%jK4V;>P~BOC8!Zm6y5&upNZj{
zAh-}q5Z?cvy-bK<L+f?>4bvGKc=!BkyvxE+Gv~VfhWqR9nltFe{W~DZ!m#~Q74r|i
ze;k9PkgI#UkMYLqzxQg{zgO<H`xu;)bM{{C-QSn(Kev3;+{dVpd+GEW<I6X0WZFNR
zoaWoippbK~@Y@#`v$9K9%V(Ge&SX%?eir!cNr+k5sj20&EJG(VC}h1e{B|Y9tn5&z
zzd`vXDMp7&Z<OD3zRbz_F6wVoy^D|0;liKCuitUz<~+aZXHtKNiP6FD@rzx>UedQq
zmrgcaHpiDi;IiemceAb>D~ow5U7|MEi($egt4;4_Tsvl0+nRrAR+${5gU9<Fzg`|O
z`*t$^Z*P^bztU(eGKg!_h6&fRzsnZvns2K-&tP9CgTm4>hyNvUzkmG^-RGTqFOr49
za4GZazR0)P=R@~7XI|@MVX&O){Cb_`+wA*O&xOq_)?;)Cc=%vfvD@!k)mx24)8_aw
zOfdQTVOO=??_2dpH~Y+A@5mrv`jeqL$?Uh)<5lT1Y@$0E6tZ6_e!CL$t@PZ~@3XAJ
z`xz8+9yxw{;`6Qa+STtfEP|&pDCFKs{PxA>Tj@RjA8Rr{Z{cKkq$Zm&f5y>$r*d+p
z#qZ8%C@WsEcH?@}Z%0?wFb_ms#31k``#bM}y!YSVS?@Ug`fKO>r1;f2J;p!T8g^K=
ze@;)^xZb$_RJzYBRz`<ATbSRztbFr&&-@ROm!D+{Gqm{HoS8T0<i2yee#r@^uM%QN
z@wGiMZ`SF3=XQRI3x57ekio^*?#R3uXZM}k@k&zde3%l0$E>=BySDRd-|l}Dx$OLP
z1qKc+nYi+E8S&NY%a$GLxy;E>q{V(cw)ocdecE%^8a<C;YM60pVd?QT-?l#2y1&rm
zwF^_jlv|BoFIT>O{W<)H-qy-=L53EKH9sc9;(m~}@_udo%{JpHs31I`{_{+|{(WeZ
z^!2WFufN`^WuFger+$cDE64UifPtalYu#aGNTGA!>hEwVR)+ndza1Dtpv~HX*zmX3
z{%Cc`j&-ZQg)>6hwSU4^w=-I?FfhdIz5fBC>5t>u&c<c;BGnmwEWUS~X@%yzVy1@u
z0e><WWX~G=F?<N0CC|TLLDjy$w`!Sdy05SPRzHRDOnB|j_~{G@C%4y!u<+b@d)vR&
zsGenDQYs{b2)5(}K2^Ql*X;irrS$g5lnpQU$xfcX?~r+>uXR6z!m{F&yQV99-|jeN
z{=&y<DucrE!koL7OMBn$x^z-1_?#L8$E^C2yS58^-|o59`OH5;fx%-|ZH=wr+}^kQ
z9(ktuUsq)4m{r|kYdW)cZoyUIGjrFtF-$Q1EKyygC2jrml=ay;t2`M5%-(BMS1Czb
zzkFqVX7&mnh6!e`Eq)&{F)O>}|6@tyWr5$vf7Y%4$Hi}Bllj&7r7&mtN8UlwH36l9
z<<<Mk?=v#oId9IuARxls04ik}4sa$hGBCtUXJBYp62tJrnSp_Wje$Xchv9#eJOc|e
z1A_nq!vqm-hI$4DhU-(g85kbyVqsuV0VT^W)`tCT91QEU#TgEmPySFK4@$s089rEZ
zfXw)?_KEc!&7X~*t}`C|{_$6PwX1!Q5W~Li>-Kkae=nTG@WFP^zlU`%`=@d=6z_@q
z|5EtnSAPE!^&4Cm-hAJ`{>T5{onKzD500LH!}%ZbyOUBDZ{!v}2Xc|8tDnm{r-UW|
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