Compare commits

...

2 Commits

Author SHA1 Message Date
c4529a8447 preparing code base 2025-03-25 17:59:27 +03:00
6701ac841b finish, add gerbers 2025-03-21 17:08:44 +03:00
51 changed files with 54975 additions and 4400 deletions

View File

@ -0,0 +1,9 @@
BINARY := encoders
# MCU code
MCU ?= F103x8
# change this linking script depending on particular MCU model,
LDSCRIPT ?= stm32f103x8.ld
DEFINES := -DSTM32F10X_MD
include ../makefile.f1
include ../../makefile.stm32

View File

@ -0,0 +1,5 @@
Get data from 2 encoders by BISS-C protocol
===========================================
tl;dr

Binary file not shown.

View File

@ -0,0 +1 @@
-std=c17

View File

@ -0,0 +1,6 @@
#define EBUG
#define STM32F1
#define STM32F103x8
#define STM32F10X_MD
#define BUILD_NUMBER 1
#define BUILD_DATE "xx"

View File

@ -0,0 +1 @@
[General]

View File

@ -0,0 +1,183 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 15.0.0, 2025-01-08T17:55:30. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{7bd84e39-ca37-46d3-be9d-99ebea85bc0d}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">KOI8-R</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">false</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<value type="bool" key="AutoTest.ApplyFilter">false</value>
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">8</value>
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{65a14f9e-e008-4c1b-89df-4eaa4774b6e3}</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Default</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericBuildConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="QList&lt;int&gt;" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@ -0,0 +1 @@
-std=c++17

View File

@ -0,0 +1,17 @@
hardware.c
hardware.h
main.c
proto.c
proto.h
ringbuffer.c
ringbuffer.h
strfunc.c
strfunc.h
usart.c
usart.h
usb_descr.c
usb_descr.h
usb_lib.c
usb_lib.h
usb_dev.c
usb_dev.h

View File

@ -0,0 +1,6 @@
.
../inc
../inc/Fx
../inc/cm
../inc/ld
../inc/startup

View File

@ -0,0 +1,50 @@
/*
* Copyright 2024 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hardware.h"
static inline void gpio_setup(){
// Enable clocks to the GPIO subsystems (PB for ADC), turn on AFIO clocking to disable SWD/JTAG
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
// turn off SWJ/JTAG
// AFIO->MAPR = AFIO_MAPR_SWJ_CFG_DISABLE;
AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // for PA15
// Set led as opendrain output
GPIOC->CRH |= CRH(13, CNF_ODOUTPUT|MODE_SLOW);
// USB pullup (PA15) - pushpull output
GPIOA->CRH = CRH(15, CNF_PPOUTPUT|MODE_SLOW);
}
void hw_setup(){
gpio_setup();
}
#ifndef EBUG
void iwdg_setup(){
uint32_t tmout = 16000000;
RCC->CSR |= RCC_CSR_LSION;
while((RCC->CSR & RCC_CSR_LSIRDY) != RCC_CSR_LSIRDY){if(--tmout == 0) break;} /* (2) */
IWDG->KR = IWDG_START;
IWDG->KR = IWDG_WRITE_ACCESS;
IWDG->PR = IWDG_PR_PR_1;
IWDG->RLR = 1250;
tmout = 16000000;
while(IWDG->SR){if(--tmout == 0) break;}
IWDG->KR = IWDG_REFRESH;
}
#endif

View File

@ -0,0 +1,37 @@
/*
* Copyright 2024 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "stm32f1.h"
// LED0 - PC13 (bluepill), blinking each second
#define LED0_port GPIOC
#define LED0_pin (1<<13)
// USB pullup (not present in bluepill, should be soldered) - PA15
#define USBPU_port GPIOA
#define USBPU_pin (1<<15)
#define USBPU_ON() pin_set(USBPU_port, USBPU_pin)
#define USBPU_OFF() pin_clear(USBPU_port, USBPU_pin)
#define LED_blink(x) pin_toggle(x ## _port, x ## _pin)
#define LED_on(x) pin_clear(x ## _port, x ## _pin)
#define LED_off(x) pin_set(x ## _port, x ## _pin)
void hw_setup();
void iwdg_setup();

View File

@ -0,0 +1,94 @@
/*
* This file is part of the I2Cscan project.
* Copyright 2020 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hardware.h"
#include "proto.h"
#include "strfunc.h"
#include "usart.h"
#include "usb_dev.h"
volatile uint32_t Tms = 0;
/* Called when systick fires */
void sys_tick_handler(void){
++Tms;
}
int main(){
char inbuff[RBINSZ];
uint32_t lastT = 0, lastS = 0;
StartHSE();
hw_setup();
USBPU_OFF();
SysTick_Config(72000);
#ifdef EBUG
usart_setup();
DBG("Start");
uint32_t tt = 0;
#endif
USB_setup();
#ifndef EBUG
iwdg_setup();
#endif
USBPU_ON();
while (1){
IWDG->KR = IWDG_REFRESH; // refresh watchdog
if(Tms - lastT > 499){
LED_blink(LED0);
lastT = Tms;
}
#ifdef EBUG
if(Tms != tt){
__disable_irq();
usart_transmit();
tt = Tms;
__enable_irq();
}
#endif
if(CDCready[I_CMD]){
if(Tms - lastS > 9999){
USB_sendstr(I_CMD, "Tms=");
USB_sendstr(I_CMD, u2str(Tms));
newline(I_CMD);
lastS = Tms;
}
int l = USB_receivestr(I_CMD, inbuff, RBINSZ);
if(l < 0) CMDWRn("ERROR: CMD USB buffer overflow or string was too long");
else if(l) parse_cmd(inbuff);
}
if(CDCready[I_X]){
int l = USB_receivestr(I_X, inbuff, RBINSZ);
if(l < 0) CMDWRn("ERROR: encX USB buffer overflow or string was too long");
else if(l){
CMDWR("EncX got: '");
CMDWR(inbuff);
CMDWR("'\n");
}
}
if(CDCready[I_Y]){
int l = USB_receivestr(I_Y, inbuff, RBINSZ);
if(l < 0) CMDWRn("ERROR: encY USB buffer overflow or string was too long");
else if(l){
CMDWR("EncY got: '");
CMDWR(inbuff);
CMDWR("'\n");
}
}
}
return 0;
}

View File

@ -0,0 +1,4 @@
set FLASH_SIZE 0x10000
source [find interface/stlink-v2-1.cfg]
source [find target/stm32f1x.cfg]

View File

@ -0,0 +1,170 @@
/*
* This file is part of the encoders project.
* Copyright 2025 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include "proto.h"
#include "strfunc.h"
#include "usb_dev.h"
#include "version.inc"
// commands indexes
typedef enum{
C_dummy,
C_help,
C_sendX,
C_sendY,
C_AMOUNT
} cmd_e;
// error codes
typedef enum {
ERR_OK, // no errors
ERR_FAIL, // failed to run command
ERR_BADCMD, // bad command
ERR_BADPAR, // bad parameter (absent or wrong value)
ERR_SILENCE, // getter or other - don't need to send "OK"
ERR_AMOUNT
} errcode_e;
static const char* const errors[ERR_AMOUNT] = {
[ERR_OK] = "OK",
[ERR_FAIL] = "FAIL",
[ERR_BADCMD] = "BADCMD",
[ERR_BADPAR] = "BADPAR",
[ERR_SILENCE] = "",
};
// command handler (idx - index of command in list, par - all after equal sign in "cmd = par")
typedef errcode_e (*handler_t)(cmd_e idx, char *par);
typedef struct{
const char* cmd; // command
handler_t handler; // handler function
} funcdescr_t;
static const funcdescr_t commands[C_AMOUNT];
// getter for integer parameter
#define IGETTER(idx, ival) do{CMDWR(commands[idx].cmd); USB_putbyte(I_CMD, '='); \
CMDWR(i2str(ival)); CMDn(); return ERR_SILENCE; }while(0)
static errcode_e help(cmd_e idx, char* par);
static errcode_e dummy(cmd_e idx, char *par){
static int32_t val = -111;
if(par && *par){
int32_t i;
char *nxt = getint(par, &i);
DBGs(par);
DBGs(nxt);
if(par == nxt) return ERR_BADPAR;
val = i;
}
IGETTER(idx, val);
}
static errcode_e sendenc(cmd_e idx, char *par){
if(!par || !*par) return ERR_BADPAR;
switch(idx){
case C_sendX:
if(!CDCready[I_X]) return ERR_FAIL;
if(!USB_sendstr(I_X, par)) return ERR_FAIL;
newline(I_X);
break;
case C_sendY:
if(!CDCready[I_Y]) return ERR_FAIL;
if(!USB_sendstr(I_Y, par)) return ERR_FAIL;
newline(I_Y);
break;
default:
return ERR_BADCMD;
}
return ERR_OK;
}
// text commands
static const funcdescr_t commands[C_AMOUNT] = {
[C_dummy] = {"dummy", dummy},
[C_help] = {"help", help},
[C_sendX] = {"sendx", sendenc},
[C_sendY] = {"sendy", sendenc},
};
typedef struct{
int idx; // command index (if < 0 - just display `help` as grouping header)
const char *help; // help message
} help_t;
// SHOUL be sorted and grouped
static const help_t helpmessages[] = {
{-1, "Different commands"},
{C_dummy, "dummy integer setter/getter"},
{C_help, "show this help"},
{-1, "Debug commands"},
{C_sendX, "send text string to X encoder"},
{C_sendY, "send text string to Y encoder"},
{-1, NULL},
};
static errcode_e help(_U_ cmd_e idx, _U_ char* par){
CMDWRn("https://github.com/eddyem/stm32samples/tree/master/F1:F103/ build #" BUILD_NUMBER " @ " BUILD_DATE);
CMDWRn("commands format: command[=setter]\\n");
const help_t *c = helpmessages;
while(c->help){
if(c->idx < 0){ // header
CMDWR("\n ");
CMDWR(c->help);
USB_putbyte(I_CMD, ':');
}else{
CMDWR(commands[c->idx].cmd);
CMDWR(" - ");
CMDWR(c->help);
}
CMDn();
++c;
}
return ERR_OK;
}
// *cmd is "command" for commands/getters or "parameter=value" for setters
void parse_cmd(char *cmd){
errcode_e ecode = ERR_BADCMD;
// command and its parameter
char *cmdstart = omit_spaces(cmd), *parstart = NULL;
if(!cmdstart) goto retn;
char *ptr = cmdstart;
while(*ptr > '@') ++ptr;
if(*ptr && *ptr <= ' '){ // there's spaces after command
*ptr++ = 0;
ptr = omit_spaces(ptr);
}
if(*ptr){ // check rest of string
if(*ptr != '=') goto retn; // strange symbols after command name
*ptr++ = 0;
parstart = omit_spaces(ptr); // get parameter
if(*parstart <= ' ') goto retn; // no parameter after equal sign
}
int idx = 0;
for(; idx < C_AMOUNT; ++idx) // search in command lists
if(0 == strcmp(commands[idx].cmd, cmdstart)) break;
if(idx >= C_AMOUNT) goto retn; // not found
ecode = commands[idx].handler(idx, parstart);
retn:
if(ecode != ERR_SILENCE) CMDWRn(errors[ecode]);
}

View File

@ -0,0 +1,21 @@
/*
* This file is part of the encoders project.
* Copyright 2025 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
void parse_cmd(char *cmd);

View File

@ -0,0 +1,166 @@
/*
* Copyright 2023 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ringbuffer.h"
static int datalen(ringbuffer *b){
if(b->tail >= b->head) return (b->tail - b->head);
else return (b->length - b->head + b->tail);
}
// stored data length
int RB_datalen(ringbuffer *b){
if(b->busy) return -1;
b->busy = 1;
int l = datalen(b);
b->busy = 0;
return l;
}
static int hasbyte(ringbuffer *b, uint8_t byte){
if(b->head == b->tail) return -1; // no data in buffer
int startidx = b->head;
if(b->head > b->tail){ //
for(int found = b->head; found < b->length; ++found)
if(b->data[found] == byte) return found;
startidx = 0;
}
for(int found = startidx; found < b->tail; ++found)
if(b->data[found] == byte) return found;
return -1;
}
/**
* @brief RB_hasbyte - check if buffer has given byte stored
* @param b - buffer
* @param byte - byte to find
* @return index if found, -1 if none or busy
*/
int RB_hasbyte(ringbuffer *b, uint8_t byte){
if(b->busy) return -1;
b->busy = 1;
int ret = hasbyte(b, byte);
b->busy = 0;
return ret;
}
// poor memcpy
static void mcpy(uint8_t *targ, const uint8_t *src, int l){
while(l--) *targ++ = *src++;
}
// increment head or tail
TRUE_INLINE void incr(ringbuffer *b, volatile int *what, int n){
*what += n;
if(*what >= b->length) *what -= b->length;
}
static int read(ringbuffer *b, uint8_t *s, int len){
int l = datalen(b);
if(!l) return 0;
if(l > len) l = len;
int _1st = b->length - b->head;
if(_1st > l) _1st = l;
if(_1st > len) _1st = len;
mcpy(s, b->data + b->head, _1st);
if(_1st < len && l > _1st){
mcpy(s+_1st, b->data, l - _1st);
incr(b, &b->head, l);
return l;
}
incr(b, &b->head, _1st);
return _1st;
}
/**
* @brief RB_read - read data from ringbuffer
* @param b - buffer
* @param s - array to write data
* @param len - max len of `s`
* @return bytes read or -1 if busy
*/
int RB_read(ringbuffer *b, uint8_t *s, int len){
if(b->busy) return -1;
b->busy = 1;
int r = read(b, s, len);
b->busy = 0;
return r;
}
static int readto(ringbuffer *b, uint8_t byte, uint8_t *s, int len){
int idx = hasbyte(b, byte);
if(idx < 0) return 0;
int partlen = idx + 1 - b->head;
// now calculate length of new data portion
if(idx < b->head) partlen += b->length;
if(partlen > len) return -read(b, s, len);
return read(b, s, partlen);
}
/**
* @brief RB_readto fill array `s` with data until byte `byte` (with it)
* @param b - ringbuffer
* @param byte - check byte
* @param s - buffer to write data
* @param len - length of `s`
* @return amount of bytes written (negative, if len<data in buffer or buffer is busy)
*/
int RB_readto(ringbuffer *b, uint8_t byte, uint8_t *s, int len){
if(b->busy) return -1;
b->busy = 1;
int n = readto(b, byte, s, len);
b->busy = 0;
return n;
}
static int write(ringbuffer *b, const uint8_t *str, int l){
int r = b->length - 1 - datalen(b); // rest length
if(l > r || !l) return 0;
int _1st = b->length - b->tail;
if(_1st > l) _1st = l;
mcpy(b->data + b->tail, str, _1st);
if(_1st < l){ // add another piece from start
mcpy(b->data, str+_1st, l-_1st);
}
incr(b, &b->tail, l);
return l;
}
/**
* @brief RB_write - write some data to ringbuffer
* @param b - buffer
* @param str - data
* @param l - length
* @return amount of bytes written or -1 if busy
*/
int RB_write(ringbuffer *b, const uint8_t *str, int l){
if(b->busy) return -1;
b->busy = 1;
int w = write(b, str, l);
b->busy = 0;
return w;
}
// just delete all information in buffer `b`
int RB_clearbuf(ringbuffer *b){
if(b->busy) return -1;
b->busy = 1;
b->head = 0;
b->tail = 0;
b->busy = 0;
return 1;
}

View File

@ -0,0 +1,41 @@
/*
* Copyright 2023 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#if defined STM32F0
#include <stm32f0.h>
#elif defined STM32F1
#include <stm32f1.h>
#elif defined STM32F3
#include <stm32f3.h>
#endif
typedef struct{
uint8_t *data; // data buffer
const int length; // its length
int head; // head index
int tail; // tail index
volatile int busy; // == TRUE if buffer is busy now
} ringbuffer;
int RB_read(ringbuffer *b, uint8_t *s, int len);
int RB_readto(ringbuffer *b, uint8_t byte, uint8_t *s, int len);
int RB_hasbyte(ringbuffer *b, uint8_t byte);
int RB_write(ringbuffer *b, const uint8_t *str, int l);
int RB_datalen(ringbuffer *b);
int RB_clearbuf(ringbuffer *b);

View File

@ -0,0 +1,266 @@
/*
* This file is part of the encoders project.
* Copyright 2025 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stm32f1.h>
#include <string.h>
/**
* @brief hexdump - dump hex array by 16 bytes in string
* @param sendfun - function to send data
* @param arr - array to dump
* @param len - length of `arr`
*/
void hexdump(int (*sendfun)(const char *s), uint8_t *arr, uint16_t len){
char buf[52], *bptr = buf;
for(uint16_t l = 0; l < len; ++l, ++arr){
for(int16_t j = 1; j > -1; --j){
register uint8_t half = (*arr >> (4*j)) & 0x0f;
if(half < 10) *bptr++ = half + '0';
else *bptr++ = half - 10 + 'a';
}
if(l % 16 == 15){
*bptr++ = '\n';
*bptr = 0;
sendfun(buf);
bptr = buf;
}else *bptr++ = ' ';
}
if(bptr != buf){
*bptr++ = '\n';
*bptr = 0;
sendfun(buf);
}
}
/**
* @brief _2str - convert value into string buffer
* @param val - |value|
* @param minus - ==0 if value > 0
* @return buffer with number
*/
static char *_2str(uint32_t val, uint8_t minus){
static char strbuf[12];
char *bufptr = &strbuf[11];
*bufptr = 0;
if(!val){
*(--bufptr) = '0';
}else{
while(val){
uint32_t x = val / 10;
*(--bufptr) = (val - 10*x) + '0';
val = x;
}
}
if(minus) *(--bufptr) = '-';
return bufptr;
}
// return string with number `val`
char *u2str(uint32_t val){
return _2str(val, 0);
}
char *i2str(int32_t i){
uint8_t minus = 0;
uint32_t val;
if(i < 0){
minus = 1;
val = -i;
}else val = i;
return _2str(val, minus);
}
/**
* @brief uhex2str - print 32bit unsigned int as hex
* @param val - value
* @return string with number
*/
char *uhex2str(uint32_t val){
static char buf[12] = "0x";
int npos = 2;
uint8_t *ptr = (uint8_t*)&val + 3;
int8_t i, j, z=1;
for(i = 0; i < 4; ++i, --ptr){
if(*ptr == 0){ // omit leading zeros
if(i == 3) z = 0;
if(z) continue;
}
else z = 0;
for(j = 1; j > -1; --j){
uint8_t half = (*ptr >> (4*j)) & 0x0f;
if(half < 10) buf[npos++] = half + '0';
else buf[npos++] = half - 10 + 'a';
}
}
buf[npos] = 0;
return buf;
}
/**
* @brief omit_spaces - eliminate leading spaces and other trash in string
* @param buf - string
* @return - pointer to first character in `buf` > ' '
*/
char *omit_spaces(char *buf){
while(*buf){
if(*buf > ' ') break;
++buf;
}
return buf;
}
/**
* @brief getdec - read decimal number & return pointer to next non-number symbol
* @param buf - string
* @param N - number read
* @return Next non-number symbol. In case of overflow return `buf` and N==0xffffffff
*/
static char *getdec(char *buf, uint32_t *N){
char *start = (char*)buf;
uint32_t num = 0;
while(*buf){
char c = *buf;
if(c < '0' || c > '9'){
break;
}
if(num > 429496729 || (num == 429496729 && c > '5')){ // overflow
*N = 0xffffff;
return start;
}
num *= 10;
num += c - '0';
++buf;
}
*N = num;
return buf;
}
// read hexadecimal number (without 0x prefix!)
static char *gethex(char *buf, uint32_t *N){
char *start = buf;
uint32_t num = 0;
while(*buf){
char c = *buf;
uint8_t M = 0;
if(c >= '0' && c <= '9'){
M = '0';
}else if(c >= 'A' && c <= 'F'){
M = 'A' - 10;
}else if(c >= 'a' && c <= 'f'){
M = 'a' - 10;
}
if(M){
if(num & 0xf0000000){ // overflow
*N = 0xffffff;
return start;
}
num <<= 4;
num += c - M;
}else{
break;
}
++buf;
}
*N = num;
return buf;
}
// read octal number (without 0 prefix!)
static char *getoct(char *buf, uint32_t *N){
char *start = (char*)buf;
uint32_t num = 0;
while(*buf){
char c = *buf;
if(c < '0' || c > '7'){
break;
}
if(num & 0xe0000000){ // overflow
*N = 0xffffff;
return start;
}
num <<= 3;
num += c - '0';
++buf;
}
*N = num;
return buf;
}
// read binary number (without b prefix!)
static char *getbin(char *buf, uint32_t *N){
char *start = (char*)buf;
uint32_t num = 0;
while(*buf){
char c = *buf;
if(c < '0' || c > '1'){
break;
}
if(num & 0x80000000){ // overflow
*N = 0xffffff;
return start;
}
num <<= 1;
if(c == '1') num |= 1;
++buf;
}
*N = num;
return buf;
}
/**
* @brief getnum - read uint32_t from string (dec, hex or bin: 127, 0x7f, 0b1111111)
* @param buf - buffer with number and so on
* @param N - the number read
* @return pointer to first non-number symbol in buf
* (if it is == buf, there's no number or if *N==0xffffffff there was overflow)
*/
char *getnum(char *txt, uint32_t *N){
char *nxt = NULL;
char *s = omit_spaces(txt);
if(*s == '0'){ // hex, oct or 0
if(s[1] == 'x' || s[1] == 'X'){ // hex
nxt = gethex(s+2, N);
if(nxt == s+2) nxt = (char*)txt;
}else if(s[1] > '0'-1 && s[1] < '8'){ // oct
nxt = getoct(s+1, N);
if(nxt == s+1) nxt = (char*)txt;
}else{ // 0
nxt = s+1;
*N = 0;
}
}else if(*s == 'b' || *s == 'B'){
nxt = getbin(s+1, N);
if(nxt == s+1) nxt = (char*)txt;
}else{
nxt = getdec(s, N);
if(nxt == s) nxt = (char*)txt;
}
return nxt;
}
// get signed integer
char *getint(char *txt, int32_t *I){
char *s = omit_spaces(txt);
int32_t sign = 1;
uint32_t U;
if(*s == '-'){
sign = -1;
++s;
}
char *nxt = getnum(s, &U);
if(nxt == s) return txt;
if(U & 0x80000000) return txt; // overfull
*I = sign * (int32_t)U;
return nxt;
}

