commit
5f30b13087
@ -0,0 +1,3 @@ |
|||||||
|
*.map |
||||||
|
.sass-cache |
||||||
|
.idea/ |
@ -0,0 +1,6 @@ |
|||||||
|
<footer> |
||||||
|
<div> |
||||||
|
GEX is a project by Ondřej Hruška (MightyPork) |
||||||
|
</div> |
||||||
|
</footer> |
||||||
|
</body></html> |
@ -0,0 +1,39 @@ |
|||||||
|
<?php |
||||||
|
$cli = defined('STDIN'); |
||||||
|
$suf = $cli ? '.html' : '.php'; |
||||||
|
list($curpage, ) = explode('.', basename($curpage)); |
||||||
|
$pages = [ |
||||||
|
"index" => 'What is GEX', |
||||||
|
"features" => 'Features', |
||||||
|
"platforms" => 'Platforms', |
||||||
|
"downloads" => 'Downloads', |
||||||
|
"contact" => 'Get Involved', |
||||||
|
]; |
||||||
|
?><!DOCTYPE html> |
||||||
|
<html> |
||||||
|
<head lang="en"> |
||||||
|
<meta charset="UTF-8"> |
||||||
|
<title>GEX - <?= $pages[$curpage] ?></title>
|
||||||
|
<link rel="stylesheet" href="css/application.css"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
|
||||||
|
<header id="PageHeader"> |
||||||
|
<div> |
||||||
|
<span id="top"></span> |
||||||
|
<span class="Title">GEX</span><br> |
||||||
|
<span class="Subtitle">...the GPIO header for your PC</span> |
||||||
|
</div> |
||||||
|
</header> |
||||||
|
|
||||||
|
<section> |
||||||
|
<nav> |
||||||
|
<?php |
||||||
|
foreach ($pages as $page => $label) { |
||||||
|
echo "<a href=\"$page$suf\""; |
||||||
|
if ($curpage == $page) echo ' class="active"'; |
||||||
|
echo ">$label</a>"; |
||||||
|
} |
||||||
|
?> |
||||||
|
</nav> |
||||||
|
</section> |
@ -0,0 +1,24 @@ |
|||||||
|
<?php $curpage = basename(__FILE__); require '_header.php'; ?> |
||||||
|
|
||||||
|
<section> |
||||||
|
<div> |
||||||
|
<h1>How to Contribute</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
GEX is open-source, and I want it to grow beyond the current one-man-show. |
||||||
|
A <a href="https://github.com/gexpander/">GitHub mirror</a> of most of the GEX |
||||||
|
repositories is available and regularly updated to match the upstream. |
||||||
|
Feel free to send pull requests or issues to these repos. |
||||||
|
</p> |
||||||
|
|
||||||
|
<h1>Contact</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
You can reach me by e-mail at <a href="mailto:ondra@ondrovo.com">ondra@ondrovo.com</a>, |
||||||
|
or send me a message on Mastodon (GNU Social compatible): <a>@MightyPork@dev.glitch.social</a> |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<?php require '_footer.php'; ?> |
||||||
|
|
@ -0,0 +1,13 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
php contact.php > public/contact.html |
||||||
|
php downloads.php > public/downloads.html |
||||||
|
php features.php > public/features.html |
||||||
|
php index.php > public/index.html |
||||||
|
php platforms.php > public/platforms.html |
||||||
|
|
||||||
|
cp -r img public/ |
||||||
|
cp -r css public/ |
||||||
|
cp -r js public/ |
||||||
|
|
||||||
|
echo "Done." |
@ -0,0 +1,93 @@ |
|||||||
|
html, body { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; |
||||||
|
color: #333; |
||||||
|
font-size: 16pt; |
||||||
|
margin: 0; |
||||||
|
padding: 0; } |
||||||
|
|
||||||
|
body { |
||||||
|
overflow-y: scroll; } |
||||||
|
|
||||||
|
*, *::before, *::after { |
||||||
|
box-sizing: border-box; } |
||||||
|
|
||||||
|
a { |
||||||
|
color: #005e5e; |
||||||
|
text-decoration: none; } |
||||||
|
a:hover { |
||||||
|
color: #001d5e; |
||||||
|
text-decoration: none; } |
||||||
|
|
||||||
|
section, header, footer { |
||||||
|
width: 100%; } |
||||||
|
section > *, header > *, footer > * { |
||||||
|
max-width: 850px; |
||||||
|
margin: 0 auto; |
||||||
|
padding: 10pt 0; } |
||||||
|
|
||||||
|
section, header { |
||||||
|
border-bottom: 4px solid darkcyan; } |
||||||
|
section h1:first-child, header h1:first-child { |
||||||
|
margin-top: .4em; } |
||||||
|
|
||||||
|
section + section { |
||||||
|
border-bottom: none; } |
||||||
|
section + section > * { |
||||||
|
border-bottom: 2px dashed rgba(0, 139, 139, 0.5); } |
||||||
|
|
||||||
|
section:last-of-type { |
||||||
|
border-bottom: 4px solid darkcyan; } |
||||||
|
section:last-of-type > * { |
||||||
|
border-bottom: 0 none; } |
||||||
|
|
||||||
|
header .Title { |
||||||
|
font-size: 40pt; |
||||||
|
font-weight: bold; |
||||||
|
letter-spacing: 2pt; } |
||||||
|
header .Subtitle { |
||||||
|
font-size: 24pt; } |
||||||
|
|
||||||
|
nav a { |
||||||
|
padding-right: 10pt; |
||||||
|
padding-left: 10pt; |
||||||
|
border-right: 2px solid darkcyan; } |
||||||
|
nav a:first-child { |
||||||
|
padding-left: 0; } |
||||||
|
nav a:last-child { |
||||||
|
border-right: 0 none; } |
||||||
|
nav a.active { |
||||||
|
font-weight: bold; } |
||||||
|
|
||||||
|
h1 a { |
||||||
|
opacity: .3; |
||||||
|
margin-left: 6pt; } |
||||||
|
h1 a:hover { |
||||||
|
opacity: .6; } |
||||||
|
|
||||||
|
p { |
||||||
|
text-align: justify; } |
||||||
|
|
||||||
|
h2 { |
||||||
|
font-size: 110%; } |
||||||
|
|
||||||
|
footer { |
||||||
|
text-align: left; |
||||||
|
font-size: 12pt; |
||||||
|
color: #066; |
||||||
|
opacity: .5; |
||||||
|
font-style: italic; } |
||||||
|
|
||||||
|
section img { |
||||||
|
max-width: 100%; } |
||||||
|
|
||||||
|
div.center { |
||||||
|
text-align: center; } |
||||||
|
|
||||||
|
div.aside { |
||||||
|
float: right; |
||||||
|
margin-left: 16pt; |
||||||
|
margin-bottom: 16pt; } |
||||||
|
|
||||||
|
/*# sourceMappingURL=application.css.map */ |
@ -0,0 +1,132 @@ |
|||||||
|
$fg: #333; |
||||||
|
$bg: #fff; |
||||||
|
|
||||||
|
html, body { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; |
||||||
|
color: $fg; |
||||||
|
font-size: 16pt; |
||||||
|
margin: 0; padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
body { |
||||||
|
overflow-y: scroll; |
||||||
|
} |
||||||
|
|
||||||
|
*, *::before, *::after { |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
|
||||||
|
a { |
||||||
|
color: #005e5e; |
||||||
|
text-decoration: none; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
color: #001d5e; |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
section, header, footer { |
||||||
|
width: 100%; |
||||||
|
> * { |
||||||
|
max-width: 850px; |
||||||
|
margin: 0 auto; |
||||||
|
padding: 10pt 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
section, header { |
||||||
|
border-bottom: 4px solid darkcyan; |
||||||
|
|
||||||
|
h1:first-child { |
||||||
|
margin-top: .4em; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
section + section { |
||||||
|
border-bottom: none; |
||||||
|
|
||||||
|
> * { |
||||||
|
border-bottom: 2px dashed rgba(darkcyan, .5) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
section:last-of-type { |
||||||
|
border-bottom: 4px solid darkcyan; |
||||||
|
|
||||||
|
> * { |
||||||
|
border-bottom: 0 none; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
header { |
||||||
|
.Title { |
||||||
|
font-size: 40pt; |
||||||
|
font-weight: bold; |
||||||
|
letter-spacing: 2pt; |
||||||
|
} |
||||||
|
|
||||||
|
.Subtitle { |
||||||
|
font-size: 24pt; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
nav a { |
||||||
|
padding-right: 10pt; |
||||||
|
padding-left: 10pt; |
||||||
|
|
||||||
|
border-right: 2px solid darkcyan; |
||||||
|
|
||||||
|
&:first-child { |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
&:last-child { |
||||||
|
border-right: 0 none; |
||||||
|
} |
||||||
|
|
||||||
|
&.active { |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
h1 a { |
||||||
|
opacity: .3; |
||||||
|
margin-left: 6pt; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
opacity: .6; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
p { |
||||||
|
text-align: justify; |
||||||
|
} |
||||||
|
|
||||||
|
h2 { |
||||||
|
font-size: 110%; |
||||||
|
} |
||||||
|
|
||||||
|
footer { |
||||||
|
text-align: left; |
||||||
|
font-size: 12pt; |
||||||
|
color: #066; |
||||||
|
opacity: .5; |
||||||
|
font-style: italic; |
||||||
|
} |
||||||
|
|
||||||
|
section img { |
||||||
|
max-width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
div.center { |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
div.aside { |
||||||
|
float: right; |
||||||
|
margin-left: 16pt; |
||||||
|
margin-bottom: 16pt; |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
<?php $curpage = basename(__FILE__); require '_header.php'; ?> |
||||||
|
|
||||||
|
<section> |
||||||
|
<div> |
||||||
|
<h1>Thesis</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
I've developed the hardware prototypes and the original firmware (1.0) for my Master's Thesis. |
||||||
|
The thesis text may be used as a manual for this firmware version. |
||||||
|
</p> |
||||||
|
|
||||||
|
<p> |
||||||
|
<a href="https://www.ondrovo.com/cvut/dp">Thesis PDF + attachments</a> |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section> |
||||||
|
<div> |
||||||
|
<h1>Firmware</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
Pre-compiled firmware images are stored in the |
||||||
|
<a href="https://git.ondrovo.com/gex/gex-binaries">GEX binaries repository</a>. |
||||||
|
</p> |
||||||
|
|
||||||
|
<h2>Source Code</h2> |
||||||
|
|
||||||
|
<p> |
||||||
|
GEX is open-source, all its repositories can be found at <a href="https://git.ondrovo.com/gex">git.ondrovo.com/gex</a>. |
||||||
|
Important firmware repositories: |
||||||
|
</p> |
||||||
|
|
||||||
|
<ul> |
||||||
|
<li><a href="https://git.ondrovo.com/gex/gex-f072">STM32F072</a> |
||||||
|
<li><a href="https://git.ondrovo.com/gex/gex-core">GEX Core</a> (included in ports as a submodule) |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section> |
||||||
|
<div> |
||||||
|
<h1>PC Libraries</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
The protocol is described in the GEX Thesis, which should be enough to port it to any language. |
||||||
|
Two libraries were developed as a proof of concept: |
||||||
|
</p> |
||||||
|
|
||||||
|
<ul> |
||||||
|
<li><a href="https://git.ondrovo.com/gex/gex-client-py">Python Library</a> (recommended) |
||||||
|
<li><a href="https://git.ondrovo.com/gex/gex-client-c">C Library</a> |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section> |
||||||
|
<div> |
||||||
|
<h1>Custom Hardware</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
The <a href="https://git.ondrovo.com/gex/gex-hardware">GEX hardware</a> is open source, too. |
||||||
|
The PCBs are drawn in Altium, but the respository includes gerber files and PDFs to make it more accessible. |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<?php require '_footer.php'; ?> |
||||||
|
|
@ -0,0 +1,58 @@ |
|||||||
|
<?php $curpage = basename(__FILE__); require '_header.php'; ?> |
||||||
|
|
||||||
|
<section> |
||||||
|
<div> |
||||||
|
<h1>Features</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
The project started as a STM32 alternative to BusPirate, offering access to the many |
||||||
|
hardware peripherals of STM32 microcontrollers. The firmware is modular, composed of |
||||||
|
functional blocks (“units”) that may be activated and configured by the user through |
||||||
|
INI configuration files. Those files are stored inside the module and edited |
||||||
|
programmatically, or with a text editor on a virtual FAT16 USB disk. |
||||||
|
</p> |
||||||
|
|
||||||
|
<p> |
||||||
|
GEX is used as a GPIO header for the PC, except besides GPIO it also supports a range |
||||||
|
of hardware buses, and several analog features. The device is configured for a particular |
||||||
|
hardware setup, but the control script runs on the host PC. This lets you build graphical |
||||||
|
applications above the low level control code with PyQt or other toolkits, process |
||||||
|
data with NumPy or SciPy, and more. When needed, the Python library may be called from |
||||||
|
within MATLAB, too. |
||||||
|
</p> |
||||||
|
|
||||||
|
<h2>Connection</h2> |
||||||
|
|
||||||
|
<p> |
||||||
|
GEX can be connected through USB (CDC/ACM - virtual COM port), by a hardware UART, or |
||||||
|
wirelessly, using a nRF24L01+ transceiver module. |
||||||
|
</p> |
||||||
|
|
||||||
|
<h2>Hardware Functions</h2> |
||||||
|
|
||||||
|
<p> |
||||||
|
The firmware version 1.0 for STM32F072 contains the following key features: |
||||||
|
</p> |
||||||
|
|
||||||
|
<ul> |
||||||
|
<li>Direct GPIO pin access |
||||||
|
<li>SPI master |
||||||
|
<li>I²C master |
||||||
|
<li>UART/USART |
||||||
|
<li>1-Wire master (including the search algorithm) |
||||||
|
<li>PWM output |
||||||
|
<li>Frequency and duty cycle measurement |
||||||
|
<li>ADC with oscilloscope-like features |
||||||
|
<li>DAC (analog output) with waveform generation based on DDS |
||||||
|
</ul> |
||||||
|
|
||||||
|
<p> |
||||||
|
Some features (specifically the analog ones) are experimental and exhibit various |
||||||
|
limitations. These will be addressed in a later firmware version, possibly as a full |
||||||
|
rewrite. |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<?php require '_footer.php'; ?> |
||||||
|
|
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 162 KiB |
After Width: | Height: | Size: 157 KiB |
@ -0,0 +1,33 @@ |
|||||||
|
<?php $curpage = basename(__FILE__); require '_header.php'; ?> |
||||||
|
|
||||||
|
<section> |
||||||
|
<div> |
||||||
|
<h1>What is GEX</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
GEX is a general purpose input/output device that attaches to a PC or laptop. |
||||||
|
The module, controlled by a Python or C program running on the host PC, provides easy |
||||||
|
access to on-chip peripherals and low level functions implemented by the firmware. |
||||||
|
</p> |
||||||
|
|
||||||
|
<p> |
||||||
|
The platform is designed for quick hardware prototyping, tinkering, automation, and measurements. |
||||||
|
In addition to custom hardware, the firmware can run on STM32 development boards, |
||||||
|
which makes it accessible to everyone. Even better, a version for the eBay-popular |
||||||
|
STM32F103 Bluepill board is planned. |
||||||
|
</p> |
||||||
|
|
||||||
|
<div class="center"> |
||||||
|
<img src="img/zero.jpg" alt="GEX Zero v1"> |
||||||
|
</div> |
||||||
|
|
||||||
|
<p> |
||||||
|
You can try GEX right now, perhaps with one of the pre-built firmware images, but keep in mind |
||||||
|
that it is still under development and despite having version 1.0.0, it is closer to |
||||||
|
beta than a stable release. In particular, the API may change in backward-incompatible ways |
||||||
|
(obviously accompanied by a minor version bump). |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<?php require '_footer.php'; ?> |
@ -0,0 +1,29 @@ |
|||||||
|
function headingAnchors(self_link_text) { |
||||||
|
self_link_text = self_link_text || '#'; |
||||||
|
var headings = document.querySelectorAll('h1'); |
||||||
|
|
||||||
|
for (var i = 0; i < headings.length; i++) { |
||||||
|
var e = headings[i]; |
||||||
|
if (!e.id) { |
||||||
|
var tc = e.textContent; |
||||||
|
tc = tc.replace(/[^a-z0-9-]/gi, '-') |
||||||
|
.replace(/-{2,}/gi, '-') |
||||||
|
.replace(/-+$/gi, '') |
||||||
|
.toLowerCase(); |
||||||
|
|
||||||
|
e.id = tc; |
||||||
|
} |
||||||
|
|
||||||
|
var a = document.createElement('a'); |
||||||
|
a.href = '#' + e.id; |
||||||
|
a.target = "_self"; |
||||||
|
a.textContent = self_link_text; |
||||||
|
|
||||||
|
e.appendChild(a); |
||||||
|
} |
||||||
|
|
||||||
|
// Scroll to the given hash
|
||||||
|
var h = location.hash; |
||||||
|
location.hash = ''; |
||||||
|
location.hash = h; |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
<?php $curpage = basename(__FILE__); require '_header.php'; ?> |
||||||
|
|
||||||
|
<section> |
||||||
|
<div> |
||||||
|
<h1>Supported Platforms</h1> |
||||||
|
|
||||||
|
<p> |
||||||
|
The original GEX firmware targets the STM32F072 microcontroller, which is used in the |
||||||
|
two custom hardware modules; you can see some of these in the photo below. In the future |
||||||
|
I hope to port it to STM32F103, and later to STM32F303 or others. A reimplementation |
||||||
|
for the ESP32 is also an exciting possibility, though it would be even more challenging. |
||||||
|
</p> |
||||||
|
|
||||||
|
<p> |
||||||
|
The PC libraries were written and tested on Linux. The Python library should be portable |
||||||
|
to other systems, as it uses PySerial and PyUSB, but I didn't try it. |
||||||
|
</p> |
||||||
|
|
||||||
|
<div class="center"> |
||||||
|
<img src="img/gexen.jpg" alt="Photo fo several GEX prototypes"> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<?php require '_footer.php'; ?> |
||||||
|
|
@ -0,0 +1,2 @@ |
|||||||
|
* |
||||||
|
!.gitignore |
Loading…
Reference in new issue