reworking pins, flash doesnt work
This commit is contained in:
@@ -24,15 +24,15 @@ void LockJumper_Init(void)
|
||||
bool suc = true;
|
||||
|
||||
// Resolve and claim resource
|
||||
Resource rsc = plat_pin2resource(LOCK_JUMPER_PORT, LOCK_JUMPER_PIN, &suc);
|
||||
Resource rsc = pin2resource(LOCK_JUMPER_PORT, LOCK_JUMPER_PIN, &suc);
|
||||
assert_param(suc);
|
||||
|
||||
suc &= rsc_claim(&UNIT_SYSTEM, rsc);
|
||||
assert_param(suc);
|
||||
|
||||
// Resolve pin
|
||||
lock_periph = plat_port2periph(LOCK_JUMPER_PORT, &suc);
|
||||
lock_llpin = plat_pin2ll(LOCK_JUMPER_PIN, &suc);
|
||||
lock_periph = port2periph(LOCK_JUMPER_PORT, &suc);
|
||||
lock_llpin = pin2ll(LOCK_JUMPER_PIN, &suc);
|
||||
assert_param(suc);
|
||||
|
||||
// Configure for input
|
||||
|
||||
+172
-9
@@ -2,6 +2,7 @@
|
||||
// Created by MightyPork on 2017/11/26.
|
||||
//
|
||||
|
||||
#include <utils/avrlibc.h>
|
||||
#include "pin_utils.h"
|
||||
#include "macro.h"
|
||||
|
||||
@@ -45,7 +46,7 @@ static GPIO_TypeDef * const port_periphs[] = {
|
||||
COMPILER_ASSERT(PORTS_COUNT == ELEMENTS_IN_ARRAY(port_periphs));
|
||||
|
||||
/** Convert pin number to LL bitfield */
|
||||
uint32_t plat_pin2ll(uint8_t pin_number, bool *suc)
|
||||
uint32_t pin2ll(uint8_t pin_number, bool *suc)
|
||||
{
|
||||
assert_param(suc != NULL);
|
||||
|
||||
@@ -59,13 +60,12 @@ uint32_t plat_pin2ll(uint8_t pin_number, bool *suc)
|
||||
}
|
||||
|
||||
/** Convert port name (A,B,C...) to peripheral struct pointer */
|
||||
GPIO_TypeDef *plat_port2periph(char port_name, bool *suc)
|
||||
GPIO_TypeDef *port2periph(char port_name, bool *suc)
|
||||
{
|
||||
assert_param(suc != NULL);
|
||||
|
||||
if(port_name < 'A' || port_name >= ('A'+PORTS_COUNT)) {
|
||||
dbg("Bad port: %c", port_name);
|
||||
// TODO proper report
|
||||
dbg("Bad port: %c", port_name); // TODO proper report
|
||||
*suc = false;
|
||||
return NULL;
|
||||
}
|
||||
@@ -75,20 +75,18 @@ GPIO_TypeDef *plat_port2periph(char port_name, bool *suc)
|
||||
}
|
||||
|
||||
/** Convert a pin to resource handle */
|
||||
Resource plat_pin2resource(char port_name, uint8_t pin_number, bool *suc)
|
||||
Resource pin2resource(char port_name, uint8_t pin_number, bool *suc)
|
||||
{
|
||||
assert_param(suc != NULL);
|
||||
|
||||
if(port_name < 'A' || port_name >= ('A'+PORTS_COUNT)) {
|
||||
dbg("Bad port: %c", port_name);
|
||||
// TODO proper report
|
||||
dbg("Bad port: %c", port_name); // TODO proper report
|
||||
*suc = false;
|
||||
return R_NONE;
|
||||
}
|
||||
|
||||
if(pin_number >= PINS_COUNT) {
|
||||
// TODO proper report
|
||||
dbg("Bad pin: %d", pin_number);
|
||||
dbg("Bad pin: %d", pin_number); // TODO proper report
|
||||
*suc = false;
|
||||
return R_NONE;
|
||||
}
|
||||
@@ -97,3 +95,168 @@ Resource plat_pin2resource(char port_name, uint8_t pin_number, bool *suc)
|
||||
|
||||
return R_PA0 + num*16 + pin_number;
|
||||
}
|
||||
|
||||
/** Parse single pin */
|
||||
bool parse_pin(const char *value, char *targetName, uint8_t *targetNumber)
|
||||
{
|
||||
// discard leading 'P'
|
||||
if (value[0] == 'P') {
|
||||
value++;
|
||||
}
|
||||
|
||||
size_t len = strlen(value);
|
||||
if (len<2||len>3) return false;
|
||||
|
||||
*targetName = (uint8_t) value[0];
|
||||
if (!(*targetName >= 'A' && *targetName <= 'H')) return false;
|
||||
|
||||
// lets just hope it's OK
|
||||
*targetNumber = (uint8_t) avr_atoi(value + 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Parse port name */
|
||||
bool parse_port(const char *value, char *targetName)
|
||||
{
|
||||
*targetName = (uint8_t) value[0];
|
||||
if (!(*targetName >= 'A' && *targetName < 'A' + PORTS_COUNT)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Parse a list of pin numbers with ranges and commans/semicolons to a bitmask */
|
||||
uint16_t parse_pinmask(const char *value, bool *suc)
|
||||
{
|
||||
uint32_t bits = 0;
|
||||
uint32_t acu = 0;
|
||||
bool inrange = false;
|
||||
uint32_t rangestart = 0;
|
||||
|
||||
// shortcut if none are set
|
||||
if (value[0] == 0) return 0;
|
||||
|
||||
char c;
|
||||
do {
|
||||
c = *value++;
|
||||
if (c == ' ' || c == '\t') {
|
||||
// skip
|
||||
}
|
||||
else if (c >= '0' && c <= '9') {
|
||||
acu = acu*10 + (c-'0');
|
||||
}
|
||||
else if (c == ',' || c == ';' || c == 0) {
|
||||
// end of number or range
|
||||
if (!inrange) rangestart = acu;
|
||||
|
||||
// swap them if they're in the wrong order
|
||||
if (acu < rangestart) {
|
||||
uint32_t swp = acu;
|
||||
acu = rangestart;
|
||||
rangestart = swp;
|
||||
}
|
||||
|
||||
for(uint32_t i=rangestart; i<=acu; i++) {
|
||||
bits |= 1<<i;
|
||||
}
|
||||
|
||||
inrange = false;
|
||||
rangestart = 0;
|
||||
acu = 0;
|
||||
}
|
||||
else if (c == '-' || c == ':') {
|
||||
rangestart = acu;
|
||||
inrange = true;
|
||||
acu=0;
|
||||
} else {
|
||||
*suc = false;
|
||||
}
|
||||
} while (c != 0);
|
||||
|
||||
if (bits > 0xFFFF) *suc = false;
|
||||
|
||||
return (uint16_t) bits;
|
||||
}
|
||||
|
||||
/** Convert a pin bitmask to the ASCII format understood by str_parse_pinmask() */
|
||||
char * str_pinmask(uint16_t pins, char *buffer)
|
||||
{
|
||||
char *b = buffer;
|
||||
uint32_t start = 0;
|
||||
bool on = false;
|
||||
bool first = true;
|
||||
|
||||
// shortcut if none are set
|
||||
if (pins == 0) {
|
||||
buffer[0] = 0;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
for (int32_t i = 15; i >= -1; i--) {
|
||||
bool bit;
|
||||
|
||||
if (i == -1) {
|
||||
bit = false;
|
||||
} else {
|
||||
bit = 0 != (pins & 0x8000);
|
||||
pins <<= 1;
|
||||
}
|
||||
|
||||
if (bit) {
|
||||
if (!on) {
|
||||
start = (uint32_t) i;
|
||||
on = true;
|
||||
}
|
||||
} else {
|
||||
if (on) {
|
||||
if (!first) {
|
||||
b += sprintf(b, ", ");
|
||||
}
|
||||
if (start == (uint32_t)(i+1)) {
|
||||
b += sprintf(b, "%"PRIu32, start);
|
||||
}
|
||||
else if (start == (uint32_t)(i+2)) {
|
||||
// exception for 2-long ranges - don't show as range
|
||||
b += sprintf(b, "%"PRIu32", %"PRIu32, start, i + 1);
|
||||
}
|
||||
else {
|
||||
b += sprintf(b, "%"PRIu32"-%"PRIu32, start, i + 1);
|
||||
}
|
||||
first = false;
|
||||
on = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/** Spread packed port pins using a mask */
|
||||
uint16_t port_spread(uint16_t packed, uint16_t mask)
|
||||
{
|
||||
uint16_t result = 0;
|
||||
uint16_t poke = 1;
|
||||
for (int i = 0; i<16; i++) {
|
||||
if (mask & (1<<i)) {
|
||||
if (packed & poke) {
|
||||
result |= 1<<i;
|
||||
}
|
||||
poke <<= 1;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Pack spread port pins using a mask */
|
||||
uint16_t port_pack(uint16_t spread, uint16_t mask)
|
||||
{
|
||||
uint16_t result = 0;
|
||||
uint16_t poke = 1;
|
||||
for (int i = 0; i<16; i++) {
|
||||
if (mask & (1<<i)) {
|
||||
if (spread & (1<<i)) {
|
||||
result |= poke;
|
||||
}
|
||||
poke <<= 1;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
+33
-3
@@ -17,7 +17,7 @@
|
||||
* @param suc - set to false on failure, left unchanged on success.
|
||||
* @return LL_GPIO_PIN_x
|
||||
*/
|
||||
uint32_t plat_pin2ll(uint8_t pin_number, bool *suc);
|
||||
uint32_t pin2ll(uint8_t pin_number, bool *suc);
|
||||
|
||||
/**
|
||||
* Convert pin name and number to a resource enum
|
||||
@@ -27,7 +27,7 @@ uint32_t plat_pin2ll(uint8_t pin_number, bool *suc);
|
||||
* @param suc - set to false on failure, left unchanged on success
|
||||
* @return the resource, or R_NONE
|
||||
*/
|
||||
Resource plat_pin2resource(char port_name, uint8_t pin_number, bool *suc);
|
||||
Resource pin2resource(char port_name, uint8_t pin_number, bool *suc);
|
||||
|
||||
/**
|
||||
* Convert port name to peripheral instance
|
||||
@@ -36,6 +36,36 @@ Resource plat_pin2resource(char port_name, uint8_t pin_number, bool *suc);
|
||||
* @param suc - set to false on failure, left unchanged on success.
|
||||
* @return instance
|
||||
*/
|
||||
GPIO_TypeDef *plat_port2periph(char port_name, bool *suc);
|
||||
GPIO_TypeDef *port2periph(char port_name, bool *suc);
|
||||
|
||||
/** Parse a pin name PA0 or A0 to port name and pin number */
|
||||
bool parse_pin(const char *str, char *targetName, uint8_t *targetNumber);
|
||||
|
||||
/** Parse a port name */
|
||||
bool parse_port(const char *value, char *targetName);
|
||||
|
||||
/** Parse a list of pin numbers with ranges and commans/semicolons to a bitmask */
|
||||
uint16_t parse_pinmask(const char *value, bool *suc);
|
||||
|
||||
/** Convert a pin bitmask to the ASCII format understood by str_parse_pinmask() */
|
||||
char * str_pinmask(uint16_t pins, char *buffer);
|
||||
|
||||
/**
|
||||
* Spread packed port pins using a mask
|
||||
*
|
||||
* @param packed - packed bits, right-aligned (eg. 0b1111)
|
||||
* @param mask - positions of the bits (eg. 0x8803)
|
||||
* @return - bits spread to their positions (always counting from right)
|
||||
*/
|
||||
uint16_t port_spread(uint16_t packed, uint16_t mask);
|
||||
|
||||
/**
|
||||
* Pack spread port pins using a mask
|
||||
*
|
||||
* @param spread - bits in a port register (eg. 0xFF02)
|
||||
* @param mask - mask of the bits we want to pack (eg. 0x8803)
|
||||
* @return - packed bits, right aligned (eg. 0b1110)
|
||||
*/
|
||||
uint16_t port_pack(uint16_t spread, uint16_t mask);
|
||||
|
||||
#endif //GEX_PIN_UTILS_H
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
#define GEX_PLAT_COMPAT_H
|
||||
|
||||
// -------- Static buffers ---------
|
||||
#define TSK_STACK_MAIN 150 // USB / VFS task stack size
|
||||
#define TSK_STACK_MAIN 200 // USB / VFS task stack size
|
||||
#define TSK_STACK_MSG 180 // TF message handler task stack size
|
||||
#define TSK_STACK_JOBRUNNER 100 // Job runner task stack size
|
||||
#define TSK_STACK_JOBRUNNER 80 // Job runner task stack size
|
||||
|
||||
#define BULKREAD_MAX_CHUNK 256 // Bulk read buffer
|
||||
|
||||
|
||||
+3
-1
@@ -9,6 +9,7 @@
|
||||
#include "framework/unit_registry.h"
|
||||
|
||||
#include "units/pin/unit_pin.h"
|
||||
#include "units/digital_out/unit_dout.h"
|
||||
#include "units/neopixel/unit_neopixel.h"
|
||||
#include "units/test/unit_test.h"
|
||||
|
||||
@@ -22,8 +23,9 @@ void plat_init_resources(void)
|
||||
|
||||
// --- Common unit drivers ---
|
||||
ureg_add_type(&UNIT_PIN);
|
||||
ureg_add_type(&UNIT_DOUT);
|
||||
|
||||
#if !DISABLE_TEST_UNIT
|
||||
#if HAVE_TEST_UNIT
|
||||
ureg_add_type(&UNIT_TEST);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@ void StatusLed_PreInit(void)
|
||||
{
|
||||
bool suc = true;
|
||||
// Resolve pin
|
||||
led_periph = plat_port2periph(STATUS_LED_PORT, &suc);
|
||||
led_llpin = plat_pin2ll(STATUS_LED_PIN, &suc);
|
||||
led_periph = port2periph(STATUS_LED_PORT, &suc);
|
||||
led_llpin = pin2ll(STATUS_LED_PIN, &suc);
|
||||
|
||||
// Configure for output
|
||||
LL_GPIO_SetPinMode(led_periph, led_llpin, LL_GPIO_MODE_OUTPUT);
|
||||
@@ -34,7 +34,7 @@ void StatusLed_Init(void)
|
||||
bool suc = true;
|
||||
|
||||
// Resolve and claim resource
|
||||
Resource rsc = plat_pin2resource(STATUS_LED_PORT, STATUS_LED_PIN, &suc);
|
||||
Resource rsc = pin2resource(STATUS_LED_PORT, STATUS_LED_PIN, &suc);
|
||||
assert_param(suc);
|
||||
|
||||
suc &= rsc_claim(&UNIT_SYSTEM, rsc);
|
||||
|
||||
Reference in New Issue
Block a user