View File

@ -0,0 +1,30 @@
/*
* This file is part of the encoders project.
* Copyright 2025 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
void hexdump(int (*sendfun)(const char *s), uint8_t *arr, uint16_t len);
char *u2str(uint32_t val);
char *i2str(int32_t i);
char *uhex2str(uint32_t val);
char *getnum(char *txt, uint32_t *N);
char *omit_spaces(char *buf);
char *getint(char *txt, int32_t *I);

View File

@ -0,0 +1,100 @@
/*
* usart.c
*
* Copyright 2018 Edward V. Emelianoff <eddy@sao.ru, edward.emelianoff@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <string.h>
#include "stm32f1.h"
#include "usart.h"
#include "ringbuffer.h"
extern volatile uint32_t Tms;
// buffers for out ringbuffer and DMA send
static uint8_t buf[UARTBUFSZ], txbuf[UARTBUFSZ];
static ringbuffer ringbuf = {.data = buf, .length = UARTBUFSZ};
static volatile int usart_txrdy = 1; // transmission done
// transmit current tbuf
void usart_transmit(){
if(RB_hasbyte(&ringbuf, '\n') < 0 || !usart_txrdy) return;
int L = 0, l = 0;
do{
l = RB_readto(&ringbuf, '\n', txbuf + L, UARTBUFSZ - L);
if(l > 0) L += l;
}while(l > 0 && L < UARTBUFSZ);
if(L < 1) return;
usart_txrdy = 0;
if(L < UARTBUFSZ-1){
txbuf[L++] = '$'; txbuf[L++] = '\n';
}
DMA1_Channel4->CCR &= ~DMA_CCR_EN;
DMA1_Channel4->CMAR = (uint32_t) txbuf; // mem
DMA1_Channel4->CNDTR = L;
DMA1_Channel4->CCR |= DMA_CCR_EN;
}
void usart_putchar(const char ch){
RB_write(&ringbuf, (const uint8_t*)&ch, 1);
}
void usart_send(const char *str){
int l = strlen(str);
if(RB_datalen(&ringbuf) > UARTBUFSZ/2) usart_transmit();
RB_write(&ringbuf, (const uint8_t*)str, l);
}
/*
* USART speed: baudrate = Fck/(USARTDIV)
* USARTDIV stored in USART->BRR
*
* for 72MHz USARTDIV=72000/f(kboud); so for 115200 USARTDIV=72000/115.2=625 -> BRR=0x271
* 9600: BRR = 7500 (0x1D4C)
*/
void usart_setup(){
uint32_t tmout = 16000000;
// PA9 - Tx, PA10 - Rx
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_AFIOEN;
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
GPIOA->CRH |= CRH(9, CNF_AFPP|MODE_NORMAL) | CRH(10, CNF_FLINPUT|MODE_INPUT);
// USART1 Tx DMA - Channel4 (Rx - channel 5)
DMA1_Channel4->CPAR = (uint32_t) &USART1->DR; // periph
DMA1_Channel4->CCR |= DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE; // 8bit, mem++, mem->per, transcompl irq
// Tx CNDTR set @ each transmission due to data size
NVIC_SetPriority(DMA1_Channel4_IRQn, 3);
NVIC_EnableIRQ(DMA1_Channel4_IRQn);
NVIC_SetPriority(USART1_IRQn, 0);
// setup usart1
USART1->BRR = 72000000 / 4000000;
USART1->CR1 = USART_CR1_TE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART
while(!(USART1->SR & USART_SR_TC)){if(--tmout == 0) break;} // polling idle frame Transmission
USART1->SR = 0; // clear flags
USART1->CR1 |= USART_CR1_RXNEIE; // allow Rx IRQ
USART1->CR3 = USART_CR3_DMAT; // enable DMA Tx
}
void dma1_channel4_isr(){
if(DMA1->ISR & DMA_ISR_TCIF4){ // Tx
DMA1->IFCR = DMA_IFCR_CTCIF4; // clear TC flag
usart_txrdy = 1;
}
}

View File

@ -0,0 +1,32 @@
/*
* usart.h
*
* Copyright 2018 Edward V. Emelianoff <eddy@sao.ru, edward.emelianoff@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#pragma once
#define UARTBUFSZ (128)
// macro for static strings
#define USEND(str) usart_send(str)
void usart_transmit();
void usart_setup();
void usart_send(const char *str);
void usart_putchar(const char ch);

View File

@ -0,0 +1,248 @@
/*
* Copyright 2024 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "usb_descr.h"
#undef DBG
#define DBG(x)
#undef DBGs
#define DBGs(x)
// low/high for uint16_t
#define L16(x) (x & 0xff)
#define H16(x) (x >> 8)
static const uint8_t USB_DeviceDescriptor[] = {
USB_DT_DEVICE_SIZE, // bLength
USB_DT_DEVICE, // bDescriptorType
L16(bcdUSB), // bcdUSB_L
H16(bcdUSB), // bcdUSB_H
USB_CLASS_MISC, // bDeviceClass
bDeviceSubClass, // bDeviceSubClass
bDeviceProtocol, // bDeviceProtocol
USB_EP0BUFSZ, // bMaxPacketSize
L16(idVendor), // idVendor_L
H16(idVendor), // idVendor_H
L16(idProduct), // idProduct_L
H16(idProduct), // idProduct_H
L16(bcdDevice_Ver), // bcdDevice_Ver_L
H16(bcdDevice_Ver), // bcdDevice_Ver_H
iMANUFACTURER_DESCR, // iManufacturer - indexes of string descriptors in array
iPRODUCT_DESCR, // iProduct
iSERIAL_DESCR, // iSerial
bNumConfigurations // bNumConfigurations
};
static const uint8_t USB_DeviceQualifierDescriptor[] = {
USB_DT_QUALIFIER_SIZE, //bLength
USB_DT_QUALIFIER, // bDescriptorType
L16(bcdUSB), // bcdUSB_L
H16(bcdUSB), // bcdUSB_H
USB_CLASS_PER_INTERFACE, // bDeviceClass
bDeviceSubClass, // bDeviceSubClass
bDeviceProtocol, // bDeviceProtocol
USB_EP0BUFSZ, // bMaxPacketSize0
bNumConfigurations, // bNumConfigurations
0 // Reserved
};
#define wTotalLength (USB_DT_CONFIG_SIZE + bTotNumEndpoints * 66)
/*
* _1stI - number of first interface
* IDidx - 0 or index of string descriptor for given interface
* EPx - number of virtual interrupt EP
* EP - number of real EP in/out
*/
#define USB_IAD(_1stI, IDidx, EPx, EP) \
USB_DT_IAD_SIZE, /* bLength: IAD size */ \
USB_DT_IAD, /* bDescriptorType: IAD */ \
_1stI, /* bFirstInterface */ \
2, /* bInterfaceCount */ \
2, /* bFunctionClass: CDC */ \
2, /* bFunctionSubClass */ \
0, /* bFunctionProtocol */ \
0, /* iFunction */ \
/* Interface Descriptor */ \
USB_DT_INTERFACE_SIZE, /* bLength: Interface Descriptor size */ \
USB_DT_INTERFACE, /* bDescriptorType: Interface */ \
_1stI, /* bInterfaceNumber: Number of Interface */ \
0, /* bAlternateSetting: Alternate setting */ \
1, /* bNumEndpoints: one for this */ \
USB_CLASS_COMM, /* bInterfaceClass */ \
2, /* bInterfaceSubClass: ACM */ \
0, /* bInterfaceProtocol */ \
IDidx, /* iInterface */ \
/* CDC descriptor */ \
USB_DT_CS_INTERFACE_SIZE, /* bLength */ \
USB_DT_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ \
0, /* bDescriptorSubtype: Header Func Desc */ \
0x10, /* bcdCDC: spec release number */ \
1, /* bDataInterface */ \
USB_DT_CS_INTERFACE_SIZE, /* bLength */ \
USB_DT_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ \
1, /* bDescriptorSubtype: Call Management Func Desc */ \
0, /* bmCapabilities: D0+D1 */ \
(_1stI+1), /* bDataInterface */ \
USB_DT_CS_INTERFACE_SIZE-1, /* bLength */ \
USB_DT_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ \
2, /* bDescriptorSubtype: Abstract Control Management desc */ \
2, /* bmCapabilities */ \
USB_DT_CS_INTERFACE_SIZE, /* bLength */ \
USB_DT_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ \
6, /* bDescriptorSubtype: Union func desc */ \
_1stI, /* bMasterInterface: Communication class interface */ \
(_1stI+1), /* bSlaveInterface0: Data Class Interface */ \
/* Virtual endpoint 1 Descriptor */ \
USB_DT_ENDPOINT_SIZE, /* bLength: Endpoint Descriptor size */ \
USB_DT_ENDPOINT, /* bDescriptorType: Endpoint */ \
(0x80+EPx), /* bEndpointAddress IN8 - non-existant */ \
USB_BM_ATTR_INTERRUPT, /* bmAttributes: Interrupt */ \
L16(USB_EP1BUFSZ), /* wMaxPacketSize LO */ \
H16(USB_EP1BUFSZ), /* wMaxPacketSize HI */ \
0x10, /* bInterval: 16ms */ \
/* DATA endpoint */ \
USB_DT_INTERFACE_SIZE, /* bLength: Interface Descriptor size */ \
USB_DT_INTERFACE, /* bDescriptorType: Interface */ \
(_1stI+1), /* bInterfaceNumber: Number of Interface */ \
0, /* bAlternateSetting: Alternate setting */ \
2, /* bNumEndpoints: in and out */ \
USB_CLASS_DATA, /* bInterfaceClass */ \
2, /* bInterfaceSubClass: ACM */ \
0, /* bInterfaceProtocol */ \
0, /* iInterface */ \
/*Endpoint IN1 Descriptor */ \
USB_DT_ENDPOINT_SIZE, /* bLength: Endpoint Descriptor size */ \
USB_DT_ENDPOINT, /* bDescriptorType: Endpoint */ \
(0x80+EP), /* bEndpointAddress: IN1 */ \
USB_BM_ATTR_BULK, /* bmAttributes: Bulk */ \
L16(USB_TXBUFSZ), /* wMaxPacketSize LO */ \
H16(USB_TXBUFSZ), /* wMaxPacketSize HI */ \
0, /* bInterval: ignore for Bulk transfer */ \
/* Endpoint OUT1 Descriptor */ \
USB_DT_ENDPOINT_SIZE, /* bLength: Endpoint Descriptor size */ \
USB_DT_ENDPOINT, /* bDescriptorType: Endpoint */ \
EP, /* bEndpointAddress: OUT1 */ \
USB_BM_ATTR_BULK, /* bmAttributes: Bulk */ \
L16(USB_RXBUFSZ), /* wMaxPacketSize LO */ \
H16(USB_RXBUFSZ), /* wMaxPacketSize HI */ \
0 /* bInterval: ignore for Bulk transfer */
static const uint8_t USB_ConfigDescriptor[] = {
// Configuration Descriptor
USB_DT_CONFIG_SIZE, // bLength: Configuration Descriptor size
USB_DT_CONFIG, // bDescriptorType: Configuration
L16(wTotalLength), // wTotalLength.L :no of returned bytes
H16(wTotalLength), // wTotalLength.H
bNumInterfaces, // bNumInterfaces
1, // bConfigurationValue: Current configuration value
0, // iConfiguration: Index of string descriptor describing the configuration or 0
BusPowered, // bmAttributes - Bus powered
50, // MaxPower in 2mA units
//--IADs-------------------------------------------------------------------------
USB_IAD(0, iINTERFACE_DESCR1, 8, 1),
USB_IAD(2, iINTERFACE_DESCR2, 9, 2),
USB_IAD(4, iINTERFACE_DESCR3, 10, 3),
};
//const uint8_t HID_ReportDescriptor[];
_USB_LANG_ID_(LD, LANG_US);
_USB_STRING_(SD, u"0.0.1");
_USB_STRING_(MD, u"eddy@sao.ru");
_USB_STRING_(PD, u"USB BISS-C encoders controller");
_USB_STRING_(ID1, u"encoder_cmd");
_USB_STRING_(ID2, u"encoder_X");
_USB_STRING_(ID3, u"encoder_Y");
static const void* const StringDescriptor[iDESCR_AMOUNT] = {
[iLANGUAGE_DESCR] = &LD,
[iMANUFACTURER_DESCR] = &MD,
[iPRODUCT_DESCR] = &PD,
[iSERIAL_DESCR] = &SD,
[iINTERFACE_DESCR1] = &ID1,
[iINTERFACE_DESCR2] = &ID2,
[iINTERFACE_DESCR3] = &ID3,
};
static void wr0(const uint8_t *buf, uint16_t size, uint16_t askedsize){
if(askedsize < size) size = askedsize; // shortened request
if(size < USB_EP0BUFSZ){
EP_WriteIRQ(0, buf, size);
DBG("short wr0");
DBGs(uhex2str(size));
return;
}
DBG("long wr0");
DBGs(uhex2str(size));
while(size){
uint16_t l = size;
if(l > USB_EP0BUFSZ) l = USB_EP0BUFSZ;
EP_WriteIRQ(0, buf, l);
buf += l;
size -= l;
uint8_t needzlp = (l == USB_EP0BUFSZ) ? 1 : 0;
if(size || needzlp){ // send last data buffer
uint16_t epstatus = KEEP_DTOG(USB->EPnR[0]);
// keep DTOGs, clear CTR_RX,TX, set TX VALID, leave stat_Rx
USB->EPnR[0] = (epstatus & ~(USB_EPnR_CTR_RX|USB_EPnR_CTR_TX|USB_EPnR_STAT_RX))
^ USB_EPnR_STAT_TX;
uint32_t ctr = 1000000;
while(--ctr && (USB->ISTR & USB_ISTR_CTR) == 0){IWDG->KR = IWDG_REFRESH;};
if((USB->ISTR & USB_ISTR_CTR) == 0){
return;
}
if(needzlp) EP_WriteIRQ(0, NULL, 0);
}
}
}
void get_descriptor(config_pack_t *pack){
uint8_t descrtype = pack->wValue >> 8,
descridx = pack->wValue & 0xff;
switch(descrtype){
case DEVICE_DESCRIPTOR:
DBG("DEVICE_DESCRIPTOR");
wr0(USB_DeviceDescriptor, sizeof(USB_DeviceDescriptor), pack->wLength);
break;
case CONFIGURATION_DESCRIPTOR:
DBG("CONFIGURATION_DESCRIPTOR");
wr0(USB_ConfigDescriptor, sizeof(USB_ConfigDescriptor), pack->wLength);
break;
case STRING_DESCRIPTOR:
DBG("STRING_DESCRIPTOR");
if(descridx < iDESCR_AMOUNT){
wr0((const uint8_t *)StringDescriptor[descridx], *((uint8_t*)StringDescriptor[descridx]), pack->wLength);
DBGs(uhex2str(descridx));
}else{
EP_WriteIRQ(0, NULL, 0);
DBG("Wrong index");
DBGs(uhex2str(descridx));
}
break;
case DEVICE_QUALIFIER_DESCRIPTOR:
DBG("DEVICE_QUALIFIER_DESCRIPTOR");
wr0(USB_DeviceQualifierDescriptor, sizeof(USB_DeviceQualifierDescriptor), pack->wLength);
break;
/* case HID_REPORT_DESCRIPTOR:
wr0(HID_ReportDescriptor, sizeof(HID_ReportDescriptor), pack->wLength);
break;*/
default:
break;
}
}

View File

@ -0,0 +1,64 @@
/*
* Copyright 2024 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "usb_lib.h"
// definition of parts common for USB_DeviceDescriptor & USB_DeviceQualifierDescriptor
// bcdUSB: 1.10
#define bcdUSB 0x0110
// Class - Misc (EF), subclass - common (2), protocol - interface association descr (1)
#define bDeviceSubClass 0x02
#define bDeviceProtocol 0x01
#define idVendor 0x0483
#define idProduct 0x5740
#define bcdDevice_Ver 0x0200
#define bNumConfigurations 1
// amount of interfaces and endpoints (except 0) used
#define bNumInterfaces 6
#define bTotNumEndpoints 3
// powered
#define BusPowered (1<<7)
#define SelfPowered (1<<6)
#define RemoteWakeup (1<<5)
// buffer sizes
// for USB FS EP0 buffers are from 8 to 64 bytes long
#define USB_EP0BUFSZ 64
// virtual
#define USB_EP1BUFSZ 10
// Rx/Tx EPs: (512-64-128)/14 rouded to 8
#define USB_RXBUFSZ 16
#define USB_TXBUFSZ 16
// string descriptors
enum{
iLANGUAGE_DESCR,
iMANUFACTURER_DESCR,
iPRODUCT_DESCR,
iSERIAL_DESCR,
iINTERFACE_DESCR1,
iINTERFACE_DESCR2,
iINTERFACE_DESCR3,
iDESCR_AMOUNT
};
void get_descriptor(config_pack_t *pack);

View File

@ -0,0 +1,300 @@
/*
* Copyright 2024 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stm32f1.h>
#include <string.h>
#include "ringbuffer.h"
#include "usb_descr.h"
#include "usb_dev.h"
// Class-Specific Control Requests
#define SEND_ENCAPSULATED_COMMAND 0x00 // unused
#define GET_ENCAPSULATED_RESPONSE 0x01 // unused
#define SET_COMM_FEATURE 0x02 // unused
#define GET_COMM_FEATURE 0x03 // unused
#define CLEAR_COMM_FEATURE 0x04 // unused
#define SET_LINE_CODING 0x20
#define GET_LINE_CODING 0x21
#define SET_CONTROL_LINE_STATE 0x22
#define SEND_BREAK 0x23
// control line states
#define CONTROL_DTR 0x01
#define CONTROL_RTS 0x02
#undef DBG
#define DBG(x)
#undef DBGs
#define DBGs(x)
// inbuf overflow when receiving
static volatile uint8_t bufovrfl[bTotNumEndpoints] = {0};
// receive buffer: hold data until chkin() call
static uint8_t volatile rcvbuf[bTotNumEndpoints][USB_RXBUFSZ];
static uint8_t volatile rcvbuflen[bTotNumEndpoints] = {0};
// line coding
#define DEFLC {115200, 0, 0, 8}
static usb_LineCoding lineCoding[bTotNumEndpoints] = {DEFLC, DEFLC, DEFLC};
// CDC configured and ready to use
volatile uint8_t CDCready[bTotNumEndpoints] = {0};
// ring buffers for incoming and outgoing data
static uint8_t obuf[bTotNumEndpoints][RBOUTSZ], ibuf[bTotNumEndpoints][RBINSZ];
#define OBUF(N) {.data = obuf[N], .length = RBOUTSZ, .head = 0, .tail = 0}
static volatile ringbuffer rbout[bTotNumEndpoints] = {OBUF(0), OBUF(1), OBUF(2)};
#define IBUF(N) {.data = ibuf[N], .length = RBINSZ, .head = 0, .tail = 0}
static volatile ringbuffer rbin[bTotNumEndpoints] = {IBUF(0), IBUF(1), IBUF(2)};
// last send data size
static volatile int lastdsz[bTotNumEndpoints] = {0};
static void chkin(uint8_t ifno){
if(bufovrfl[ifno]) return; // allow user to know that previous buffer was overflowed and cleared
if(!rcvbuflen[ifno]) return;
int w = RB_write((ringbuffer*)&rbin[ifno], (uint8_t*)rcvbuf[ifno], rcvbuflen[ifno]);
if(w < 0){
DBG("Can't write into buffer");
return;
}
if(w != rcvbuflen[ifno]) bufovrfl[ifno] = 1;
DBG("Put data into buffer");
rcvbuflen[ifno] = 0;
uint16_t status = KEEP_DTOG(USB->EPnR[1+ifno]); // don't change DTOG
USB->EPnR[1+ifno] = (status & ~(USB_EPnR_STAT_TX|USB_EPnR_CTR_RX)) ^ USB_EPnR_STAT_RX; // prepare to get next data portion
}
// called from transmit EP to send next data portion or by user - when new transmission starts
static void send_next(uint8_t ifno){
uint8_t usbbuff[USB_TXBUFSZ];
int buflen = RB_read((ringbuffer*)&rbout[ifno], (uint8_t*)usbbuff, USB_TXBUFSZ);
if(buflen == 0){
if(lastdsz[ifno] == 64) EP_Write(1+ifno, NULL, 0); // send ZLP after 64 bits packet when nothing more to send
lastdsz[ifno] = 0;
return;
}else if(buflen < 0){
DBG("Buff busy");
lastdsz[ifno] = 0;
return;
}
DBG("Got data in buf");
DBGs(uhex2str(buflen));
DBGs(uhex2str(ifno));
EP_Write(1+ifno, (uint8_t*)usbbuff, buflen);
lastdsz[ifno] = buflen;
}
// data IN/OUT handler
static void rxtx_handler(){
uint8_t ifno = (USB->ISTR & USB_ISTR_EPID) - 1;
DBG("rxtx_handler");
DBGs(uhex2str(ifno));
if(ifno > bTotNumEndpoints-1){
DBG("wront ifno");
return;
}
uint16_t epstatus = KEEP_DTOG(USB->EPnR[1+ifno]);
if(RX_FLAG(epstatus)){ // receive data
DBG("Got data");
if(rcvbuflen[ifno]){
bufovrfl[ifno] = 1; // lost last data
rcvbuflen[ifno] = 0;
DBG("OVERFULL");
}
rcvbuflen[ifno] = EP_Read(1+ifno, (uint8_t*)rcvbuf[ifno]);
DBGs(uhex2str(rcvbuflen[ifno]));
USB->EPnR[1+ifno] = epstatus & ~(USB_EPnR_CTR_RX | USB_EPnR_STAT_RX | USB_EPnR_STAT_TX); // keep RX in STALL state until read data
chkin(ifno); // try to write current data into RXbuf if it's not busy
}else{ // tx successfull
DBG("Tx OK");
USB->EPnR[1+ifno] = (epstatus & ~(USB_EPnR_CTR_TX | USB_EPnR_STAT_TX)) ^ USB_EPnR_STAT_RX;
send_next(ifno);
}
}
// weak handlers: change them somewhere else if you want to setup USART
// SET_LINE_CODING
void WEAK linecoding_handler(uint8_t ifno, usb_LineCoding *lc){
lineCoding[ifno] = *lc;
DBG("linecoding_handler");
DBGs(uhex2str(ifno));
}
// SET_CONTROL_LINE_STATE
void WEAK clstate_handler(uint8_t ifno, uint16_t val){
DBG("clstate_handler");
DBGs(uhex2str(ifno));
DBGs(uhex2str(val));
CDCready[ifno] = val; // CONTROL_DTR | CONTROL_RTS -> interface connected; 0 -> disconnected
}
// SEND_BREAK
void WEAK break_handler(uint8_t ifno){
CDCready[ifno] = 0;
DBG("break_handler()");
DBGs(uhex2str(ifno));
}
// USB is configured: setup endpoints
void set_configuration(){
DBG("set_configuration()");
for(int i = 0; i < bTotNumEndpoints; ++i){
int r = EP_Init(1+i, EP_TYPE_BULK, USB_TXBUFSZ, USB_RXBUFSZ, rxtx_handler);
if(r){
DBG("Can't init EP");
DBGs(uhex2str(i));
DBGs(uhex2str(r));
}
}
}
// PL2303 CLASS request
void usb_class_request(config_pack_t *req, uint8_t *data, uint16_t datalen){
uint8_t recipient = REQUEST_RECIPIENT(req->bmRequestType);
uint8_t dev2host = (req->bmRequestType & 0x80) ? 1 : 0;
uint8_t ifno = req->wIndex >> 1;
if(ifno > bTotNumEndpoints-1 && ifno != 0xff){
DBG("wront ifno");
return;
}
DBG("usb_class_request");
DBGs(uhex2str(req->bRequest));
switch(recipient){
case REQ_RECIPIENT_INTERFACE:
switch(req->bRequest){
case SET_LINE_CODING:
DBG("SET_LINE_CODING");
if(!data || !datalen) break; // wait for data
if(datalen == sizeof(usb_LineCoding))
linecoding_handler(ifno, (usb_LineCoding*)data);
break;
case GET_LINE_CODING:
DBG("GET_LINE_CODING");
EP_WriteIRQ(0, (uint8_t*)&lineCoding[ifno], sizeof(lineCoding));
break;
case SET_CONTROL_LINE_STATE:
DBG("SET_CONTROL_LINE_STATE");
clstate_handler(ifno, req->wValue);
break;
case SEND_BREAK:
DBG("SEND_BREAK");
break_handler(ifno);
break;
default:
DBG("Wrong");
DBGs(uhex2str(req->bRequest));
DBGs(uhex2str(datalen));
}
break;
default:
DBG("Wrong");
DBGs(uhex2str(recipient));
DBGs(uhex2str(datalen));
DBGs(uhex2str(req->bRequest));
if(dev2host) EP_WriteIRQ(0, NULL, 0);
}
if(!dev2host) EP_WriteIRQ(0, NULL, 0);
}
// blocking send full content of ring buffer
int USB_sendall(uint8_t ifno){
while(lastdsz[ifno] > 0){
if(!CDCready[ifno]) return FALSE;
}
return TRUE;
}
// put `buf` into queue to send
int USB_send(uint8_t ifno, const uint8_t *buf, int len){
if(!buf || !CDCready[ifno] || !len) return FALSE;
DBG("USB_send");
while(len){
int a = RB_write((ringbuffer*)&rbout[ifno], buf, len);
if(a > 0){
len -= a;
buf += a;
} else if (a < 0) continue; // do nothing if buffer is in reading state
if(lastdsz[ifno] == 0) send_next(ifno); // need to run manually - all data sent, so no IRQ on IN
}
return TRUE;
}
int USB_putbyte(uint8_t ifno, uint8_t byte){
if(!CDCready[ifno]) return FALSE;
int l = 0;
while((l = RB_write((ringbuffer*)&rbout[ifno], &byte, 1)) != 1){
if(l < 0) continue;
}
if(lastdsz[ifno] == 0) send_next(ifno); // need to run manually - all data sent, so no IRQ on IN
return TRUE;
}
int USB_sendstr(uint8_t ifno, const char *string){
if(!string || !CDCready[ifno]) return FALSE;
int len = strlen(string);
if(!len) return FALSE;
return USB_send(ifno, (const uint8_t*)string, len);
}
/**
* @brief USB_receive - get binary data from receiving ring-buffer
* @param buf (i) - buffer for received data
* @param len - length of `buf`
* @return amount of received bytes (negative, if overfull happened)
*/
int USB_receive(uint8_t ifno, uint8_t *buf, int len){
chkin(ifno);
if(bufovrfl[ifno]){
DBG("Buffer overflow");
DBGs(uhex2str(ifno));
while(1 != RB_clearbuf((ringbuffer*)&rbin[ifno]));
bufovrfl[ifno] = 0;
return -1;
}
int sz = RB_read((ringbuffer*)&rbin[ifno], buf, len);
if(sz < 0) return 0; // buffer in writting state
DBG("usb read");
return sz;
}
/**
* @brief USB_receivestr - get string up to '\n' and replace '\n' with 0
* @param buf - receiving buffer
* @param len - its length
* @return strlen or negative value indicating overflow (if so, string won't be ends with 0 and buffer should be cleared)
*/
int USB_receivestr(uint8_t ifno, char *buf, int len){
chkin(ifno);
if(bufovrfl[ifno]){
while(1 != RB_clearbuf((ringbuffer*)&rbin[ifno]));
bufovrfl[ifno] = 0;
return -1;
}
int l = RB_readto((ringbuffer*)&rbin[ifno], '\n', (uint8_t*)buf, len);
if(l < 1){
if(rbin[ifno].length == RB_datalen((ringbuffer*)&rbin[ifno])){ // buffer is full but no '\n' found
while(1 != RB_clearbuf((ringbuffer*)&rbin[ifno]));
return -1;
}
return 0;
}
if(l == 0) return 0;
buf[l-1] = 0; // replace '\n' with strend
return l;
}

View File

@ -0,0 +1,75 @@
/*
* Copyright 2024 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stm32f1.h>
#include "usb_descr.h"
#include "usb_lib.h"
// interfaces:
#define I_CMD (0)
#define I_X (1)
#define I_Y (2)
typedef struct {
uint32_t dwDTERate;
uint8_t bCharFormat;
#define USB_CDC_1_STOP_BITS 0
#define USB_CDC_1_5_STOP_BITS 1
#define USB_CDC_2_STOP_BITS 2
uint8_t bParityType;
#define USB_CDC_NO_PARITY 0
#define USB_CDC_ODD_PARITY 1
#define USB_CDC_EVEN_PARITY 2
#define USB_CDC_MARK_PARITY 3
#define USB_CDC_SPACE_PARITY 4
uint8_t bDataBits;
} __attribute__ ((packed)) usb_LineCoding;
extern volatile uint8_t CDCready[bTotNumEndpoints];
void break_handler(uint8_t ifno);
void clstate_handler(uint8_t ifno, uint16_t val);
void linecoding_handler(uint8_t ifno, usb_LineCoding *lc);
// sizes of ringbuffers for outgoing and incoming data
#define RBOUTSZ (256)
#define RBINSZ (256)
#define newline(ifno) USB_putbyte(ifno, '\n')
#define USND(ifno, s) do{USB_sendstr(ifno, s); USB_putbyte(ifno, '\n');}while(0)
#define CMDWR(s) USB_sendstr(I_CMD, s)
#define CMDWRn(s) do{USB_sendstr(I_CMD, s); USB_putbyte(I_CMD, '\n');}while(0)
#define CMDn() USB_putbyte(I_CMD, '\n')
#ifdef EBUG
#define STR_HELPER(s) #s
#define STR(s) STR_HELPER(s)
#define DBG(str) do{USB_sendstr(I_CMD, __FILE__ " (L" STR(__LINE__) "): " str); USB_putbyte(I_CMD, '\n');}while(0)
#define DBGs(str) do{USB_sendstr(I_CMD, str); USB_sendstr(I_CMD, "<--\n");}while(0)
#else
#define DBG(s)
#define DBGs(s)
#endif
int USB_sendall(uint8_t ifno);
int USB_send(uint8_t ifno, const uint8_t *buf, int len);
int USB_putbyte(uint8_t ifno, uint8_t byte);
int USB_sendstr(uint8_t ifno, const char *string);
int USB_receive(uint8_t ifno, uint8_t *buf, int len);
int USB_receivestr(uint8_t ifno, char *buf, int len);

View File

@ -0,0 +1,413 @@
/*
* Copyright 2024 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include "usb_lib.h"
#include "usb_descr.h"
#include "usb_dev.h"
#undef DBG
#define DBG(x)
#undef DBGs
#define DBGs(x)
static ep_t endpoints[STM32ENDPOINTS];
static uint16_t USB_Addr = 0;
static uint8_t setupdatabuf[EP0DATABUF_SIZE];
static config_pack_t *setup_packet = (config_pack_t*) setupdatabuf;
volatile uint8_t usbON = 0; // device is configured and active
static uint16_t configuration = 0; // reply for GET_CONFIGURATION (==1 if configured)
static inline void std_d2h_req(){
uint16_t st = 0;
switch(setup_packet->bRequest){
case GET_DESCRIPTOR:
DBG("GET_DESCRIPTOR");
get_descriptor(setup_packet);
break;
case GET_STATUS:
DBG("GET_STATUS");
EP_WriteIRQ(0, (uint8_t *)&st, 2); // send status: Bus Powered
break;
case GET_CONFIGURATION:
DBG("GET_CONFIGURATION");
EP_WriteIRQ(0, (uint8_t*)&configuration, 1);
break;
default:
DBG("Wrong");
DBGs(uhex2str(setup_packet->bRequest));
EP_WriteIRQ(0, NULL, 0);
break;
}
}
static inline void std_h2d_req(){
switch(setup_packet->bRequest){
case SET_ADDRESS:
DBG("SET_ADDRESS");
// new address will be assigned later - after acknowlegement or request to host
USB_Addr = setup_packet->wValue;
DBGs(uhex2str(USB_Addr));
break;
case SET_CONFIGURATION:
DBG("SET_CONFIGURATION");
// Now device configured
configuration = setup_packet->wValue;
set_configuration();
usbON = 1;
break;
default:
DBG("Wrong");
DBGs(uhex2str(setup_packet->bRequest));
break;
}
}
void WEAK usb_standard_request(){
uint8_t recipient = REQUEST_RECIPIENT(setup_packet->bmRequestType);
uint8_t dev2host = (setup_packet->bmRequestType & 0x80) ? 1 : 0;
switch(recipient){
case REQ_RECIPIENT_DEVICE:
DBG("REQ_RECIPIENT_DEVICE");
if(dev2host){
std_d2h_req();
}else{
std_h2d_req();
}
break;
case REQ_RECIPIENT_INTERFACE:
DBG("REQ_RECIPIENT_INTERFACE");
if(dev2host && setup_packet->bRequest == GET_DESCRIPTOR){
get_descriptor(setup_packet);
}
break;
case REQ_RECIPIENT_ENDPOINT:
DBG("REQ_RECIPIENT_ENDPOINT");
if(setup_packet->bRequest == CLEAR_FEATURE){
}else{
DBG("Wrong");
}
break;
default:
DBG("Wrong");
DBGs(uhex2str(recipient));
break;
}
if(!dev2host) EP_WriteIRQ(0, NULL, 0);
}
void WEAK usb_class_request(config_pack_t *req, uint8_t _U_ *data, uint16_t _U_ datalen){
DBG("REQ_TYPE_CLASS");
switch(req->bRequest){
case GET_INTERFACE:
DBG("GI");
break;
case SET_CONFIGURATION: // set featuring by req->wValue
DBG("SC");
break;
default:
DBG("Wrong");
DBGs(uhex2str(req->bmRequestType));
DBGs(uhex2str(req->bRequest));
DBGs(uhex2str(req->wIndex));
DBGs(uhex2str(req->wLength));
DBGs(uhex2str(req->wValue));
}
if(0 == (setup_packet->bmRequestType & 0x80)) // host2dev
EP_WriteIRQ(0, NULL, 0);
}
void WEAK usb_vendor_request(config_pack_t _U_ *packet, uint8_t _U_ *data, uint16_t _U_ datalen){
DBG("vendor");
if(0 == (setup_packet->bmRequestType & 0x80)) // host2dev
EP_WriteIRQ(0, NULL, 0);
}
/*
bmRequestType: 76543210
7 direction: 0 - host->device, 1 - device->host
65 type: 0 - standard, 1 - class, 2 - vendor
4..0 getter: 0 - device, 1 - interface, 2 - endpoint, 3 - other
*/
/**
* Endpoint0 (control) handler
*/
static void EP0_Handler(){
uint8_t ep0dbuflen = 0;
uint8_t ep0databuf[EP0DATABUF_SIZE];
uint16_t epstatus = KEEP_DTOG(USB->EPnR[0]); // EP0R on input -> return this value after modifications
int rxflag = RX_FLAG(epstatus);
if(rxflag){ DBG("EP0_Handler"); }
// check direction
if(USB->ISTR & USB_ISTR_DIR){ // OUT interrupt - receive data, CTR_RX==1 (if CTR_TX == 1 - two pending transactions: receive following by transmit)
if(epstatus & USB_EPnR_SETUP){ // setup packet -> copy data to conf_pack
DBG("USB_EPnR_SETUP");
EP_Read(0, setupdatabuf);
// interrupt handler will be called later
}else if(epstatus & USB_EPnR_CTR_RX){ // data packet -> push received data to ep0databuf
if(endpoints[0].rx_cnt){ DBG("data"); DBGs(uhex2str(endpoints[0].rx_cnt));}
ep0dbuflen = EP_Read(0, ep0databuf);
}
}
if(rxflag){
uint8_t reqtype = REQUEST_TYPE(setup_packet->bmRequestType);
switch(reqtype){
case REQ_TYPE_STANDARD:
if(SETUP_FLAG(epstatus)){
DBG("REQ_TYPE_STANDARD");
usb_standard_request();
}else{
DBG("REQ_TYPE_STANDARD without SETUP_FLAG");
}
break;
case REQ_TYPE_CLASS:
DBG("REQ_TYPE_CLASS");
usb_class_request(setup_packet, ep0databuf, ep0dbuflen);
break;
case REQ_TYPE_VENDOR:
DBG("REQ_TYPE_VENDOR");
usb_vendor_request(setup_packet, ep0databuf, ep0dbuflen);
break;
default:
DBG("Wrong");
DBGs(uhex2str(reqtype));
EP_WriteIRQ(0, NULL, 0);
break;
}
}
if(TX_FLAG(epstatus)){
// now we can change address after enumeration
if ((USB->DADDR & USB_DADDR_ADD) != USB_Addr){
USB->DADDR = USB_DADDR_EF | USB_Addr;
usbON = 0;
DBG("Enum");
DBGs(uhex2str(USB_Addr));
}
}
//epstatus = KEEP_DTOG(USB->EPnR[0]);
if(rxflag) epstatus ^= USB_EPnR_STAT_TX; // start ZLP or data transmission
else epstatus &= ~USB_EPnR_STAT_TX; // or leave unchanged
// keep DTOGs, clear CTR_RX,TX, set RX VALID
USB->EPnR[0] = (epstatus & ~(USB_EPnR_CTR_RX|USB_EPnR_CTR_TX)) ^ USB_EPnR_STAT_RX;
}
/**
* Write data to EP buffer (called from IRQ handler)
* @param number - EP number
* @param *buf - array with data
* @param size - its size
*/
void EP_WriteIRQ(uint8_t number, const uint8_t *buf, uint16_t size){
if(size > endpoints[number].txbufsz) size = endpoints[number].txbufsz;
uint16_t N2 = (size + 1) >> 1;
// the buffer is 16-bit, so we should copy data as it would be uint16_t
uint16_t *buf16 = (uint16_t *)buf;
#if defined USB1_16
// very bad: what if `size` is odd?
uint32_t *out = (uint32_t *)endpoints[number].tx_buf;
for(int i = 0; i < N2; ++i, ++out){
*out = buf16[i];
}
#elif defined USB2_16
// use memcpy instead?
for(int i = 0; i < N2; i++){
endpoints[number].tx_buf[i] = buf16[i];
}
#else
#error "Define USB1_16 or USB2_16"
#endif
USB_BTABLE->EP[number].USB_COUNT_TX = size;
}
/**
* Write data to EP buffer (called outside IRQ handler)
* @param number - EP number
* @param *buf - array with data
* @param size - its size
*/
void EP_Write(uint8_t number, const uint8_t *buf, uint16_t size){
EP_WriteIRQ(number, buf, size);
uint16_t epstatus = KEEP_DTOG(USB->EPnR[number]);
// keep DTOGs and RX stat, clear CTR_TX & set TX VALID to start transmission
USB->EPnR[number] = (epstatus & ~(USB_EPnR_CTR_TX | USB_EPnR_STAT_RX)) ^ USB_EPnR_STAT_TX;
}
/*
* Copy data from EP buffer into user buffer area
* @param *buf - user array for data
* @return amount of data read
*/
int EP_Read(uint8_t number, uint8_t *buf){
int sz = endpoints[number].rx_cnt;
if(!sz) return 0;
endpoints[number].rx_cnt = 0;
#if defined USB1_16
int n = (sz + 1) >> 1;
uint32_t *in = (uint32_t*)endpoints[number].rx_buf;
uint16_t *out = (uint16_t*)buf;
for(int i = 0; i < n; ++i, ++in)
out[i] = *(uint16_t*)in;
#elif defined USB2_16
// use memcpy instead?
for(int i = 0; i < sz; ++i)
buf[i] = endpoints[number].rx_buf[i];
#else
#error "Define USB1_16 or USB2_16"
#endif
return sz;
}
static uint16_t lastaddr = LASTADDR_DEFAULT;
/**
* Endpoint initialisation
* @param number - EP num (0...7)
* @param type - EP type (EP_TYPE_BULK, EP_TYPE_CONTROL, EP_TYPE_ISO, EP_TYPE_INTERRUPT)
* @param txsz - transmission buffer size @ USB/CAN buffer
* @param rxsz - reception buffer size @ USB/CAN buffer
* @param uint16_t (*func)(ep_t *ep) - EP handler function
* @return 0 if all OK
*/
int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, void (*func)(ep_t ep)){
if(number >= STM32ENDPOINTS) return 4; // out of configured amount
if(txsz > USB_BTABLE_SIZE/ACCESSZ || rxsz > USB_BTABLE_SIZE/ACCESSZ) return 1; // buffer too large
if(lastaddr + txsz + rxsz >= USB_BTABLE_SIZE/ACCESSZ) return 2; // out of btable
USB->EPnR[number] = (type << 9) | (number & USB_EPnR_EA);
USB->EPnR[number] ^= USB_EPnR_STAT_RX | USB_EPnR_STAT_TX_1;
if(rxsz & 1) return 3; // wrong rx buffer size
uint16_t countrx = 0;
if(rxsz < 64) countrx = rxsz / 2;
else{
if(rxsz & 0x1f) return 3; // should be multiple of 32
countrx = 31 + rxsz / 32;
}
USB_BTABLE->EP[number].USB_ADDR_TX = lastaddr;
endpoints[number].tx_buf = (uint16_t *)(USB_BTABLE_BASE + lastaddr * ACCESSZ);
endpoints[number].txbufsz = txsz;
lastaddr += txsz;
USB_BTABLE->EP[number].USB_COUNT_TX = 0;
USB_BTABLE->EP[number].USB_ADDR_RX = lastaddr;
endpoints[number].rx_buf = (uint8_t *)(USB_BTABLE_BASE + lastaddr * ACCESSZ);
lastaddr += rxsz;
USB_BTABLE->EP[number].USB_COUNT_RX = countrx << 10;
endpoints[number].func = func;
return 0;
}
// standard IRQ handler
void USB_IRQ(){
uint32_t CNTR = USB->CNTR;
USB->CNTR = 0;
if(USB->ISTR & USB_ISTR_RESET){
DBG("USB_ISTR_RESET");
usbON = 0;
// Reinit registers
CNTR = USB_CNTR_RESETM | USB_CNTR_CTRM | USB_CNTR_SUSPM;
// Endpoint 0 - CONTROL
// ON USB LS size of EP0 may be 8 bytes, but on FS it should be 64 bytes!
lastaddr = LASTADDR_DEFAULT;
// clear address, leave only enable bit
USB->DADDR = USB_DADDR_EF;
USB->ISTR = ~USB_ISTR_RESET;
if(EP_Init(0, EP_TYPE_CONTROL, USB_EP0BUFSZ, USB_EP0BUFSZ, EP0_Handler)){
DBG("Can't init EP0");
return;
};
}
if(USB->ISTR & USB_ISTR_CTR){
// EP number
uint8_t n = USB->ISTR & USB_ISTR_EPID;
// copy received bytes amount
endpoints[n].rx_cnt = USB_BTABLE->EP[n].USB_COUNT_RX & 0x3FF; // low 10 bits is counter
// call EP handler
if(endpoints[n].func) endpoints[n].func();
}
if(USB->ISTR & USB_ISTR_WKUP){ // wakeup
DBG("USB_ISTR_WKUP");
#ifndef STM32F0
CNTR &= ~(USB_CNTR_FSUSP | USB_CNTR_LP_MODE | USB_CNTR_WKUPM); // clear suspend flags
#else
CNTR &= ~(USB_CNTR_FSUSP | USB_CNTR_LPMODE | USB_CNTR_WKUPM);
#endif
USB->ISTR = ~USB_ISTR_WKUP;
}
if(USB->ISTR & USB_ISTR_SUSP){ // suspend -> still no connection, may sleep
DBG("USB_ISTR_SUSP");
usbON = 0;
#ifndef STM32F0
CNTR |= USB_CNTR_FSUSP | USB_CNTR_LP_MODE | USB_CNTR_WKUPM;
#else
CNTR |= USB_CNTR_FSUSP | USB_CNTR_LPMODE | USB_CNTR_WKUPM;
#endif
CNTR &= ~(USB_CNTR_SUSPM);
USB->ISTR = ~USB_ISTR_SUSP;
}
USB->CNTR = CNTR; // rewoke interrupts
}
// here we suppose that all PIN settings done in hw_setup earlier
void USB_setup(){
#if defined STM32F3
NVIC_DisableIRQ(USB_LP_IRQn);
// remap USB LP & Wakeup interrupts to 75 and 76 - works only on pure F303
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // enable tacting of SYSCFG
SYSCFG->CFGR1 |= SYSCFG_CFGR1_USB_IT_RMP;
#elif defined STM32F1
NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn);
NVIC_DisableIRQ(USB_HP_CAN1_TX_IRQn);
#elif defined STM32F0
NVIC_DisableIRQ(USB_IRQn);
RCC->APB1ENR |= RCC_APB1ENR_CRSEN;
RCC->CFGR3 &= ~RCC_CFGR3_USBSW; // reset USB
RCC->CR2 |= RCC_CR2_HSI48ON; // turn ON HSI48
uint32_t tmout = 16000000;
while(!(RCC->CR2 & RCC_CR2_HSI48RDY)){if(--tmout == 0) break;}
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
CRS->CFGR &= ~CRS_CFGR_SYNCSRC;
CRS->CFGR |= CRS_CFGR_SYNCSRC_1; // USB SOF selected as sync source
CRS->CR |= CRS_CR_AUTOTRIMEN; // enable auto trim
CRS->CR |= CRS_CR_CEN; // enable freq counter & block CRS->CFGR as read-only
RCC->CFGR |= RCC_CFGR_SW;
#endif
RCC->APB1ENR |= RCC_APB1ENR_USBEN;
//??
USB->CNTR = USB_CNTR_FRES; // Force USB Reset
for(uint32_t ctr = 0; ctr < 72000; ++ctr) nop(); // wait >1ms
USB->CNTR = 0;
USB->BTABLE = 0;
USB->DADDR = 0;
USB->ISTR = 0;
USB->CNTR = USB_CNTR_RESETM; // allow only reset interrupts
#if defined STM32F3
NVIC_EnableIRQ(USB_LP_IRQn);
#elif defined STM32F1
NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
#elif defined STM32F0
USB->BCDR |= USB_BCDR_DPPU;
NVIC_EnableIRQ(USB_IRQn);
#endif
}
#if defined STM32F3
void usb_lp_isr() __attribute__ ((alias ("USB_IRQ")));
#elif defined STM32F1
void usb_lp_can_rx0_isr() __attribute__ ((alias ("USB_IRQ")));
#elif defined STM32F0
void usb_isr() __attribute__ ((alias ("USB_IRQ")));
#endif

View File

@ -0,0 +1,324 @@
/*
* Copyright 2024 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include <wchar.h>
/******************************************************************
* Hardware registers etc *
*****************************************************************/
#if defined STM32F0
#include <stm32f0.h>
#elif defined STM32F1
#include <stm32f1.h>
// there's no this define in standard header
#define USB_BASE ((uint32_t)0x40005C00)
#elif defined STM32F3
#include <stm32f3.h>
#endif
// max endpoints number
#define STM32ENDPOINTS 8
/**
* Buffers size definition
**/
// F0 - USB2_16; F1 - USB1_16; F3 - 1/2 depending on series
#if !defined USB1_16 && !defined USB2_16
#if defined STM32F0
#define USB2_16
#elif defined STM32F1
#define USB1_16
#else
#error "Can't determine USB1_16 or USB2_16, define by hands"
#endif
#endif
// BTABLE_SIZE FOR STM32F3:
// In STM32F303/302xB/C, 512 bytes SRAM is not shared with CAN.
// In STM32F302x6/x8 and STM32F30xxD/E, 726 bytes dedicated SRAM and 256 bytes shared SRAM with CAN i.e.
// 1Kbytes dedicated SRAM in case CAN is disabled.
// remember, that USB_BTABLE_SIZE will be divided by ACCESSZ, so don't divide it twice for 32-bit addressing
#ifdef NOCAN
#if defined STM32F0
#define USB_BTABLE_SIZE 1024
#elif defined STM32F3
#define USB_BTABLE_SIZE 512
#warning "Please, check real buffer size due to docs"
#else
#error "define STM32F0 or STM32F3"
#endif
#else // !NOCAN: F0/F3 with CAN or F1 (can't simultaneously run CAN and USB)
#if defined STM32F0
#define USB_BTABLE_SIZE 768
#elif defined STM32F3
#define USB_BTABLE_SIZE 512
#warning "Please, check real buffer size due to docs"
#else // STM32F103: 1024 bytes but with 32-bit addressing
#define USB_BTABLE_SIZE 1024
#endif
#endif // NOCAN
// first 64 bytes of USB_BTABLE are registers!
#define USB_BTABLE_BASE 0x40006000
#define USB ((USB_TypeDef *) USB_BASE)
#ifdef USB_BTABLE
#undef USB_BTABLE
#endif
#define USB_BTABLE ((USB_BtableDef *)(USB_BTABLE_BASE))
#define USB_ISTR_EPID 0x0000000F
#define USB_FNR_LSOF_0 0x00000800
#define USB_FNR_lSOF_1 0x00001000
#define USB_LPMCSR_BESL_0 0x00000010
#define USB_LPMCSR_BESL_1 0x00000020
#define USB_LPMCSR_BESL_2 0x00000040
#define USB_LPMCSR_BESL_3 0x00000080
#define USB_EPnR_CTR_RX 0x00008000
#define USB_EPnR_DTOG_RX 0x00004000
#define USB_EPnR_STAT_RX 0x00003000
#define USB_EPnR_STAT_RX_0 0x00001000
#define USB_EPnR_STAT_RX_1 0x00002000
#define USB_EPnR_SETUP 0x00000800
#define USB_EPnR_EP_TYPE 0x00000600
#define USB_EPnR_EP_TYPE_0 0x00000200
#define USB_EPnR_EP_TYPE_1 0x00000400
#define USB_EPnR_EP_KIND 0x00000100
#define USB_EPnR_CTR_TX 0x00000080
#define USB_EPnR_DTOG_TX 0x00000040
#define USB_EPnR_STAT_TX 0x00000030
#define USB_EPnR_STAT_TX_0 0x00000010
#define USB_EPnR_STAT_TX_1 0x00000020
#define USB_EPnR_EA 0x0000000F
#define USB_COUNTn_RX_BLSIZE 0x00008000
#define USB_COUNTn_NUM_BLOCK 0x00007C00
#define USB_COUNTn_RX 0x0000003F
#define USB_TypeDef USB_TypeDef_custom
typedef struct {
__IO uint32_t EPnR[STM32ENDPOINTS];
__IO uint32_t RESERVED[STM32ENDPOINTS];
__IO uint32_t CNTR;
__IO uint32_t ISTR;
__IO uint32_t FNR;
__IO uint32_t DADDR;
__IO uint32_t BTABLE;
#ifdef STM32F0
__IO uint32_t LPMCSR;
__IO uint32_t BCDR;
#endif
} USB_TypeDef;
// F303 D/E have 2x16 access scheme
typedef struct{
#if defined USB2_16
__IO uint16_t USB_ADDR_TX;
__IO uint16_t USB_COUNT_TX;
__IO uint16_t USB_ADDR_RX;
__IO uint16_t USB_COUNT_RX;
#define ACCESSZ (1)
#define BUFTYPE uint8_t
#elif defined USB1_16
__IO uint32_t USB_ADDR_TX;
__IO uint32_t USB_COUNT_TX;
__IO uint32_t USB_ADDR_RX;
__IO uint32_t USB_COUNT_RX;
#define ACCESSZ (2)
#define BUFTYPE uint16_t
#else
#error "Define USB1_16 or USB2_16"
#endif
} USB_EPDATA_TypeDef;
typedef struct{
__IO USB_EPDATA_TypeDef EP[STM32ENDPOINTS];
} USB_BtableDef;
#define EP0DATABUF_SIZE (64)
#define LASTADDR_DEFAULT (STM32ENDPOINTS * 8)
/******************************************************************
* Defines from usb.h *
*****************************************************************/
/*
* Device and/or Interface Class codes
*/
#define USB_CLASS_PER_INTERFACE 0
#define USB_CLASS_AUDIO 1
#define USB_CLASS_COMM 2
#define USB_CLASS_HID 3
#define USB_CLASS_PRINTER 7
#define USB_CLASS_PTP 6
#define USB_CLASS_MASS_STORAGE 8
#define USB_CLASS_HUB 9
#define USB_CLASS_DATA 10
#define USB_CLASS_MISC 0xef
#define USB_CLASS_VENDOR_SPEC 0xff
/*
* Descriptor types
*/
#define USB_DT_DEVICE 0x01
#define USB_DT_CONFIG 0x02
#define USB_DT_STRING 0x03
#define USB_DT_INTERFACE 0x04
#define USB_DT_ENDPOINT 0x05
#define USB_DT_QUALIFIER 0x06
#define USB_DT_IAD 0x0B
#define USB_DT_HID 0x21
#define USB_DT_REPORT 0x22
#define USB_DT_PHYSICAL 0x23
#define USB_DT_CS_INTERFACE 0x24
#define USB_DT_HUB 0x29
/*
* Descriptor sizes per descriptor type
*/
#define USB_DT_DEVICE_SIZE 18
#define USB_DT_CONFIG_SIZE 9
#define USB_DT_INTERFACE_SIZE 9
#define USB_DT_HID_SIZE 9
#define USB_DT_ENDPOINT_SIZE 7
#define USB_DT_QUALIFIER_SIZE 10
#define USB_DT_CS_INTERFACE_SIZE 5
#define USB_DT_IAD_SIZE 8
// bmRequestType & 0x80 == dev2host (1) or host2dev (0)
// recipient: bmRequestType & 0x1f
#define REQUEST_RECIPIENT(b) (b & 0x1f)
#define REQ_RECIPIENT_DEVICE 0
#define REQ_RECIPIENT_INTERFACE 1
#define REQ_RECIPIENT_ENDPOINT 2
#define REQ_RECIPIENT_OTHER 3
// type: [bmRequestType & 0x60 >> 5]
#define REQUEST_TYPE(b) ((b&0x60)>>5)
#define REQ_TYPE_STANDARD 0
#define REQ_TYPE_CLASS 1
#define REQ_TYPE_VENDOR 2
#define REQ_TYPE_RESERVED 3
//#define VENDOR_REQUEST 0x01
// standard device requests
#define GET_STATUS 0x00
#define CLEAR_FEATURE 0x01
#define SET_FEATURE 0x03
#define SET_ADDRESS 0x05
#define GET_DESCRIPTOR 0x06
#define SET_DESCRIPTOR 0x07
#define GET_CONFIGURATION 0x08
#define SET_CONFIGURATION 0x09
// and some standard interface requests
#define GET_INTERFACE 0x0A
#define SET_INTERFACE 0x0B
// and some standard endpoint requests
#define SYNC_FRAME 0x0C
// Types of descriptors
#define DEVICE_DESCRIPTOR 0x01
#define CONFIGURATION_DESCRIPTOR 0x02
#define STRING_DESCRIPTOR 0x03
#define DEVICE_QUALIFIER_DESCRIPTOR 0x06
#define DEBUG_DESCRIPTOR 0x0a
#define HID_REPORT_DESCRIPTOR 0x22
// EP types for EP_init
#define EP_TYPE_BULK 0x00
#define EP_TYPE_CONTROL 0x01
#define EP_TYPE_ISO 0x02
#define EP_TYPE_INTERRUPT 0x03
// EP types for descriptors
#define USB_BM_ATTR_CONTROL 0x00
#define USB_BM_ATTR_ISO 0x01
#define USB_BM_ATTR_BULK 0x02
#define USB_BM_ATTR_INTERRUPT 0x03
/******************************************************************
* Other stuff *
*****************************************************************/
#define RX_FLAG(epstat) (epstat & USB_EPnR_CTR_RX)
#define TX_FLAG(epstat) (epstat & USB_EPnR_CTR_TX)
#define SETUP_FLAG(epstat) (epstat & USB_EPnR_SETUP)
// EPnR bits manipulation
#define KEEP_DTOG_STAT(EPnR) (EPnR & ~(USB_EPnR_STAT_RX|USB_EPnR_STAT_TX|USB_EPnR_DTOG_RX|USB_EPnR_DTOG_TX))
#define KEEP_DTOG(EPnR) (EPnR & ~(USB_EPnR_DTOG_RX|USB_EPnR_DTOG_TX))
#define LANG_US (uint16_t)0x0409
#define _USB_STRING_(name, str) \
static const struct name \
{ \
uint8_t bLength; \
uint8_t bDescriptorType; \
uint16_t bString[(sizeof(str) - 2) / 2]; \
\
} \
name = {sizeof(name), 0x03, str}
#define _USB_LANG_ID_(name, lng_id) \
static const struct name \
{ \
uint8_t bLength; \
uint8_t bDescriptorType; \
uint16_t bString; \
\
} \
name = {0x04, 0x03, lng_id}
// EP0 configuration packet
typedef struct {
uint8_t bmRequestType;
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
} config_pack_t;
// endpoints state
typedef struct{
uint16_t *tx_buf; // transmission buffer address
uint16_t txbufsz; // transmission buffer size
uint8_t *rx_buf; // reception buffer address
void (*func)(); // endpoint action function
unsigned rx_cnt : 10; // received data counter
} ep_t;
extern volatile uint8_t usbON;
void USB_setup();
int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, void (*func)());
void EP_WriteIRQ(uint8_t number, const uint8_t *buf, uint16_t size);
void EP_Write(uint8_t number, const uint8_t *buf, uint16_t size);
int EP_Read(uint8_t number, uint8_t *buf);
// could be [re]defined in usb_dev.c
extern void usb_class_request(config_pack_t *packet, uint8_t *data, uint16_t datalen);
extern void usb_vendor_request(config_pack_t *packet, uint8_t *data, uint16_t datalen);
extern void set_configuration();

View File

@ -0,0 +1,2 @@
#define BUILD_NUMBER "19"
#define BUILD_DATE "2025-03-25"

View File

@ -6,3 +6,10 @@
- 2 or 1 RS-232
- 1 SSI or 1 RS-422 (in this case 1 RS-232)
Inner USB interfaces (IFx):
1..3 - RS-485 (1..3)
4 - RS-232 (1)
5 - RS-232 (2) or RS-485
6 - CAN
7 - SSI (over SPI) or configuration interface (if "Config mode" jumper shortened)

View File

@ -1,38 +1,39 @@
"Reference","Value","Datasheet","Footprint","Qty","DNP"
"C1,C2,C4,C6,C7,C9,C10,C11,C12,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C30,C31","0.1","~","Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder","23",""
"C3","22u","~","Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder","1",""
"C5,C8","12","~","Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder","2",""
"C13,C14,C32,C33","1u","~","Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder","4",""
"C27,C28,C29","0.47","~","Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder","3",""
"D1,D2","1N5817","~","Diode_SMD:D_SMA-SMB_Universal_Handsoldering","2",""
"D3","PESD1CAN","","Package_TO_SOT_SMD:SOT-23","1",""
"D4,D5,D6,D11,D12","SM712_SOT23","https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sm712_datasheet.pdf.pdf","Package_TO_SOT_SMD:SOT-23","5",""
"D7,D8,D9,D10","SMAJ15CA","https://www.littelfuse.com/media?resourcetype=datasheets&itemid=75e32973-b177-4ee3-a0ff-cedaf1abdb93&filename=smaj-datasheet","Diode_SMD:D_SMA","4",""
"C1,C6,C8","0.47","~","Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder","3",""
"C2,C9,C14,C15","1u","~","Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder","4",""
"C3,C4,C5,C7,C10,C11,C13,C16,C17,C18,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32","0.1","~","Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder","22",""
"C12","22u","~","Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder","1",""
"C19,C20","12","~","Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder","2",""
"D1","PESD1CAN","","Package_TO_SOT_SMD:SOT-23","1",""
"D2,D3,D4,D5","SMAJ15CA","https://www.littelfuse.com/media?resourcetype=datasheets&itemid=75e32973-b177-4ee3-a0ff-cedaf1abdb93&filename=smaj-datasheet","Diode_SMD:D_SMA","4",""
"D6,D8,D10,D11,D12","SM712_SOT23","https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sm712_datasheet.pdf.pdf","Package_TO_SOT_SMD:SOT-23","5",""
"D7,D9","1N5817","~","Diode_SMD:D_SMA-SMB_Universal_Handsoldering","2",""
"F1,F2,F3,F4,F5,F6","0.5A","~","Fuse:Fuse_1206_3216Metric","6",""
"J1","Screw_Terminal_01x02","~","TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2_1x02_P5.00mm_Horizontal","1",""
"J2","USB_B","~","Connector_USB:USB_B_OST_USB-B1HSxx_Horizontal","1",""
"J4,J5,J6,J7,J8,J9","Term_3","~","TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-3_1x03_P5.00mm_Horizontal","6",""
"J10","SSI{slash}422","~","my_footprints:DSUB-9_Female_Horizontal_P2.77x2.84mm_EdgePinOffset4.94mm_Housed_MountingHolesOffset7.48mm","1",""
"JP1","Jumper_2_Open","~","Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical","1",""
"JP2,JP3,JP4,JP5,JP6","Jumper_3_Open","~","Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical","5",""
"J1,J2,J4,J5","HOLE","~","MountingHole:MountingHole_3.2mm_M3","4",""
"J6,J7,J8,J12,J13,J14","Term_3","~","TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-3_1x03_P5.00mm_Horizontal","6",""
"J9","Screw_Terminal_01x02","~","TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2_1x02_P5.00mm_Horizontal","1",""
"J10","SSI/422","~","my_footprints:DSUB-9_Female_Horizontal_P2.77x2.84mm_EdgePinOffset4.94mm_Housed_MountingHolesOffset7.48mm","1",""
"J11","USB_B","~","Connector_USB:USB_B_OST_USB-B1HSxx_Horizontal","1",""
"JP1,JP2,JP4,JP5,JP6","Jumper_3_Open","~","Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical","5",""
"JP3","Jumper_2_Open","~","Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical","1",""
"Q1","AO3401","~","Package_TO_SOT_SMD:SOT-23_Handsoldering","1",""
"Q2,Q3,Q4,Q5,Q6","B0505S-1W","","my_footprints:B0x0xS","5",""
"Q7","B0505S-2W","","my_footprints:B0505S-2W","1",""
"R1,R2,R8","22","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","3",""
"R3","1k5","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","1",""
"R4","330","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","1",""
"R5,R7,R18","10k","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","3",""
"R6","1k","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","1",""
"R9","120","","Resistor_SMD:R_1210_3225Metric_Pad1.30x2.65mm_HandSolder","1",""
"R10,R11,R12,R13,R14,R15,R16,R17","510","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","8",""
"SW1,SW2,SW4","SW_Push","~","Button_Switch_SMD:SW_SPST_FSMSM","3",""
"SW3","SW_DIP_x01","~","Button_Switch_THT:SW_DIP_SPSTx01_Slide_6.7x4.1mm_W7.62mm_P2.54mm_LowProfile","1",""
"U1","LM1117MP-3.3","http://www.ti.com/lit/ds/symlink/lm1117.pdf","Package_TO_SOT_SMD:SOT-223-3_TabPin2","1",""
"U2","USBLC6-2SC6","https://www.st.com/resource/en/datasheet/usblc6-2.pdf","Package_TO_SOT_SMD:SOT-23-6","1",""
"U3","STM32F303RBT6","https://www.st.com/resource/en/datasheet/stm32f303rb.pdf","Package_QFP:LQFP-64_10x10mm_P0.5mm","1",""
"U4","ISO1050DUB","http://www.ti.com/lit/ds/symlink/iso1050.pdf","Package_SO:SOP-8_6.62x9.15mm_P2.54mm","1",""
"U5,U6,U7","ISO3088DW","http://www.ti.com/lit/ds/symlink/iso3082.pdf","Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm","3",""
"U8,U9,U10,U11","H11L1","https://www.onsemi.com/pub/Collateral/H11L3M-D.PDF","Package_DIP:DIP-6_W7.62mm","4",""
"U12","MAX3232","https://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf","Package_SO:SOIC-16_3.9x9.9mm_P1.27mm","1",""
"U13","ISO3086","","Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm","1",""
"Q2,Q3,Q5,Q6,Q7","B0505S-1W","","my_footprints:B0x0xS","5",""
"Q4","B0505S-2W","","my_footprints:B0505S-2W","1",""
"R1","120","","Resistor_SMD:R_1210_3225Metric_Pad1.30x2.65mm_HandSolder","1",""
"R2,R3,R4,R5,R6,R7,R8,R9","510","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","8",""
"R10,R14,R16","10k","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","3",""
"R11,R13,R15","22","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","3",""
"R12","1k5","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","1",""
"R17","330","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","1",""
"R18","1k","~","Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder","1",""
"SW1","SW_DIP_x01","~","Button_Switch_THT:SW_DIP_SPSTx01_Slide_6.7x4.1mm_W7.62mm_P2.54mm_LowProfile","1",""
"SW2,SW3,SW4","SW_Push","~","Button_Switch_SMD:SW_SPST_FSMSM","3",""
"U1","ISO1050DUB","http://www.ti.com/lit/ds/symlink/iso1050.pdf","Package_SO:SOP-8_6.62x9.15mm_P2.54mm","1",""
"U2","MAX3232","https://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf","Package_SO:SOIC-16_3.9x9.9mm_P1.27mm","1",""
"U3","ISO3086","","Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm","1",""
"U4","LM1117MP-3.3","http://www.ti.com/lit/ds/symlink/lm1117.pdf","Package_TO_SOT_SMD:SOT-223-3_TabPin2","1",""
"U5","USBLC6-2SC6","https://www.st.com/resource/en/datasheet/usblc6-2.pdf","Package_TO_SOT_SMD:SOT-23-6","1",""
"U6","STM32F303RBT6","https://www.st.com/resource/en/datasheet/stm32f303rb.pdf","Package_QFP:LQFP-64_10x10mm_P0.5mm","1",""
"U7,U8,U9","ISO3088DW","http://www.ti.com/lit/ds/symlink/iso3082.pdf","Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm","3",""
"U10,U11,U12,U13","H11L1","https://www.onsemi.com/pub/Collateral/H11L3M-D.PDF","Package_DIP:DIP-6_W7.62mm","4",""
"Y1","8MHz","~","Crystal:Crystal_HC49-U_Vertical","1",""

1 Reference Value Datasheet Footprint Qty DNP
2 C1,C2,C4,C6,C7,C9,C10,C11,C12,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C30,C31 C1,C6,C8 0.1 0.47 ~ Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder 23 3
3 C3 C2,C9,C14,C15 22u 1u ~ Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder 1 4
4 C5,C8 C3,C4,C5,C7,C10,C11,C13,C16,C17,C18,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32 12 0.1 ~ Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder 2 22
5 C13,C14,C32,C33 C12 1u 22u ~ Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder 4 1
6 C27,C28,C29 C19,C20 0.47 12 ~ Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder 3 2
7 D1,D2 D1 1N5817 PESD1CAN ~ Diode_SMD:D_SMA-SMB_Universal_Handsoldering Package_TO_SOT_SMD:SOT-23 2 1
8 D3 D2,D3,D4,D5 PESD1CAN SMAJ15CA https://www.littelfuse.com/media?resourcetype=datasheets&itemid=75e32973-b177-4ee3-a0ff-cedaf1abdb93&filename=smaj-datasheet Package_TO_SOT_SMD:SOT-23 Diode_SMD:D_SMA 1 4
9 D4,D5,D6,D11,D12 D6,D8,D10,D11,D12 SM712_SOT23 https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sm712_datasheet.pdf.pdf Package_TO_SOT_SMD:SOT-23 5
10 D7,D8,D9,D10 D7,D9 SMAJ15CA 1N5817 https://www.littelfuse.com/media?resourcetype=datasheets&itemid=75e32973-b177-4ee3-a0ff-cedaf1abdb93&filename=smaj-datasheet ~ Diode_SMD:D_SMA Diode_SMD:D_SMA-SMB_Universal_Handsoldering 4 2
11 F1,F2,F3,F4,F5,F6 0.5A ~ Fuse:Fuse_1206_3216Metric 6
12 J1 J1,J2,J4,J5 Screw_Terminal_01x02 HOLE ~ TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2_1x02_P5.00mm_Horizontal MountingHole:MountingHole_3.2mm_M3 1 4
13 J2 J6,J7,J8,J12,J13,J14 USB_B Term_3 ~ Connector_USB:USB_B_OST_USB-B1HSxx_Horizontal TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-3_1x03_P5.00mm_Horizontal 1 6
14 J4,J5,J6,J7,J8,J9 J9 Term_3 Screw_Terminal_01x02 ~ TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-3_1x03_P5.00mm_Horizontal TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2_1x02_P5.00mm_Horizontal 6 1
15 J10 SSI{slash}422 SSI/422 ~ my_footprints:DSUB-9_Female_Horizontal_P2.77x2.84mm_EdgePinOffset4.94mm_Housed_MountingHolesOffset7.48mm 1
16 JP1 J11 Jumper_2_Open USB_B ~ Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical Connector_USB:USB_B_OST_USB-B1HSxx_Horizontal 1
17 JP2,JP3,JP4,JP5,JP6 JP1,JP2,JP4,JP5,JP6 Jumper_3_Open ~ Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical 5
18 JP3 Jumper_2_Open ~ Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical 1
19 Q1 AO3401 ~ Package_TO_SOT_SMD:SOT-23_Handsoldering 1
20 Q2,Q3,Q4,Q5,Q6 Q2,Q3,Q5,Q6,Q7 B0505S-1W my_footprints:B0x0xS 5
21 Q7 Q4 B0505S-2W my_footprints:B0505S-2W 1
22 R1,R2,R8 R1 22 120 ~ Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder Resistor_SMD:R_1210_3225Metric_Pad1.30x2.65mm_HandSolder 3 1
23 R3 R2,R3,R4,R5,R6,R7,R8,R9 1k5 510 ~ Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder 1 8
24 R4 R10,R14,R16 330 10k ~ Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder 1 3
25 R5,R7,R18 R11,R13,R15 10k 22 ~ Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder 3
26 R6 R12 1k 1k5 ~ Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder 1
27 R9 R17 120 330 ~ Resistor_SMD:R_1210_3225Metric_Pad1.30x2.65mm_HandSolder Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder 1
28 R10,R11,R12,R13,R14,R15,R16,R17 R18 510 1k ~ Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder 8 1
29 SW1,SW2,SW4 SW1 SW_Push SW_DIP_x01 ~ Button_Switch_SMD:SW_SPST_FSMSM Button_Switch_THT:SW_DIP_SPSTx01_Slide_6.7x4.1mm_W7.62mm_P2.54mm_LowProfile 3 1
30 SW3 SW2,SW3,SW4 SW_DIP_x01 SW_Push ~ Button_Switch_THT:SW_DIP_SPSTx01_Slide_6.7x4.1mm_W7.62mm_P2.54mm_LowProfile Button_Switch_SMD:SW_SPST_FSMSM 1 3
31 U1 LM1117MP-3.3 ISO1050DUB http://www.ti.com/lit/ds/symlink/lm1117.pdf http://www.ti.com/lit/ds/symlink/iso1050.pdf Package_TO_SOT_SMD:SOT-223-3_TabPin2 Package_SO:SOP-8_6.62x9.15mm_P2.54mm 1
32 U2 USBLC6-2SC6 MAX3232 https://www.st.com/resource/en/datasheet/usblc6-2.pdf https://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf Package_TO_SOT_SMD:SOT-23-6 Package_SO:SOIC-16_3.9x9.9mm_P1.27mm 1
33 U3 STM32F303RBT6 ISO3086 https://www.st.com/resource/en/datasheet/stm32f303rb.pdf Package_QFP:LQFP-64_10x10mm_P0.5mm Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm 1
34 U4 ISO1050DUB LM1117MP-3.3 http://www.ti.com/lit/ds/symlink/iso1050.pdf http://www.ti.com/lit/ds/symlink/lm1117.pdf Package_SO:SOP-8_6.62x9.15mm_P2.54mm Package_TO_SOT_SMD:SOT-223-3_TabPin2 1
35 U5,U6,U7 U5 ISO3088DW USBLC6-2SC6 http://www.ti.com/lit/ds/symlink/iso3082.pdf https://www.st.com/resource/en/datasheet/usblc6-2.pdf Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm Package_TO_SOT_SMD:SOT-23-6 3 1
36 U8,U9,U10,U11 U6 H11L1 STM32F303RBT6 https://www.onsemi.com/pub/Collateral/H11L3M-D.PDF https://www.st.com/resource/en/datasheet/stm32f303rb.pdf Package_DIP:DIP-6_W7.62mm Package_QFP:LQFP-64_10x10mm_P0.5mm 4 1
37 U12 U7,U8,U9 MAX3232 ISO3088DW https://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf http://www.ti.com/lit/ds/symlink/iso3082.pdf Package_SO:SOIC-16_3.9x9.9mm_P1.27mm Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm 1 3
38 U13 U10,U11,U12,U13 ISO3086 H11L1 https://www.onsemi.com/pub/Collateral/H11L3M-D.PDF Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm Package_DIP:DIP-6_W7.62mm 1 4
39 Y1 8MHz ~ Crystal:Crystal_HC49-U_Vertical 1

View File

@ -1,4 +1,4 @@
15604931484873780
15605002417811257
Battery
BatteryClip_Keystone_54_D16-19mm
Battery clip for batteries with a diameter between 16-19 mm: https://www.keyelco.com/product.cfm/product_id/826

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,308 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.0*%
%TF.CreationDate,2025-03-21T17:04:22+03:00*%
%TF.ProjectId,many485,6d616e79-3438-4352-9e6b-696361645f70,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 9.0.0) date 2025-03-21 17:04:22*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10C,3.000000*%
%ADD11RoundRect,0.250000X-1.050000X1.050000X-1.050000X-1.050000X1.050000X-1.050000X1.050000X1.050000X0*%
%ADD12C,2.600000*%
%ADD13R,1.700000X1.700000*%
%ADD14C,1.700000*%
%ADD15RoundRect,0.250000X-1.050000X-1.050000X1.050000X-1.050000X1.050000X1.050000X-1.050000X1.050000X0*%
%ADD16RoundRect,0.250000X1.050000X1.050000X-1.050000X1.050000X-1.050000X-1.050000X1.050000X-1.050000X0*%
%ADD17R,1.000000X1.000000*%
%ADD18C,1.000000*%
%ADD19C,3.200000*%
%ADD20C,1.500000*%
%ADD21RoundRect,0.250000X0.550000X0.550000X-0.550000X0.550000X-0.550000X-0.550000X0.550000X-0.550000X0*%
%ADD22C,1.600000*%
%ADD23RoundRect,0.250000X-0.550000X-0.550000X0.550000X-0.550000X0.550000X0.550000X-0.550000X0.550000X0*%
%ADD24RoundRect,0.381000X-0.381000X0.619000X-0.381000X-0.619000X0.381000X-0.619000X0.381000X0.619000X0*%
%ADD25RoundRect,0.381000X-0.381000X0.762000X-0.381000X-0.762000X0.381000X-0.762000X0.381000X0.762000X0*%
%ADD26R,1.600000X2.180000*%
%ADD27C,4.000000*%
%ADD28R,1.600000X1.600000*%
%ADD29C,3.500000*%
G04 APERTURE END LIST*
D10*
%TO.C,TP1*%
X122631200Y-67767200D03*
%TD*%
%TO.C,TP3*%
X129032000Y-73406000D03*
%TD*%
%TO.C,TP2*%
X128981200Y-67716400D03*
%TD*%
D11*
%TO.C,J9*%
X144241300Y-65521200D03*
D12*
X144241300Y-70521200D03*
%TD*%
D13*
%TO.C,JP3*%
X127711200Y-77825600D03*
D14*
X130251200Y-77825600D03*
%TD*%
D13*
%TO.C,JP2*%
X104038400Y-68732400D03*
D14*
X104038400Y-66192400D03*
X104038400Y-63652400D03*
%TD*%
D13*
%TO.C,JP5*%
X86800000Y-85700000D03*
D14*
X86800000Y-83160000D03*
X86800000Y-80620000D03*
%TD*%
D13*
%TO.C,JP6*%
X73304400Y-108000800D03*
D14*
X73304400Y-105460800D03*
X73304400Y-102920800D03*
%TD*%
D13*
%TO.C,JP1*%
X107746800Y-68732400D03*
D14*
X107746800Y-66192400D03*
X107746800Y-63652400D03*
%TD*%
D13*
%TO.C,JP4*%
X90600000Y-85700000D03*
D14*
X90600000Y-83160000D03*
X90600000Y-80620000D03*
%TD*%
D15*
%TO.C,J7*%
X113486600Y-38083600D03*
D12*
X118486600Y-38083600D03*
X123486600Y-38083600D03*
%TD*%
D16*
%TO.C,J13*%
X120179200Y-114374500D03*
D12*
X115179200Y-114374500D03*
X110179200Y-114374500D03*
%TD*%
D16*
%TO.C,J14*%
X103679200Y-114374500D03*
D12*
X98679200Y-114374500D03*
X93679200Y-114374500D03*
%TD*%
D16*
%TO.C,J12*%
X136679200Y-114374500D03*
D12*
X131679200Y-114374500D03*
X126679200Y-114374500D03*
%TD*%
D15*
%TO.C,J6*%
X130486600Y-38083600D03*
D12*
X135486600Y-38083600D03*
X140486600Y-38083600D03*
%TD*%
D15*
%TO.C,J8*%
X86669500Y-38603500D03*
D12*
X91669500Y-38603500D03*
X96669500Y-38603500D03*
%TD*%
D17*
%TO.C,J3*%
X147750000Y-97900000D03*
D18*
X147750000Y-99170000D03*
X147750000Y-100440000D03*
X147750000Y-101710000D03*
X147750000Y-102980000D03*
X147750000Y-104250000D03*
%TD*%
D19*
%TO.C,J1*%
X74000000Y-37500000D03*
%TD*%
%TO.C,J5*%
X147000000Y-114500000D03*
%TD*%
%TO.C,J4*%
X74000000Y-114500000D03*
%TD*%
%TO.C,J2*%
X147000000Y-37500000D03*
%TD*%
D20*
%TO.C,Q2*%
X80899100Y-54342100D03*
X80899100Y-51802100D03*
X80899100Y-49262100D03*
X80899100Y-46722100D03*
%TD*%
D21*
%TO.C,U13*%
X114249200Y-54356000D03*
D22*
X114249200Y-56896000D03*
X114249200Y-59436000D03*
X106629200Y-59436000D03*
X106629200Y-56896000D03*
X106629200Y-54356000D03*
%TD*%
D23*
%TO.C,U11*%
X106639200Y-50647600D03*
D22*
X106639200Y-48107600D03*
X106639200Y-45567600D03*
X114259200Y-45567600D03*
X114259200Y-48107600D03*
X114259200Y-50647600D03*
%TD*%
D21*
%TO.C,SW1*%
X108805000Y-38585000D03*
D22*
X101185000Y-38585000D03*
%TD*%
D20*
%TO.C,Q3*%
X131973400Y-64363600D03*
X131973400Y-61823600D03*
X131973400Y-59283600D03*
X131973400Y-56743600D03*
%TD*%
%TO.C,Y1*%
X95758000Y-79033200D03*
X95758000Y-83913200D03*
%TD*%
%TO.C,Q7*%
X105582000Y-98370900D03*
X105582000Y-100910900D03*
X105582000Y-103450900D03*
X105582000Y-105990900D03*
%TD*%
D24*
%TO.C,Q4*%
X82288800Y-97078600D03*
X82288800Y-99618600D03*
D25*
X82288800Y-104698600D03*
X82288800Y-109778600D03*
%TD*%
D26*
%TO.C,SW2*%
X84277200Y-73881200D03*
X84277200Y-64701200D03*
%TD*%
%TO.C,SW3*%
X134800000Y-90100000D03*
X134800000Y-80920000D03*
%TD*%
D21*
%TO.C,U12*%
X147269200Y-54356000D03*
D22*
X147269200Y-56896000D03*
X147269200Y-59436000D03*
X139649200Y-59436000D03*
X139649200Y-56896000D03*
X139649200Y-54356000D03*
%TD*%
D20*
%TO.C,Q5*%
X138582000Y-98370900D03*
X138582000Y-100910900D03*
X138582000Y-103450900D03*
X138582000Y-105990900D03*
%TD*%
D27*
%TO.C,J10*%
X77000000Y-85500000D03*
X77000000Y-60500000D03*
D28*
X77300000Y-67460000D03*
D22*
X77300000Y-70230000D03*
X77300000Y-73000000D03*
X77300000Y-75770000D03*
X77300000Y-78540000D03*
X74460000Y-68845000D03*
X74460000Y-71615000D03*
X74460000Y-74385000D03*
X74460000Y-77155000D03*
%TD*%
D13*
%TO.C,J11*%
X142317300Y-83241200D03*
D14*
X142317300Y-80741200D03*
X144317300Y-80741200D03*
X144317300Y-83241200D03*
D29*
X147027300Y-75971200D03*
X147027300Y-88011200D03*
%TD*%
D23*
%TO.C,U10*%
X139760800Y-50698400D03*
D22*
X139760800Y-48158400D03*
X139760800Y-45618400D03*
X147380800Y-45618400D03*
X147380800Y-48158400D03*
X147380800Y-50698400D03*
%TD*%
D20*
%TO.C,Q6*%
X122082000Y-98370900D03*
X122082000Y-100910900D03*
X122082000Y-103450900D03*
X122082000Y-105990900D03*
%TD*%
D26*
%TO.C,SW4*%
X119800000Y-90090000D03*
X119800000Y-80910000D03*
%TD*%
M02*

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,23 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.0*%
%TF.CreationDate,2025-03-21T17:04:22+03:00*%
%TF.ProjectId,many485,6d616e79-3438-4352-9e6b-696361645f70,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 9.0.0) date 2025-03-21 17:04:22*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,Profile*%
%ADD10C,0.050000*%
%TD*%
G04 APERTURE END LIST*
D10*
X70500000Y-34000000D02*
X150500000Y-34000000D01*
X150500000Y-118000000D01*
X70500000Y-118000000D01*
X70500000Y-34000000D01*
M02*

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,875 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.0*%
%TF.CreationDate,2025-03-21T17:04:22+03:00*%
%TF.ProjectId,many485,6d616e79-3438-4352-9e6b-696361645f70,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 9.0.0) date 2025-03-21 17:04:22*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
%AMOutline4P*
0 Free polygon, 4 corners , with rotation*
0 The origin of the aperture is its center*
0 number of corners: always 4*
0 $1 to $8 corner X, Y*
0 $9 Rotation angle, in degrees counterclockwise*
0 create outline with 4 corners*
4,1,4,$1,$2,$3,$4,$5,$6,$7,$8,$1,$2,$9*%
G04 Aperture macros list end*
%ADD10C,3.000000*%
%ADD11RoundRect,0.250000X-1.050000X1.050000X-1.050000X-1.050000X1.050000X-1.050000X1.050000X1.050000X0*%
%ADD12C,2.600000*%
%ADD13RoundRect,0.075000X-0.700000X-0.075000X0.700000X-0.075000X0.700000X0.075000X-0.700000X0.075000X0*%
%ADD14RoundRect,0.075000X-0.075000X-0.700000X0.075000X-0.700000X0.075000X0.700000X-0.075000X0.700000X0*%
%ADD15RoundRect,0.150000X-0.825000X-0.150000X0.825000X-0.150000X0.825000X0.150000X-0.825000X0.150000X0*%
%ADD16R,1.700000X1.700000*%
%ADD17C,1.700000*%
%ADD18RoundRect,0.250000X-1.050000X-1.050000X1.050000X-1.050000X1.050000X1.050000X-1.050000X1.050000X0*%
%ADD19RoundRect,0.250000X1.050000X1.050000X-1.050000X1.050000X-1.050000X-1.050000X1.050000X-1.050000X0*%
%ADD20R,1.000000X1.000000*%
%ADD21C,1.000000*%
%ADD22RoundRect,0.162500X0.162500X-1.012500X0.162500X1.012500X-0.162500X1.012500X-0.162500X-1.012500X0*%
%ADD23RoundRect,0.150000X-0.512500X-0.150000X0.512500X-0.150000X0.512500X0.150000X-0.512500X0.150000X0*%
%ADD24RoundRect,0.150000X-0.150000X0.875000X-0.150000X-0.875000X0.150000X-0.875000X0.150000X0.875000X0*%
%ADD25RoundRect,0.150000X0.875000X0.150000X-0.875000X0.150000X-0.875000X-0.150000X0.875000X-0.150000X0*%
%ADD26RoundRect,0.150000X0.587500X0.150000X-0.587500X0.150000X-0.587500X-0.150000X0.587500X-0.150000X0*%
%ADD27RoundRect,0.150000X-0.150000X0.587500X-0.150000X-0.587500X0.150000X-0.587500X0.150000X0.587500X0*%
%ADD28RoundRect,0.237500X0.237500X-0.300000X0.237500X0.300000X-0.237500X0.300000X-0.237500X-0.300000X0*%
%ADD29RoundRect,0.250000X-1.000000X-0.650000X1.000000X-0.650000X1.000000X0.650000X-1.000000X0.650000X0*%
%ADD30RoundRect,0.250000X-0.625000X0.375000X-0.625000X-0.375000X0.625000X-0.375000X0.625000X0.375000X0*%
%ADD31RoundRect,0.250000X0.337500X0.475000X-0.337500X0.475000X-0.337500X-0.475000X0.337500X-0.475000X0*%
%ADD32RoundRect,0.250000X-0.475000X0.337500X-0.475000X-0.337500X0.475000X-0.337500X0.475000X0.337500X0*%
%ADD33RoundRect,0.237500X-0.300000X-0.237500X0.300000X-0.237500X0.300000X0.237500X-0.300000X0.237500X0*%
%ADD34RoundRect,0.250000X0.375000X0.625000X-0.375000X0.625000X-0.375000X-0.625000X0.375000X-0.625000X0*%
%ADD35RoundRect,0.375000X0.375000X-0.625000X0.375000X0.625000X-0.375000X0.625000X-0.375000X-0.625000X0*%
%ADD36RoundRect,0.500000X1.400000X-0.500000X1.400000X0.500000X-1.400000X0.500000X-1.400000X-0.500000X0*%
%ADD37C,3.200000*%
%ADD38RoundRect,0.237500X-0.250000X-0.237500X0.250000X-0.237500X0.250000X0.237500X-0.250000X0.237500X0*%
%ADD39RoundRect,0.237500X0.300000X0.237500X-0.300000X0.237500X-0.300000X-0.237500X0.300000X-0.237500X0*%
%ADD40RoundRect,0.237500X-0.237500X0.300000X-0.237500X-0.300000X0.237500X-0.300000X0.237500X0.300000X0*%
%ADD41RoundRect,0.237500X-0.237500X0.250000X-0.237500X-0.250000X0.237500X-0.250000X0.237500X0.250000X0*%
%ADD42RoundRect,0.200000X-0.200000X0.750000X-0.200000X-0.750000X0.200000X-0.750000X0.200000X0.750000X0*%
%ADD43RoundRect,0.250000X0.625000X-0.375000X0.625000X0.375000X-0.625000X0.375000X-0.625000X-0.375000X0*%
%ADD44RoundRect,0.250000X0.400000X1.075000X-0.400000X1.075000X-0.400000X-1.075000X0.400000X-1.075000X0*%
%ADD45RoundRect,0.237500X0.237500X-0.250000X0.237500X0.250000X-0.237500X0.250000X-0.237500X-0.250000X0*%
%ADD46RoundRect,0.237500X0.250000X0.237500X-0.250000X0.237500X-0.250000X-0.237500X0.250000X-0.237500X0*%
%ADD47Outline4P,-1.800000X-1.150000X1.800000X-0.550000X1.800000X0.550000X-1.800000X1.150000X0.000000*%
%ADD48Outline4P,-1.800000X-1.150000X1.800000X-0.550000X1.800000X0.550000X-1.800000X1.150000X180.000000*%
%ADD49RoundRect,0.250000X0.475000X-0.337500X0.475000X0.337500X-0.475000X0.337500X-0.475000X-0.337500X0*%
%ADD50RoundRect,0.250000X-0.337500X-0.475000X0.337500X-0.475000X0.337500X0.475000X-0.337500X0.475000X0*%
%ADD51C,1.500000*%
%ADD52RoundRect,0.250000X0.550000X0.550000X-0.550000X0.550000X-0.550000X-0.550000X0.550000X-0.550000X0*%
%ADD53C,1.600000*%
%ADD54RoundRect,0.250000X-0.550000X-0.550000X0.550000X-0.550000X0.550000X0.550000X-0.550000X0.550000X0*%
%ADD55RoundRect,0.381000X-0.381000X0.619000X-0.381000X-0.619000X0.381000X-0.619000X0.381000X0.619000X0*%
%ADD56RoundRect,0.381000X-0.381000X0.762000X-0.381000X-0.762000X0.381000X-0.762000X0.381000X0.762000X0*%
%ADD57C,4.000000*%
%ADD58R,1.600000X1.600000*%
%ADD59C,3.500000*%
G04 APERTURE END LIST*
D10*
%TO.C,TP1*%
X122631200Y-67767200D03*
%TD*%
%TO.C,TP3*%
X129032000Y-73406000D03*
%TD*%
%TO.C,TP2*%
X128981200Y-67716400D03*
%TD*%
D11*
%TO.C,J9*%
X144241300Y-65521200D03*
D12*
X144241300Y-70521200D03*
%TD*%
D13*
%TO.C,U6*%
X101325000Y-79250000D03*
X101325000Y-79750000D03*
X101325000Y-80250000D03*
X101325000Y-80750000D03*
X101325000Y-81250000D03*
X101325000Y-81750000D03*
X101325000Y-82250000D03*
X101325000Y-82750000D03*
X101325000Y-83250000D03*
X101325000Y-83750000D03*
X101325000Y-84250000D03*
X101325000Y-84750000D03*
X101325000Y-85250000D03*
X101325000Y-85750000D03*
X101325000Y-86250000D03*
X101325000Y-86750000D03*
D14*
X103250000Y-88675000D03*
X103750000Y-88675000D03*
X104250000Y-88675000D03*
X104750000Y-88675000D03*
X105250000Y-88675000D03*
X105750000Y-88675000D03*
X106250000Y-88675000D03*
X106750000Y-88675000D03*
X107250000Y-88675000D03*
X107750000Y-88675000D03*
X108250000Y-88675000D03*
X108750000Y-88675000D03*
X109250000Y-88675000D03*
X109750000Y-88675000D03*
X110250000Y-88675000D03*
X110750000Y-88675000D03*
D13*
X112675000Y-86750000D03*
X112675000Y-86250000D03*
X112675000Y-85750000D03*
X112675000Y-85250000D03*
X112675000Y-84750000D03*
X112675000Y-84250000D03*
X112675000Y-83750000D03*
X112675000Y-83250000D03*
X112675000Y-82750000D03*
X112675000Y-82250000D03*
X112675000Y-81750000D03*
X112675000Y-81250000D03*
X112675000Y-80750000D03*
X112675000Y-80250000D03*
X112675000Y-79750000D03*
X112675000Y-79250000D03*
D14*
X110750000Y-77325000D03*
X110250000Y-77325000D03*
X109750000Y-77325000D03*
X109250000Y-77325000D03*
X108750000Y-77325000D03*
X108250000Y-77325000D03*
X107750000Y-77325000D03*
X107250000Y-77325000D03*
X106750000Y-77325000D03*
X106250000Y-77325000D03*
X105750000Y-77325000D03*
X105250000Y-77325000D03*
X104750000Y-77325000D03*
X104250000Y-77325000D03*
X103750000Y-77325000D03*
X103250000Y-77325000D03*
%TD*%
D15*
%TO.C,U2*%
X124493400Y-46075600D03*
X124493400Y-47345600D03*
X124493400Y-48615600D03*
X124493400Y-49885600D03*
X124493400Y-51155600D03*
X124493400Y-52425600D03*
X124493400Y-53695600D03*
X124493400Y-54965600D03*
X129443400Y-54965600D03*
X129443400Y-53695600D03*
X129443400Y-52425600D03*
X129443400Y-51155600D03*
X129443400Y-49885600D03*
X129443400Y-48615600D03*
X129443400Y-47345600D03*
X129443400Y-46075600D03*
%TD*%
D16*
%TO.C,JP3*%
X127711200Y-77825600D03*
D17*
X130251200Y-77825600D03*
%TD*%
D16*
%TO.C,JP2*%
X104038400Y-68732400D03*
D17*
X104038400Y-66192400D03*
X104038400Y-63652400D03*
%TD*%
D16*
%TO.C,JP5*%
X86800000Y-85700000D03*
D17*
X86800000Y-83160000D03*
X86800000Y-80620000D03*
%TD*%
D16*
%TO.C,JP6*%
X73304400Y-108000800D03*
D17*
X73304400Y-105460800D03*
X73304400Y-102920800D03*
%TD*%
D16*
%TO.C,JP1*%
X107746800Y-68732400D03*
D17*
X107746800Y-66192400D03*
X107746800Y-63652400D03*
%TD*%
D16*
%TO.C,JP4*%
X90600000Y-85700000D03*
D17*
X90600000Y-83160000D03*
X90600000Y-80620000D03*
%TD*%
D18*
%TO.C,J7*%
X113486600Y-38083600D03*
D12*
X118486600Y-38083600D03*
X123486600Y-38083600D03*
%TD*%
D19*
%TO.C,J13*%
X120179200Y-114374500D03*
D12*
X115179200Y-114374500D03*
X110179200Y-114374500D03*
%TD*%
D19*
%TO.C,J14*%
X103679200Y-114374500D03*
D12*
X98679200Y-114374500D03*
X93679200Y-114374500D03*
%TD*%
D19*
%TO.C,J12*%
X136679200Y-114374500D03*
D12*
X131679200Y-114374500D03*
X126679200Y-114374500D03*
%TD*%
D18*
%TO.C,J6*%
X130486600Y-38083600D03*
D12*
X135486600Y-38083600D03*
X140486600Y-38083600D03*
%TD*%
D18*
%TO.C,J8*%
X86669500Y-38603500D03*
D12*
X91669500Y-38603500D03*
X96669500Y-38603500D03*
%TD*%
D20*
%TO.C,J3*%
X147750000Y-97900000D03*
D21*
X147750000Y-99170000D03*
X147750000Y-100440000D03*
X147750000Y-101710000D03*
X147750000Y-102980000D03*
X147750000Y-104250000D03*
%TD*%
D22*
%TO.C,U1*%
X87858700Y-55010100D03*
X90398700Y-55010100D03*
X92938700Y-55010100D03*
X95478700Y-55010100D03*
X95478700Y-45960100D03*
X92938700Y-45960100D03*
X90398700Y-45960100D03*
X87858700Y-45960100D03*
%TD*%
D23*
%TO.C,U5*%
X117023300Y-79974400D03*
X117023300Y-80924400D03*
X117023300Y-81874400D03*
X119298300Y-81874400D03*
X119298300Y-80924400D03*
X119298300Y-79974400D03*
%TD*%
D24*
%TO.C,U7*%
X103220000Y-97500000D03*
X101950000Y-97500000D03*
X100680000Y-97500000D03*
X99410000Y-97500000D03*
X98140000Y-97500000D03*
X96870000Y-97500000D03*
X95600000Y-97500000D03*
X94330000Y-97500000D03*
X94330000Y-106800000D03*
X95600000Y-106800000D03*
X96870000Y-106800000D03*
X98140000Y-106800000D03*
X99410000Y-106800000D03*
X100680000Y-106800000D03*
X101950000Y-106800000D03*
X103220000Y-106800000D03*
%TD*%
%TO.C,U8*%
X119720000Y-97500000D03*
X118450000Y-97500000D03*
X117180000Y-97500000D03*
X115910000Y-97500000D03*
X114640000Y-97500000D03*
X113370000Y-97500000D03*
X112100000Y-97500000D03*
X110830000Y-97500000D03*
X110830000Y-106800000D03*
X112100000Y-106800000D03*
X113370000Y-106800000D03*
X114640000Y-106800000D03*
X115910000Y-106800000D03*
X117180000Y-106800000D03*
X118450000Y-106800000D03*
X119720000Y-106800000D03*
%TD*%
D25*
%TO.C,U3*%
X98731600Y-69832400D03*
X98731600Y-68562400D03*
X98731600Y-67292400D03*
X98731600Y-66022400D03*
X98731600Y-64752400D03*
X98731600Y-63482400D03*
X98731600Y-62212400D03*
X98731600Y-60942400D03*
X89431600Y-60942400D03*
X89431600Y-62212400D03*
X89431600Y-63482400D03*
X89431600Y-64752400D03*
X89431600Y-66022400D03*
X89431600Y-67292400D03*
X89431600Y-68562400D03*
X89431600Y-69832400D03*
%TD*%
D24*
%TO.C,U9*%
X136220000Y-97500000D03*
X134950000Y-97500000D03*
X133680000Y-97500000D03*
X132410000Y-97500000D03*
X131140000Y-97500000D03*
X129870000Y-97500000D03*
X128600000Y-97500000D03*
X127330000Y-97500000D03*
X127330000Y-106800000D03*
X128600000Y-106800000D03*
X129870000Y-106800000D03*
X131140000Y-106800000D03*
X132410000Y-106800000D03*
X133680000Y-106800000D03*
X134950000Y-106800000D03*
X136220000Y-106800000D03*
%TD*%
D26*
%TO.C,D6*%
X81542600Y-69313200D03*
X81542600Y-67413200D03*
X79667600Y-68363200D03*
%TD*%
D27*
%TO.C,D11*%
X116177000Y-109655500D03*
X114277000Y-109655500D03*
X115227000Y-111530500D03*
%TD*%
%TO.C,D10*%
X99677000Y-109655500D03*
X97777000Y-109655500D03*
X98727000Y-111530500D03*
%TD*%
%TO.C,D12*%
X132677000Y-109655500D03*
X130777000Y-109655500D03*
X131727000Y-111530500D03*
%TD*%
D26*
%TO.C,D8*%
X81491800Y-72970800D03*
X81491800Y-71070800D03*
X79616800Y-72020800D03*
%TD*%
D27*
%TO.C,D1*%
X92603500Y-41396500D03*
X90703500Y-41396500D03*
X91653500Y-43271500D03*
%TD*%
D28*
%TO.C,C18*%
X114808000Y-78790800D03*
X114808000Y-77065800D03*
%TD*%
D29*
%TO.C,D2*%
X112591000Y-41706800D03*
X116591000Y-41706800D03*
%TD*%
D30*
%TO.C,F6*%
X108559600Y-97231200D03*
X108559600Y-100031200D03*
%TD*%
D31*
%TO.C,C14*%
X87172800Y-72186800D03*
X85097800Y-72186800D03*
%TD*%
D32*
%TO.C,C9*%
X85369500Y-52919700D03*
X85369500Y-54994700D03*
%TD*%
D33*
%TO.C,C25*%
X102095000Y-94923500D03*
X103820000Y-94923500D03*
%TD*%
%TO.C,C20*%
X96875600Y-82753200D03*
X98600600Y-82753200D03*
%TD*%
D34*
%TO.C,F5*%
X125199000Y-94923500D03*
X122399000Y-94923500D03*
%TD*%
D35*
%TO.C,U4*%
X114438400Y-70663600D03*
X116738400Y-70663600D03*
D36*
X116738400Y-64363600D03*
D35*
X119038400Y-70663600D03*
%TD*%
D37*
%TO.C,J1*%
X74000000Y-37500000D03*
%TD*%
D28*
%TO.C,C7*%
X145745200Y-50850800D03*
X145745200Y-49125800D03*
%TD*%
D38*
%TO.C,R11*%
X116586000Y-77063600D03*
X118411000Y-77063600D03*
%TD*%
D39*
%TO.C,C16*%
X116177400Y-73050400D03*
X114452400Y-73050400D03*
%TD*%
%TO.C,C30*%
X103365000Y-109401500D03*
X101640000Y-109401500D03*
%TD*%
D40*
%TO.C,C10*%
X108610400Y-54254400D03*
X108610400Y-55979400D03*
%TD*%
D41*
%TO.C,R2*%
X112328800Y-45466000D03*
X112328800Y-47291000D03*
%TD*%
D42*
%TO.C,Q1*%
X123835200Y-73200000D03*
X121935200Y-73200000D03*
X122885200Y-76200000D03*
%TD*%
D31*
%TO.C,C6*%
X122026600Y-50038000D03*
X119951600Y-50038000D03*
%TD*%
D43*
%TO.C,F1*%
X99466400Y-57156000D03*
X99466400Y-54356000D03*
%TD*%
D44*
%TO.C,R1*%
X86691500Y-42357100D03*
X83591500Y-42357100D03*
%TD*%
D29*
%TO.C,D3*%
X120071800Y-41706800D03*
X124071800Y-41706800D03*
%TD*%
D34*
%TO.C,F3*%
X90932000Y-93268800D03*
X88132000Y-93268800D03*
%TD*%
D33*
%TO.C,C19*%
X96877800Y-80111600D03*
X98602800Y-80111600D03*
%TD*%
D30*
%TO.C,F4*%
X138887200Y-91992800D03*
X138887200Y-94792800D03*
%TD*%
D41*
%TO.C,R3*%
X145745200Y-45516800D03*
X145745200Y-47341800D03*
%TD*%
D45*
%TO.C,R9*%
X141579600Y-59537600D03*
X141579600Y-57712600D03*
%TD*%
D40*
%TO.C,C3*%
X119842200Y-46329600D03*
X119842200Y-48054600D03*
%TD*%
D45*
%TO.C,R10*%
X105714800Y-75133200D03*
X105714800Y-73308200D03*
%TD*%
D39*
%TO.C,C32*%
X136365000Y-109401500D03*
X134640000Y-109401500D03*
%TD*%
D33*
%TO.C,C24*%
X111305000Y-90881200D03*
X113030000Y-90881200D03*
%TD*%
D29*
%TO.C,D5*%
X137178200Y-41757600D03*
X141178200Y-41757600D03*
%TD*%
D38*
%TO.C,R17*%
X120651900Y-83870800D03*
X122476900Y-83870800D03*
%TD*%
D37*
%TO.C,J5*%
X147000000Y-114500000D03*
%TD*%
D33*
%TO.C,C27*%
X135095000Y-94923500D03*
X136820000Y-94923500D03*
%TD*%
D39*
%TO.C,C17*%
X101904800Y-75082400D03*
X100179800Y-75082400D03*
%TD*%
D46*
%TO.C,R16*%
X118821200Y-83870800D03*
X116996200Y-83870800D03*
%TD*%
%TO.C,R14*%
X78598900Y-80860000D03*
X76773900Y-80860000D03*
%TD*%
D41*
%TO.C,R4*%
X108620400Y-46837600D03*
X108620400Y-48662600D03*
%TD*%
D28*
%TO.C,C13*%
X134315200Y-67206200D03*
X134315200Y-65481200D03*
%TD*%
D39*
%TO.C,C31*%
X119865000Y-109401500D03*
X118140000Y-109401500D03*
%TD*%
%TO.C,C22*%
X116484400Y-88595200D03*
X114759400Y-88595200D03*
%TD*%
D45*
%TO.C,R8*%
X108610400Y-59537600D03*
X108610400Y-57712600D03*
%TD*%
D37*
%TO.C,J4*%
X74000000Y-114500000D03*
%TD*%
D47*
%TO.C,D9*%
X134306400Y-75234800D03*
D48*
X140106400Y-75234800D03*
%TD*%
D49*
%TO.C,C1*%
X121925000Y-47345600D03*
X121925000Y-45270600D03*
%TD*%
D46*
%TO.C,R13*%
X126234200Y-79959200D03*
X124409200Y-79959200D03*
%TD*%
D41*
%TO.C,R6*%
X112623600Y-56341000D03*
X112623600Y-58166000D03*
%TD*%
D32*
%TO.C,C2*%
X85369500Y-45960100D03*
X85369500Y-48035100D03*
%TD*%
D45*
%TO.C,R5*%
X141792800Y-48715300D03*
X141792800Y-46890300D03*
%TD*%
D33*
%TO.C,C26*%
X118595000Y-94923500D03*
X120320000Y-94923500D03*
%TD*%
D40*
%TO.C,C21*%
X98552000Y-84734400D03*
X98552000Y-86459400D03*
%TD*%
D50*
%TO.C,C12*%
X121673800Y-64363600D03*
X123748800Y-64363600D03*
%TD*%
D47*
%TO.C,D7*%
X134306400Y-70510400D03*
D48*
X140106400Y-70510400D03*
%TD*%
D50*
%TO.C,C8*%
X119951600Y-52425600D03*
X122026600Y-52425600D03*
%TD*%
D40*
%TO.C,C29*%
X84500000Y-104700000D03*
X84500000Y-106425000D03*
%TD*%
D33*
%TO.C,C23*%
X101602200Y-90881200D03*
X103327200Y-90881200D03*
%TD*%
D43*
%TO.C,F2*%
X103022400Y-57156000D03*
X103022400Y-54356000D03*
%TD*%
D28*
%TO.C,C5*%
X112328800Y-50749200D03*
X112328800Y-49024200D03*
%TD*%
D45*
%TO.C,R7*%
X145491200Y-58724800D03*
X145491200Y-56899800D03*
%TD*%
D46*
%TO.C,R15*%
X126234200Y-81838800D03*
X124409200Y-81838800D03*
%TD*%
D50*
%TO.C,C15*%
X96629400Y-72186800D03*
X98704400Y-72186800D03*
%TD*%
D29*
%TO.C,D4*%
X129774600Y-41757600D03*
X133774600Y-41757600D03*
%TD*%
D28*
%TO.C,C28*%
X84500000Y-98802800D03*
X84500000Y-97077800D03*
%TD*%
D40*
%TO.C,C4*%
X131780200Y-45821600D03*
X131780200Y-47546600D03*
%TD*%
D37*
%TO.C,J2*%
X147000000Y-37500000D03*
%TD*%
D46*
%TO.C,R12*%
X122881400Y-78333600D03*
X121056400Y-78333600D03*
%TD*%
%TO.C,R18*%
X116582200Y-90881200D03*
X114757200Y-90881200D03*
%TD*%
D40*
%TO.C,C11*%
X141579600Y-54254400D03*
X141579600Y-55979400D03*
%TD*%
D51*
%TO.C,Q2*%
X80899100Y-54342100D03*
X80899100Y-51802100D03*
X80899100Y-49262100D03*
X80899100Y-46722100D03*
%TD*%
D52*
%TO.C,U13*%
X114249200Y-54356000D03*
D53*
X114249200Y-56896000D03*
X114249200Y-59436000D03*
X106629200Y-59436000D03*
X106629200Y-56896000D03*
X106629200Y-54356000D03*
%TD*%
D54*
%TO.C,U11*%
X106639200Y-50647600D03*
D53*
X106639200Y-48107600D03*
X106639200Y-45567600D03*
X114259200Y-45567600D03*
X114259200Y-48107600D03*
X114259200Y-50647600D03*
%TD*%
D52*
%TO.C,SW1*%
X108805000Y-38585000D03*
D53*
X101185000Y-38585000D03*
%TD*%
D51*
%TO.C,Q3*%
X131973400Y-64363600D03*
X131973400Y-61823600D03*
X131973400Y-59283600D03*
X131973400Y-56743600D03*
%TD*%
%TO.C,Y1*%
X95758000Y-79033200D03*
X95758000Y-83913200D03*
%TD*%
%TO.C,Q7*%
X105582000Y-98370900D03*
X105582000Y-100910900D03*
X105582000Y-103450900D03*
X105582000Y-105990900D03*
%TD*%
D55*
%TO.C,Q4*%
X82288800Y-97078600D03*
X82288800Y-99618600D03*
D56*
X82288800Y-104698600D03*
X82288800Y-109778600D03*
%TD*%
D52*
%TO.C,U12*%
X147269200Y-54356000D03*
D53*
X147269200Y-56896000D03*
X147269200Y-59436000D03*
X139649200Y-59436000D03*
X139649200Y-56896000D03*
X139649200Y-54356000D03*
%TD*%
D51*
%TO.C,Q5*%
X138582000Y-98370900D03*
X138582000Y-100910900D03*
X138582000Y-103450900D03*
X138582000Y-105990900D03*
%TD*%
D57*
%TO.C,J10*%
X77000000Y-85500000D03*
X77000000Y-60500000D03*
D58*
X77300000Y-67460000D03*
D53*
X77300000Y-70230000D03*
X77300000Y-73000000D03*
X77300000Y-75770000D03*
X77300000Y-78540000D03*
X74460000Y-68845000D03*
X74460000Y-71615000D03*
X74460000Y-74385000D03*
X74460000Y-77155000D03*
%TD*%
D16*
%TO.C,J11*%
X142317300Y-83241200D03*
D17*
X142317300Y-80741200D03*
X144317300Y-80741200D03*
X144317300Y-83241200D03*
D59*
X147027300Y-75971200D03*
X147027300Y-88011200D03*
%TD*%
D54*
%TO.C,U10*%
X139760800Y-50698400D03*
D53*
X139760800Y-48158400D03*
X139760800Y-45618400D03*
X147380800Y-45618400D03*
X147380800Y-48158400D03*
X147380800Y-50698400D03*
%TD*%
D51*
%TO.C,Q6*%
X122082000Y-98370900D03*
X122082000Y-100910900D03*
X122082000Y-103450900D03*
X122082000Y-105990900D03*
%TD*%
M02*

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,34 @@
Drill report for many485.kicad_pcb
Created on 2025-03-21T17:04:16+0300
Copper Layer Stackup:
=============================================================
L1 : F.Cu front
L2 : B.Cu back
Drill file 'many485.drl' contains
plated through holes:
=============================================================
T1 0.400mm 0.0157" (58 holes)
T2 0.600mm 0.0236" (10 holes)
T3 0.600mm 0.0236" (4 holes)
T4 0.700mm 0.0276" (6 holes)
T5 0.800mm 0.0315" (9 holes)
T6 0.800mm 0.0315" (48 holes)
T7 0.920mm 0.0362" (4 holes)
T8 1.000mm 0.0394" (26 holes)
T9 1.300mm 0.0512" (20 holes)
T10 1.500mm 0.0591" (3 holes)
T11 2.330mm 0.0917" (2 holes)
T12 3.200mm 0.1260" (2 holes)
Total plated holes count 192
Not plated through holes are merged with plated holes
unplated through holes:
=============================================================
T13 3.200mm 0.1260" (4 holes)
Total unplated holes count 4

View File

@ -0,0 +1,109 @@
{
"Header": {
"GenerationSoftware": {
"Vendor": "KiCad",
"Application": "Pcbnew",
"Version": "9.0.0"
},
"CreationDate": "2025-03-21T17:04:22+03:00"
},
"GeneralSpecs": {
"ProjectId": {
"Name": "many485",
"GUID": "6d616e79-3438-4352-9e6b-696361645f70",
"Revision": "rev?"
},
"Size": {
"X": 80.05,
"Y": 84.05
},
"LayerNumber": 2,
"BoardThickness": 1.6,
"Finish": "HAL SnPb"
},
"DesignRules": [
{
"Layers": "Outer",
"PadToPad": 0.2,
"PadToTrack": 0.2,
"TrackToTrack": 0.2,
"MinLineWidth": 0.2,
"TrackToRegion": 0.2,
"RegionToRegion": 0.2
}
],
"FilesAttributes": [
{
"Path": "many485-F_Cu.gbr",
"FileFunction": "Copper,L1,Top",
"FilePolarity": "Positive"
},
{
"Path": "many485-B_Cu.gbr",
"FileFunction": "Copper,L2,Bot",
"FilePolarity": "Positive"
},
{
"Path": "many485-F_Silkscreen.gbr",
"FileFunction": "Legend,Top",
"FilePolarity": "Positive"
},
{
"Path": "many485-B_Silkscreen.gbr",
"FileFunction": "Legend,Bot",
"FilePolarity": "Positive"
},
{
"Path": "many485-F_Mask.gbr",
"FileFunction": "SolderMask,Top",
"FilePolarity": "Negative"
},
{
"Path": "many485-B_Mask.gbr",
"FileFunction": "SolderMask,Bot",
"FilePolarity": "Negative"
},
{
"Path": "many485-Edge_Cuts.gbr",
"FileFunction": "Profile",
"FilePolarity": "Positive"
}
],
"MaterialStackup": [
{
"Type": "Legend",
"Name": "Top Silk Screen"
},
{
"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": "Legend",
"Name": "Bottom Silk Screen"
}
]
}

View File

@ -0,0 +1,247 @@
M48
; DRILL file {KiCad 9.0.0} date 2025-03-21T17:04:17+0300
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2025-03-21T17:04:17+03:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,9.0.0
; #@! TF.FileFunction,MixedPlating,1,2
FMAT,2
METRIC
; #@! TA.AperFunction,Plated,PTH,ViaDrill
T1C0.400
; #@! TA.AperFunction,Plated,PTH,ViaDrill
T2C0.600
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T3C0.600
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T4C0.700
; #@! TA.AperFunction,Plated,PTH,ViaDrill
T5C0.800
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T6C0.800
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T7C0.920
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T8C1.000
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T9C1.300
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T10C1.500
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T11C2.330
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T12C3.200
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T13C3.200
%
G90
G05
T1
X74.27Y-79.502
X81.543Y-69.313
X84.277Y-64.701
X84.379Y-73.863
X91.948Y-74.422
X95.148Y-71.882
X96.418Y-70.46
X98.146Y-88.849
X98.146Y-93.116
X101.905Y-75.082
X102.819Y-82.245
X103.2Y-86.639
X104.018Y-74.595
X104.612Y-91.364
X104.648Y-90.17
X104.8Y-92.354
X105.258Y-79.299
X106.926Y-91.364
X107.682Y-73.106
X109.372Y-91.364
X110.425Y-74.473
X111.055Y-80.105
X111.658Y-76.86
X114.148Y-85.141
X114.808Y-78.791
X115.113Y-95.763
X116.388Y-56.236
X116.388Y-59.08
X116.586Y-77.064
X116.637Y-90.881
X117.023Y-80.924
X117.196Y-95.758
X117.483Y-89.811
X118.217Y-54.356
X118.487Y-43.942
X119.786Y-73.2
X122.479Y-83.82
X123.835Y-73.2
X126.294Y-55.372
X127.711Y-83.312
X127.716Y-56.54
X130.307Y-56.744
X130.917Y-49.225
X131.09Y-51.881
X131.775Y-92.1
X131.78Y-45.822
X133.355Y-50.241
X133.355Y-52.07
X133.355Y-54.712
X133.761Y-47.498
X133.775Y-43.942
X136.906Y-83.769
X136.906Y-88.697
X137.622Y-59.08
X137.978Y-45.822
X137.978Y-48.463
X140.056Y-80.874
X147.574Y-96.063
T2
X85.37Y-54.995
X95.479Y-55.01
X96.629Y-72.187
X99.771Y-77.927
X111.305Y-90.881
X111.506Y-73.05
X121.564Y-82.699
X131.775Y-97.5
X144.17Y-97.333
X145.339Y-52.375
T3
X82.289Y-97.079
X82.289Y-99.619
X82.289Y-104.699
X82.289Y-109.779
T4
X147.75Y-97.9
X147.75Y-99.17
X147.75Y-100.44
X147.75Y-101.71
X147.75Y-102.98
X147.75Y-104.25
T5
X90.932Y-94.894
X102.972Y-58.42
X106.985Y-94.92
X125.324Y-64.364
X127.254Y-89.865
X127.254Y-94.894
X138.684Y-78.283
X138.684Y-83.414
X140.056Y-77.318
T6
X80.899Y-46.722
X80.899Y-49.262
X80.899Y-51.802
X80.899Y-54.342
X95.758Y-79.033
X95.758Y-83.913
X101.185Y-38.585
X105.582Y-98.371
X105.582Y-100.911
X105.582Y-103.451
X105.582Y-105.991
X106.629Y-54.356
X106.629Y-56.896
X106.629Y-59.436
X106.639Y-45.568
X106.639Y-48.108
X106.639Y-50.648
X108.805Y-38.585
X114.249Y-54.356
X114.249Y-56.896
X114.249Y-59.436
X114.259Y-45.568
X114.259Y-48.108
X114.259Y-50.648
X122.082Y-98.371
X122.082Y-100.911
X122.082Y-103.451
X122.082Y-105.991
X131.973Y-56.744
X131.973Y-59.284
X131.973Y-61.824
X131.973Y-64.364
X138.582Y-98.371
X138.582Y-100.911
X138.582Y-103.451
X138.582Y-105.991
X139.649Y-54.356
X139.649Y-56.896
X139.649Y-59.436
X139.761Y-45.618
X139.761Y-48.158
X139.761Y-50.698
X147.269Y-54.356
X147.269Y-56.896
X147.269Y-59.436
X147.381Y-45.618
X147.381Y-48.158
X147.381Y-50.698
T7
X142.317Y-80.741
X142.317Y-83.241
X144.317Y-80.741
X144.317Y-83.241
T8
X73.304Y-102.921
X73.304Y-105.461
X73.304Y-108.001
X74.46Y-68.845
X74.46Y-71.615
X74.46Y-74.385
X74.46Y-77.155
X77.3Y-67.46
X77.3Y-70.23
X77.3Y-73.0
X77.3Y-75.77
X77.3Y-78.54
X86.8Y-80.62
X86.8Y-83.16
X86.8Y-85.7
X90.6Y-80.62
X90.6Y-83.16
X90.6Y-85.7
X104.038Y-63.652
X104.038Y-66.192
X104.038Y-68.732
X107.747Y-63.652
X107.747Y-66.192
X107.747Y-68.732
X127.711Y-77.826
X130.251Y-77.826
T9
X86.669Y-38.603
X91.669Y-38.603
X93.679Y-114.374
X96.669Y-38.603
X98.679Y-114.374
X103.679Y-114.374
X110.179Y-114.374
X113.487Y-38.084
X115.179Y-114.374
X118.487Y-38.084
X120.179Y-114.374
X123.487Y-38.084
X126.679Y-114.374
X130.487Y-38.084
X131.679Y-114.374
X135.487Y-38.084
X136.679Y-114.374
X140.487Y-38.084
X144.241Y-65.521
X144.241Y-70.521
T10
X122.631Y-67.767
X128.981Y-67.716
X129.032Y-73.406
T11
X147.027Y-75.971
X147.027Y-88.011
T12
X77.0Y-60.5
X77.0Y-85.5
T13
X74.0Y-37.5
X74.0Y-114.5
X147.0Y-37.5
X147.0Y-114.5
M30

View File

@ -2514,7 +2514,7 @@
)
)
)
(property "Reference" "Q3"
(property "Reference" "Q6"
(at 87.63 32.004 0)
(effects
(font
@ -2572,7 +2572,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/b5d3972e-2956-484f-8514-69dcc9a48328"
(reference "Q3")
(reference "Q6")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/bfb47038-e30b-4456-8a3f-910a2a85c045"
@ -2580,7 +2580,7 @@
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/fffbe808-9aec-4c0c-a1ae-7f856729924e"
(reference "Q4")
(reference "Q7")
(unit 1)
)
)
@ -2679,7 +2679,7 @@
)
)
)
(property "Reference" "J9"
(property "Reference" "J13"
(at 112.522 54.737 0)
(hide yes)
(effects
@ -2736,15 +2736,15 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/b5d3972e-2956-484f-8514-69dcc9a48328"
(reference "J9")
(reference "J13")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/bfb47038-e30b-4456-8a3f-910a2a85c045"
(reference "J11")
(reference "J12")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/fffbe808-9aec-4c0c-a1ae-7f856729924e"
(reference "J10")
(reference "J14")
(unit 1)
)
)
@ -2769,7 +2769,7 @@
)
)
)
(property "Reference" "D4"
(property "Reference" "D11"
(at 106.68 68.9059 0)
(effects
(font
@ -2824,15 +2824,15 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/b5d3972e-2956-484f-8514-69dcc9a48328"
(reference "D4")
(reference "D11")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/bfb47038-e30b-4456-8a3f-910a2a85c045"
(reference "D6")
(reference "D12")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/fffbe808-9aec-4c0c-a1ae-7f856729924e"
(reference "D5")
(reference "D10")
(unit 1)
)
)
@ -2856,7 +2856,7 @@
)
)
)
(property "Reference" "C15"
(property "Reference" "C26"
(at 71.882 42.926 90)
(effects
(font
@ -2908,15 +2908,15 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/b5d3972e-2956-484f-8514-69dcc9a48328"
(reference "C15")
(reference "C26")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/bfb47038-e30b-4456-8a3f-910a2a85c045"
(reference "C19")
(reference "C27")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/fffbe808-9aec-4c0c-a1ae-7f856729924e"
(reference "C17")
(reference "C25")
(unit 1)
)
)
@ -2940,7 +2940,7 @@
)
)
)
(property "Reference" "C16"
(property "Reference" "C31"
(at 92.71 42.672 90)
(effects
(font
@ -2992,15 +2992,15 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/b5d3972e-2956-484f-8514-69dcc9a48328"
(reference "C16")
(reference "C31")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/bfb47038-e30b-4456-8a3f-910a2a85c045"
(reference "C20")
(reference "C32")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/fffbe808-9aec-4c0c-a1ae-7f856729924e"
(reference "C18")
(reference "C30")
(unit 1)
)
)
@ -3316,7 +3316,7 @@
)
)
)
(property "Reference" "F2"
(property "Reference" "F5"
(at 66.04 24.638 90)
(effects
(font
@ -3368,7 +3368,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/b5d3972e-2956-484f-8514-69dcc9a48328"
(reference "F2")
(reference "F5")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/bfb47038-e30b-4456-8a3f-910a2a85c045"
@ -3376,7 +3376,7 @@
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/fffbe808-9aec-4c0c-a1ae-7f856729924e"
(reference "F3")
(reference "F6")
(unit 1)
)
)
@ -3400,7 +3400,7 @@
)
)
)
(property "Reference" "U5"
(property "Reference" "U8"
(at 82.55 81.026 0)
(effects
(font
@ -3494,15 +3494,15 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/b5d3972e-2956-484f-8514-69dcc9a48328"
(reference "U5")
(reference "U8")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/bfb47038-e30b-4456-8a3f-910a2a85c045"
(reference "U7")
(reference "U9")
(unit 1)
)
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/fffbe808-9aec-4c0c-a1ae-7f856729924e"
(reference "U6")
(reference "U7")
(unit 1)
)
)

View File

@ -2993,7 +2993,7 @@
(fill
(type none)
)
(uuid 103a2417-6fff-4cc9-8ab9-5641d2040bb0)
(uuid 2c77174d-460a-4632-bbc3-7422e7ac41dd)
)
)
(rule_area
@ -3008,7 +3008,7 @@
(fill
(type none)
)
(uuid 231f811b-5580-44a1-9ba4-e1d0a99fc714)
(uuid 3a54936f-ef7a-406f-b547-be0014c4e8b4)
)
)
(rule_area
@ -3023,7 +3023,7 @@
(fill
(type none)
)
(uuid 3664e9b1-e927-4361-bee0-c1ef36171826)
(uuid 44a181d1-bbdd-433d-b616-e76f800b36ce)
)
)
(rule_area
@ -3038,7 +3038,7 @@
(fill
(type none)
)
(uuid fa614249-f536-42fa-9f52-dbaf89ecb1fd)
(uuid fb1e507b-fb0c-42be-a78a-e864048b2e44)
)
)
(netclass_flag ""
@ -3241,7 +3241,7 @@
(on_board yes)
(dnp no)
(uuid "05ccee90-29b2-4db3-963c-1b081ed09119")
(property "Reference" "R14"
(property "Reference" "R5"
(at 67.31 74.93 90)
(effects
(font
@ -3293,7 +3293,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "R14")
(reference "R5")
(unit 1)
)
)
@ -3308,7 +3308,7 @@
(on_board yes)
(dnp no)
(uuid "08d254f7-1d7f-4956-b234-7b1e1522ede8")
(property "Reference" "R12"
(property "Reference" "R3"
(at 45.72 71.12 90)
(effects
(font
@ -3360,7 +3360,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "R12")
(reference "R3")
(unit 1)
)
)
@ -3375,7 +3375,7 @@
(on_board yes)
(dnp no)
(uuid "124b9b22-424b-4144-96ae-48b8f118a6e3")
(property "Reference" "D7"
(property "Reference" "D5"
(at 154.94 74.93 0)
(effects
(font
@ -3427,7 +3427,7 @@
(instances
(project ""
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "D7")
(reference "D5")
(unit 1)
)
)
@ -3509,7 +3509,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "17931c8c-112a-427a-bab0-fd270d06a226")
(property "Reference" "C24"
(property "Reference" "C5"
(at 68.961 121.9778 0)
(effects
(font
@ -3563,7 +3563,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C24")
(reference "C5")
(unit 1)
)
)
@ -3578,7 +3578,7 @@
(on_board yes)
(dnp no)
(uuid "28687f10-65c0-46bb-b3f4-a4bf3da4d39c")
(property "Reference" "R11"
(property "Reference" "R4"
(at 44.45 115.57 90)
(effects
(font
@ -3630,7 +3630,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "R11")
(reference "R4")
(unit 1)
)
)
@ -3646,7 +3646,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "3541e9c5-05ce-41bb-98b4-0ce0715e62b6")
(property "Reference" "C26"
(property "Reference" "C4"
(at 129.921 97.8478 0)
(effects
(font
@ -3700,7 +3700,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C26")
(reference "C4")
(unit 1)
)
)
@ -3716,7 +3716,7 @@
(on_board yes)
(dnp no)
(uuid "395292d1-ea6c-41b5-99ba-1fe9404cbc52")
(property "Reference" "U9"
(property "Reference" "U10"
(at 58.9981 84.1545 0)
(effects
(font
@ -3782,7 +3782,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "U9")
(reference "U10")
(unit 1)
)
)
@ -3863,7 +3863,7 @@
(on_board yes)
(dnp no)
(uuid "3d99149f-b9dd-441e-858f-6ca1e3fd7912")
(property "Reference" "R15"
(property "Reference" "R6"
(at 67.31 142.24 90)
(effects
(font
@ -3915,7 +3915,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "R15")
(reference "R6")
(unit 1)
)
)
@ -3931,7 +3931,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "43a5a675-f3b1-4f64-9783-3f2ce6d182ae")
(property "Reference" "C29"
(property "Reference" "C8"
(at 156.591 57.2078 0)
(effects
(font
@ -3985,7 +3985,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C29")
(reference "C8")
(unit 1)
)
)
@ -4067,7 +4067,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "4c6e67a8-028a-4977-9501-4b581cb6c2cc")
(property "Reference" "C22"
(property "Reference" "C10"
(at 48.641 152.4578 0)
(effects
(font
@ -4121,7 +4121,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C22")
(reference "C10")
(unit 1)
)
)
@ -4136,7 +4136,7 @@
(on_board yes)
(dnp no)
(uuid "512c0f2e-c699-4c43-9d7d-057647bb5647")
(property "Reference" "D9"
(property "Reference" "D4"
(at 162.56 74.93 0)
(effects
(font
@ -4188,7 +4188,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "D9")
(reference "D4")
(unit 1)
)
)
@ -4212,7 +4212,7 @@
)
)
)
(property "Reference" "Q6"
(property "Reference" "Q3"
(at 64.77 29.464 0)
(effects
(font
@ -4270,7 +4270,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "Q6")
(reference "Q3")
(unit 1)
)
)
@ -4286,7 +4286,7 @@
(on_board yes)
(dnp no)
(uuid "87356dc0-eafb-4fbb-9ad2-03a82db05108")
(property "Reference" "U11"
(property "Reference" "U13"
(at 58.9981 151.4645 0)
(effects
(font
@ -4352,7 +4352,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "U11")
(reference "U13")
(unit 1)
)
)
@ -4377,7 +4377,7 @@
)
)
)
(property "Reference" "J12"
(property "Reference" "J6"
(at 182.753 64.643 0)
(hide yes)
(effects
@ -4434,7 +4434,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "J12")
(reference "J6")
(unit 1)
)
)
@ -4450,7 +4450,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "8ddef0f4-2582-4f32-88c0-69002e1ca640")
(property "Reference" "U8"
(property "Reference" "U12"
(at 64.8267 42.0134 0)
(effects
(font
@ -4514,7 +4514,7 @@
(instances
(project ""
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "U8")
(reference "U12")
(unit 1)
)
)
@ -4530,7 +4530,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "8f0a0d80-d45a-4273-92c9-73302790568d")
(property "Reference" "C27"
(property "Reference" "C6"
(at 143.891 44.5078 0)
(effects
(font
@ -4584,7 +4584,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C27")
(reference "C6")
(unit 1)
)
)
@ -4609,7 +4609,7 @@
)
)
)
(property "Reference" "J13"
(property "Reference" "J7"
(at 182.753 81.153 0)
(hide yes)
(effects
@ -4666,7 +4666,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "J13")
(reference "J7")
(unit 1)
)
)
@ -4681,7 +4681,7 @@
(on_board yes)
(dnp no)
(uuid "9480e103-83af-4b03-a34a-10f90025c87f")
(property "Reference" "R10"
(property "Reference" "R7"
(at 44.45 48.26 90)
(effects
(font
@ -4733,7 +4733,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "R10")
(reference "R7")
(unit 1)
)
)
@ -4757,7 +4757,7 @@
)
)
)
(property "Reference" "F5"
(property "Reference" "F2"
(at 43.18 22.098 90)
(effects
(font
@ -4809,7 +4809,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "F5")
(reference "F2")
(unit 1)
)
)
@ -4824,7 +4824,7 @@
(on_board yes)
(dnp no)
(uuid "a2705472-077c-4c1f-ab79-d5a02debbeb6")
(property "Reference" "D8"
(property "Reference" "D3"
(at 154.94 91.44 0)
(effects
(font
@ -4876,7 +4876,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "D8")
(reference "D3")
(unit 1)
)
)
@ -4891,7 +4891,7 @@
(on_board yes)
(dnp no)
(uuid "a683a121-e096-4ec0-ad2d-995dad386c8f")
(property "Reference" "C28"
(property "Reference" "C1"
(at 144.78 50.8 90)
(effects
(font
@ -4943,7 +4943,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C28")
(reference "C1")
(unit 1)
)
)
@ -4958,7 +4958,7 @@
(on_board yes)
(dnp no)
(uuid "b0c6de04-4993-44dd-95eb-b4b2d9b73d34")
(property "Reference" "R16"
(property "Reference" "R9"
(at 72.39 44.45 90)
(effects
(font
@ -5010,7 +5010,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "R16")
(reference "R9")
(unit 1)
)
)
@ -5025,7 +5025,7 @@
(on_board yes)
(dnp no)
(uuid "b5607b3e-ae02-4929-9517-b63ee79649df")
(property "Reference" "R17"
(property "Reference" "R2"
(at 72.39 111.76 90)
(effects
(font
@ -5077,7 +5077,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "R17")
(reference "R2")
(unit 1)
)
)
@ -5093,7 +5093,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "b7a23b58-b8b8-476f-91a3-d915c7f7d9bb")
(property "Reference" "C21"
(property "Reference" "C7"
(at 48.641 85.1478 0)
(effects
(font
@ -5147,7 +5147,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C21")
(reference "C7")
(unit 1)
)
)
@ -5162,7 +5162,7 @@
(on_board yes)
(dnp no)
(uuid "b8ce1f7c-49f7-4aa7-912b-37a3e53feb5f")
(property "Reference" "D10"
(property "Reference" "D2"
(at 162.56 91.44 0)
(effects
(font
@ -5214,7 +5214,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "D10")
(reference "D2")
(unit 1)
)
)
@ -5295,7 +5295,7 @@
(on_board yes)
(dnp no)
(uuid "c613aea0-c1ed-4ef2-90e2-5631bffeb3fe")
(property "Reference" "C25"
(property "Reference" "C3"
(at 95.25 43.18 0)
(effects
(font
@ -5349,7 +5349,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C25")
(reference "C3")
(unit 1)
)
)
@ -5432,7 +5432,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "d68d26a5-1443-4897-bdf0-212a13e6781c")
(property "Reference" "C23"
(property "Reference" "C11"
(at 68.961 54.6678 0)
(effects
(font
@ -5486,7 +5486,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "C23")
(reference "C11")
(unit 1)
)
)
@ -5502,7 +5502,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "dcd72609-0b6b-4b9d-9ad1-656dd968d1f3")
(property "Reference" "U10"
(property "Reference" "U11"
(at 64.8267 109.3234 0)
(effects
(font
@ -5566,7 +5566,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "U10")
(reference "U11")
(unit 1)
)
)
@ -5581,7 +5581,7 @@
(on_board yes)
(dnp no)
(uuid "e21333f0-4ec0-4a51-881f-e54a44772181")
(property "Reference" "R13"
(property "Reference" "R8"
(at 45.72 138.43 90)
(effects
(font
@ -5633,7 +5633,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "R13")
(reference "R8")
(unit 1)
)
)
@ -5714,7 +5714,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "f4439364-22c5-4ef1-8ce4-5030b825e632")
(property "Reference" "U12"
(property "Reference" "U2"
(at 122.7933 35.2255 0)
(effects
(font
@ -5811,7 +5811,7 @@
(instances
(project ""
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/8303fa26-68ce-4671-900d-4c072b8eabbd"
(reference "U12")
(reference "U2")
(unit 1)
)
)

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
{
"board": {
"active_layer": 17,
"active_layer_preset": "",
"active_layer": 7,
"active_layer_preset": "All Layers",
"auto_track_width": false,
"hidden_netclasses": [],
"hidden_nets": [],
@ -50,7 +50,7 @@
"conflict_shadows",
"shapes"
],
"visible_layers": "00000000_00000000_0fffffff_ffffffff",
"visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff",
"zone_display_mode": 1
},
"git": {

View File

@ -100,7 +100,7 @@
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_edge_clearance": "ignore",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
@ -124,7 +124,7 @@
"rules": {
"max_error": 0.005,
"min_clearance": 0.2,
"min_connection": 0.3,
"min_connection": 0.2,
"min_copper_edge_clearance": 1.0,
"min_groove_width": 0.0,
"min_hole_clearance": 0.25,
@ -527,7 +527,7 @@
"gencad": "",
"idf": "",
"netlist": "",
"plot": "",
"plot": "gerbers/",
"pos_files": "",
"specctra_dsn": "",
"step": "",

View File

@ -6595,7 +6595,7 @@
)
(text "Isolated RS-485"
(exclude_from_sim no)
(at 210.82 62.23 0)
(at 212.09 59.69 0)
(effects
(font
(size 3 3)
@ -6626,6 +6626,16 @@
)
(uuid "2be62749-a8d4-4077-8133-ee76a242a624")
)
(text "485-3"
(exclude_from_sim no)
(at 236.22 63.5 0)
(effects
(font
(size 1.27 1.27)
)
)
(uuid "32dd2124-a234-47b1-a7b4-d29cce9a3c39")
)
(text "Disable UART5 interface and\nenable config interface"
(exclude_from_sim no)
(at 81.28 76.2 0)
@ -6636,6 +6646,16 @@
)
(uuid "34a72b11-d900-41d0-8a6c-620922c74423")
)
(text "485-2"
(exclude_from_sim no)
(at 207.01 63.5 0)
(effects
(font
(size 1.27 1.27)
)
)
(uuid "4333821f-7185-4926-8281-d8806ee6b3d2")
)
(text "Isolated RS-232 and RS-422/SSI"
(exclude_from_sim no)
(at 193.04 92.71 0)
@ -6658,6 +6678,16 @@
)
(uuid "8aa7ac0c-b562-4205-b305-9e29330a9ea5")
)
(text "485-1"
(exclude_from_sim no)
(at 266.7 63.5 0)
(effects
(font
(size 1.27 1.27)
)
)
(uuid "daae7ead-cccb-4cc5-a99b-d19a0baf55b6")
)
(text "External 5V"
(exclude_from_sim no)
(at 21.59 85.09 0)
@ -8432,7 +8462,7 @@
)
)
)
(property "Reference" "C6"
(property "Reference" "C23"
(at 137.795 21.59 0)
(effects
(font
@ -8485,7 +8515,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C6")
(reference "C23")
(unit 1)
)
)
@ -8509,7 +8539,7 @@
)
)
)
(property "Reference" "D3"
(property "Reference" "D1"
(at 252.73 36.83 0)
(effects
(font
@ -8563,7 +8593,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "D3")
(reference "D1")
(unit 1)
)
)
@ -8587,7 +8617,7 @@
)
)
)
(property "Reference" "R9"
(property "Reference" "R1"
(at 255.905 45.212 90)
(effects
(font
@ -8638,7 +8668,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R9")
(reference "R1")
(unit 1)
)
)
@ -8662,7 +8692,7 @@
)
)
)
(property "Reference" "C7"
(property "Reference" "C17"
(at 142.875 21.59 0)
(effects
(font
@ -8715,7 +8745,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C7")
(reference "C17")
(unit 1)
)
)
@ -8739,7 +8769,7 @@
)
)
)
(property "Reference" "C10"
(property "Reference" "C18"
(at 147.955 21.59 0)
(effects
(font
@ -8792,7 +8822,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C10")
(reference "C18")
(unit 1)
)
)
@ -8816,7 +8846,7 @@
)
)
)
(property "Reference" "C11"
(property "Reference" "C24"
(at 153.035 21.59 0)
(effects
(font
@ -8869,7 +8899,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C11")
(reference "C24")
(unit 1)
)
)
@ -8975,7 +9005,7 @@
)
)
)
(property "Reference" "C2"
(property "Reference" "C16"
(at 48.514 65.278 0)
(effects
(font
@ -9029,7 +9059,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C2")
(reference "C16")
(unit 1)
)
)
@ -9054,7 +9084,7 @@
)
)
)
(property "Reference" "SW3"
(property "Reference" "SW1"
(at 244.475 39.624 0)
(effects
(font
@ -9107,7 +9137,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "SW3")
(reference "SW1")
(unit 1)
)
)
@ -9196,7 +9226,7 @@
)
)
)
(property "Reference" "C1"
(property "Reference" "C13"
(at 30.48 72.39 0)
(effects
(font
@ -9250,7 +9280,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C1")
(reference "C13")
(unit 1)
)
)
@ -9274,7 +9304,7 @@
)
)
)
(property "Reference" "C14"
(property "Reference" "C2"
(at 236.855 25.4 0)
(effects
(font
@ -9327,7 +9357,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C14")
(reference "C2")
(unit 1)
)
)
@ -9351,7 +9381,7 @@
)
)
)
(property "Reference" "C13"
(property "Reference" "C9"
(at 191.643 25.654 0)
(effects
(font
@ -9404,7 +9434,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C13")
(reference "C9")
(unit 1)
)
)
@ -9493,7 +9523,7 @@
)
)
)
(property "Reference" "R7"
(property "Reference" "R10"
(at 112.268 39.751 90)
(effects
(font
@ -9547,7 +9577,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R7")
(reference "R10")
(unit 1)
)
)
@ -9571,7 +9601,7 @@
)
)
)
(property "Reference" "TP3"
(property "Reference" "TP1"
(at 49.784 58.42 0)
(effects
(font
@ -9590,7 +9620,7 @@
(justify left)
)
)
(property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x01_P2.54mm_Vertical"
(property "Footprint" "TestPoint:TestPoint_Loop_D2.54mm_Drill1.5mm_Beaded"
(at 55.88 63.5 0)
(hide yes)
(effects
@ -9623,7 +9653,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "TP3")
(reference "TP1")
(unit 1)
)
)
@ -9912,7 +9942,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "0ede5b00-8443-4886-94e3-845509671979")
(property "Reference" "J1"
(property "Reference" "J9"
(at 21.59 73.2099 0)
(effects
(font
@ -9965,7 +9995,7 @@
(instances
(project ""
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "J1")
(reference "J9")
(unit 1)
)
)
@ -9980,7 +10010,7 @@
(on_board yes)
(dnp no)
(uuid "0fd87c97-8042-4653-abdd-7019b1430685")
(property "Reference" "J2"
(property "Reference" "J11"
(at 28.956 19.05 0)
(effects
(font
@ -10043,7 +10073,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "J2")
(reference "J11")
(unit 1)
)
)
@ -10067,7 +10097,7 @@
)
)
)
(property "Reference" "R8"
(property "Reference" "R11"
(at 152.4 181.61 90)
(effects
(font
@ -10121,7 +10151,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R8")
(reference "R11")
(unit 1)
)
)
@ -10203,7 +10233,7 @@
(on_board yes)
(dnp no)
(uuid "1f78beac-0b93-4bda-91e1-fbc2bd00b13b")
(property "Reference" "JP3"
(property "Reference" "JP1"
(at 208.28 118.11 90)
(effects
(font
@ -10261,7 +10291,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "JP3")
(reference "JP1")
(unit 1)
)
)
@ -10277,7 +10307,7 @@
(on_board yes)
(dnp no)
(uuid "2483f366-1b07-4cf4-8072-10d8dd70842e")
(property "Reference" "JP4"
(property "Reference" "JP5"
(at 250.19 96.52 0)
(effects
(font
@ -10333,7 +10363,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "JP4")
(reference "JP5")
(unit 1)
)
)
@ -10572,7 +10602,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "2ae238d6-ef21-4cc8-b5d5-469a8d1f1f24")
(property "Reference" "J7"
(property "Reference" "J5"
(at 249.555 224.3793 0)
(effects
(font
@ -10621,7 +10651,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "J7")
(reference "J5")
(unit 1)
)
)
@ -11030,7 +11060,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "40c960cb-c328-44d2-994e-f02f460cb027")
(property "Reference" "JP5"
(property "Reference" "JP4"
(at 250.19 114.8523 0)
(effects
(font
@ -11086,7 +11116,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "JP5")
(reference "JP4")
(unit 1)
)
)
@ -11102,7 +11132,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "4bd6b342-57bc-4bc2-b68f-c1bdf6da5483")
(property "Reference" "J5"
(property "Reference" "J1"
(at 241.935 224.3793 0)
(effects
(font
@ -11151,7 +11181,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "J5")
(reference "J1")
(unit 1)
)
)
@ -11232,7 +11262,7 @@
(on_board yes)
(dnp no)
(uuid "5a0fe310-84a9-4940-b321-708bd8fce0ae")
(property "Reference" "R3"
(property "Reference" "R12"
(at 66.04 27.94 90)
(effects
(font
@ -11284,7 +11314,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R3")
(reference "R12")
(unit 1)
)
)
@ -11309,7 +11339,7 @@
)
)
)
(property "Reference" "SW1"
(property "Reference" "SW4"
(at 125.095 174.3512 0)
(effects
(font
@ -11362,7 +11392,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "SW1")
(reference "SW4")
(unit 1)
)
)
@ -11386,7 +11416,7 @@
)
)
)
(property "Reference" "C9"
(property "Reference" "C22"
(at 141.605 183.896 90)
(effects
(font
@ -11439,7 +11469,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C9")
(reference "C22")
(unit 1)
)
)
@ -11454,7 +11484,7 @@
(on_board yes)
(dnp no)
(uuid "66d1bb86-db65-44a6-9fc0-e211f9c84fad")
(property "Reference" "U3"
(property "Reference" "U6"
(at 138.43 59.69 0)
(effects
(font
@ -11715,7 +11745,7 @@
(instances
(project ""
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "U3")
(reference "U6")
(unit 1)
)
)
@ -11739,7 +11769,7 @@
)
)
)
(property "Reference" "C5"
(property "Reference" "C19"
(at 130.81 148.59 0)
(effects
(font
@ -11793,7 +11823,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C5")
(reference "C19")
(unit 1)
)
)
@ -11950,7 +11980,7 @@
(on_board yes)
(dnp no)
(uuid "7a69a491-81a3-448f-9f20-eef4429a67c7")
(property "Reference" "R1"
(property "Reference" "R13"
(at 40.64 28.448 90)
(effects
(font
@ -12002,7 +12032,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R1")
(reference "R13")
(unit 1)
)
)
@ -12026,7 +12056,7 @@
)
)
)
(property "Reference" "TP2"
(property "Reference" "TP3"
(at 49.2306 76.2 0)
(effects
(font
@ -12045,7 +12075,7 @@
(justify left)
)
)
(property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x01_P2.54mm_Vertical"
(property "Footprint" "TestPoint:TestPoint_Loop_D2.54mm_Drill1.5mm_Beaded"
(at 43.1346 71.12 0)
(hide yes)
(effects
@ -12078,7 +12108,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "TP2")
(reference "TP3")
(unit 1)
)
)
@ -12102,7 +12132,7 @@
)
)
)
(property "Reference" "R6"
(property "Reference" "R18"
(at 112.268 34.671 90)
(effects
(font
@ -12156,7 +12186,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R6")
(reference "R18")
(unit 1)
)
)
@ -12171,7 +12201,7 @@
(on_board yes)
(dnp no)
(uuid "7cef338f-63e5-4ea6-affb-92de077df231")
(property "Reference" "R2"
(property "Reference" "R15"
(at 41.021 35.052 90)
(effects
(font
@ -12223,7 +12253,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R2")
(reference "R15")
(unit 1)
)
)
@ -12304,7 +12334,7 @@
(on_board yes)
(dnp no)
(uuid "906d6d88-74f6-46a5-9e3d-c80a83d789f2")
(property "Reference" "R5"
(property "Reference" "R16"
(at 85.852 41.91 0)
(effects
(font
@ -12356,7 +12386,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R5")
(reference "R16")
(unit 1)
)
)
@ -12380,7 +12410,7 @@
)
)
)
(property "Reference" "U1"
(property "Reference" "U4"
(at 40.64 59.69 0)
(effects
(font
@ -12435,7 +12465,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "U1")
(reference "U4")
(unit 1)
)
)
@ -12524,7 +12554,7 @@
)
)
)
(property "Reference" "C3"
(property "Reference" "C12"
(at 56.134 65.278 0)
(effects
(font
@ -12578,7 +12608,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C3")
(reference "C12")
(unit 1)
)
)
@ -12667,7 +12697,7 @@
(on_board yes)
(dnp no)
(uuid "9be66433-ec9c-4b28-8df4-3bb35a6d51dd")
(property "Reference" "R4"
(property "Reference" "R17"
(at 78.74 35.814 90)
(effects
(font
@ -12719,7 +12749,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "R4")
(reference "R17")
(unit 1)
)
)
@ -12735,7 +12765,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "a5d87aeb-fe76-4d5d-b3bf-ae96ec06b8f4")
(property "Reference" "JP1"
(property "Reference" "JP3"
(at 99.06 74.0989 0)
(effects
(font
@ -12788,7 +12818,7 @@
(instances
(project ""
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "JP1")
(reference "JP3")
(unit 1)
)
)
@ -12883,7 +12913,7 @@
)
)
)
(property "Reference" "TP1"
(property "Reference" "TP2"
(at 21.59 64.516 0)
(effects
(font
@ -12902,7 +12932,7 @@
(justify left)
)
)
(property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x01_P2.54mm_Vertical"
(property "Footprint" "TestPoint:TestPoint_Loop_D2.54mm_Drill1.5mm_Beaded"
(at 26.67 58.42 0)
(hide yes)
(effects
@ -12935,7 +12965,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "TP1")
(reference "TP2")
(unit 1)
)
)
@ -12959,7 +12989,7 @@
)
)
)
(property "Reference" "C12"
(property "Reference" "C21"
(at 158.115 21.59 0)
(effects
(font
@ -13012,7 +13042,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C12")
(reference "C21")
(unit 1)
)
)
@ -13174,7 +13204,7 @@
(on_board yes)
(dnp no)
(uuid "c2bd4f9a-6318-41f3-aa2a-31ce0cad8986")
(property "Reference" "D1"
(property "Reference" "D9"
(at 28.702 56.2553 90)
(effects
(font
@ -13228,7 +13258,7 @@
(instances
(project ""
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "D1")
(reference "D9")
(unit 1)
)
)
@ -13385,7 +13415,7 @@
)
)
)
(property "Reference" "U4"
(property "Reference" "U1"
(at 217.17 17.8902 0)
(effects
(font
@ -13456,7 +13486,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "U4")
(reference "U1")
(unit 1)
)
)
@ -13668,7 +13698,7 @@
(on_board yes)
(dnp no)
(uuid "d63a81b2-2248-494f-bb1e-a367d05b0665")
(property "Reference" "U2"
(property "Reference" "U5"
(at 52.07 26.67 0)
(effects
(font
@ -13732,7 +13762,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "U2")
(reference "U5")
(unit 1)
)
)
@ -13756,7 +13786,7 @@
)
)
)
(property "Reference" "C8"
(property "Reference" "C20"
(at 144.145 148.59 0)
(effects
(font
@ -13810,7 +13840,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "C8")
(reference "C20")
(unit 1)
)
)
@ -13956,7 +13986,7 @@
(on_board yes)
(dnp no)
(uuid "f4d92f56-b789-4ad9-96ac-95d41744d0b3")
(property "Reference" "D2"
(property "Reference" "D7"
(at 21.59 69.85 90)
(effects
(font
@ -14010,7 +14040,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "D2")
(reference "D7")
(unit 1)
)
)
@ -14026,7 +14056,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "f86ffd48-3091-4721-9345-76510f987d43")
(property "Reference" "J6"
(property "Reference" "J4"
(at 249.555 218.0293 0)
(effects
(font
@ -14075,7 +14105,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "J6")
(reference "J4")
(unit 1)
)
)
@ -14100,7 +14130,7 @@
)
)
)
(property "Reference" "SW2"
(property "Reference" "SW3"
(at 143.51 174.9862 0)
(effects
(font
@ -14153,7 +14183,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "SW2")
(reference "SW3")
(unit 1)
)
)
@ -14169,7 +14199,7 @@
(dnp no)
(fields_autoplaced yes)
(uuid "fb0c4df2-11af-4b87-9621-5a94e896a9a2")
(property "Reference" "J4"
(property "Reference" "J2"
(at 241.935 218.0293 0)
(effects
(font
@ -14218,7 +14248,7 @@
(instances
(project ""
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91"
(reference "J4")
(reference "J2")
(unit 1)
)
)

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

View File

@ -2924,7 +2924,7 @@
)
)
)
(property "Reference" "C30"
(property "Reference" "C28"
(at 101.6 63.754 90)
(effects
(font
@ -2976,7 +2976,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "C30")
(reference "C28")
(unit 1)
)
)
@ -3000,7 +3000,7 @@
)
)
)
(property "Reference" "U13"
(property "Reference" "U3"
(at 117.094 56.896 0)
(effects
(font
@ -3096,7 +3096,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "U13")
(reference "U3")
(unit 1)
)
)
@ -3120,7 +3120,7 @@
)
)
)
(property "Reference" "R18"
(property "Reference" "R14"
(at 142.748 52.324 90)
(effects
(font
@ -3174,7 +3174,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "R18")
(reference "R14")
(unit 1)
)
)
@ -3328,7 +3328,7 @@
)
)
)
(property "Reference" "C33"
(property "Reference" "C14"
(at 194.31 48.26 0)
(effects
(font
@ -3382,7 +3382,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "C33")
(reference "C14")
(unit 1)
)
)
@ -3407,7 +3407,7 @@
)
)
)
(property "Reference" "D12"
(property "Reference" "D6"
(at 148.59 75.8909 0)
(effects
(font
@ -3462,7 +3462,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "D12")
(reference "D6")
(unit 1)
)
)
@ -3557,7 +3557,7 @@
)
)
)
(property "Reference" "C32"
(property "Reference" "C15"
(at 173.736 48.006 0)
(effects
(font
@ -3611,7 +3611,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "C32")
(reference "C15")
(unit 1)
)
)
@ -3635,7 +3635,7 @@
)
)
)
(property "Reference" "F6"
(property "Reference" "F3"
(at 168.91 53.848 90)
(effects
(font
@ -3687,7 +3687,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "F6")
(reference "F3")
(unit 1)
)
)
@ -3777,7 +3777,7 @@
)
)
)
(property "Reference" "C31"
(property "Reference" "C29"
(at 130.81 96.52 0)
(effects
(font
@ -3829,7 +3829,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "C31")
(reference "C29")
(unit 1)
)
)
@ -3988,7 +3988,7 @@
)
)
)
(property "Reference" "Q7"
(property "Reference" "Q4"
(at 182.88 40.4325 0)
(effects
(font
@ -4046,7 +4046,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "Q7")
(reference "Q4")
(unit 1)
)
)
@ -4071,7 +4071,7 @@
)
)
)
(property "Reference" "D11"
(property "Reference" "D8"
(at 148.59 61.9209 0)
(effects
(font
@ -4126,7 +4126,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "D11")
(reference "D8")
(unit 1)
)
)
@ -4151,7 +4151,7 @@
)
)
)
(property "Reference" "SW4"
(property "Reference" "SW2"
(at 139.7 54.3362 0)
(effects
(font
@ -4204,7 +4204,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "SW4")
(reference "SW2")
(unit 1)
)
)
@ -4229,7 +4229,7 @@
)
)
)
(property "Reference" "J14"
(property "Reference" "J10"
(at 196.85 67.31 0)
(effects
(font
@ -4237,7 +4237,7 @@
)
)
)
(property "Value" "SSI{slash}422"
(property "Value" "SSI/422"
(at 191.516 94.869 0)
(effects
(font
@ -4305,7 +4305,7 @@
(instances
(project "many485"
(path "/8d999898-5824-4200-a5bb-e5cd72e34b91/80264a45-619f-4fbb-976c-6c15dcb432b8"
(reference "J14")
(reference "J10")
(unit 1)
)
)