Compare commits
No commits in common. "32849eab29ecad88b7a49452e38211027ac6b374" and "813c45d36bf6db809874e09d678b66c801d0cbd1" have entirely different histories.
32849eab29
...
813c45d36b
24
flake.nix
24
flake.nix
@ -26,8 +26,6 @@
|
|||||||
rootFileContent = builtins.readFile rootdir.outPath;
|
rootFileContent = builtins.readFile rootdir.outPath;
|
||||||
in
|
in
|
||||||
pkgs.lib.mkIf (rootFileContent != "") rootFileContent;
|
pkgs.lib.mkIf (rootFileContent != "") rootFileContent;
|
||||||
|
|
||||||
ocdInterface = mcu/tigard-swd.cfg;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
devenv.shells.mcu = {
|
devenv.shells.mcu = {
|
||||||
@ -36,7 +34,6 @@
|
|||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
gnumake
|
gnumake
|
||||||
cmake
|
cmake
|
||||||
pkgsCross.arm-embedded.buildPackages.gdb # ARM one is broken
|
|
||||||
gcc-arm-embedded
|
gcc-arm-embedded
|
||||||
python3
|
python3
|
||||||
picotool
|
picotool
|
||||||
@ -46,27 +43,6 @@
|
|||||||
env = {
|
env = {
|
||||||
PICO_SDK_PATH = "${pkgs.pico-sdk}/lib/pico-sdk";
|
PICO_SDK_PATH = "${pkgs.pico-sdk}/lib/pico-sdk";
|
||||||
};
|
};
|
||||||
|
|
||||||
scripts = {
|
|
||||||
build.exec = ''
|
|
||||||
cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug -D PICO_STDIO_SEMIHOSTING=1
|
|
||||||
cmake --build build --parallel
|
|
||||||
'';
|
|
||||||
build-rel.exec = ''
|
|
||||||
cmake -S . -B build-release -D CMAKE_BUILD_TYPE=Release
|
|
||||||
cmake --build build-release --parallel
|
|
||||||
'';
|
|
||||||
clean.exec = ''
|
|
||||||
rm -rf build/ build-release/
|
|
||||||
'';
|
|
||||||
|
|
||||||
ocd.exec = ''
|
|
||||||
openocd -f ${ocdInterface} -f target/rp2040.cfg
|
|
||||||
'';
|
|
||||||
gdb.exec = ''
|
|
||||||
arm-none-eabi-gdb -x .gdbinit build/qclk.elf
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
target extended-remote localhost:3333
|
|
||||||
monitor arm semihosting enable
|
|
||||||
monitor reset init
|
|
||||||
monitor debug_level -2
|
|
1
mcu/.gitignore
vendored
1
mcu/.gitignore
vendored
@ -1,2 +1 @@
|
|||||||
/build/
|
/build/
|
||||||
/build-release/
|
|
||||||
|
@ -6,14 +6,14 @@ include(pico_sdk_import.cmake)
|
|||||||
project(test_project C CXX ASM)
|
project(test_project C CXX ASM)
|
||||||
set(CMAKE_C_STANDARD 11)
|
set(CMAKE_C_STANDARD 11)
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_C_COMPILER_WORKS ON)
|
||||||
|
set(CMAKE_CXX_COMPILER_WORKS ON)
|
||||||
pico_sdk_init()
|
pico_sdk_init()
|
||||||
|
|
||||||
add_executable(qclk
|
add_executable(qclk
|
||||||
main.c
|
main.c
|
||||||
)
|
)
|
||||||
|
|
||||||
pico_enable_stdio_usb(qclk 1)
|
pico_enable_stdio_usb(qclk 1)
|
||||||
pico_enable_stdio_uart(qclk 0)
|
pico_enable_stdio_uart(qclk 1)
|
||||||
|
|
||||||
pico_add_extra_outputs(qclk)
|
pico_add_extra_outputs(qclk)
|
||||||
target_link_libraries(qclk pico_stdlib hardware_i2c pico_i2c_slave)
|
target_link_libraries(qclk pico_stdlib)
|
||||||
|
105
mcu/main.c
105
mcu/main.c
@ -1,102 +1,23 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "hardware/gpio.h"
|
|
||||||
#include "hardware/i2c.h"
|
|
||||||
#include "pico/stdlib.h"
|
#include "pico/stdlib.h"
|
||||||
|
#include "hardware/gpio.h"
|
||||||
#include "pico/binary_info.h"
|
#include "pico/binary_info.h"
|
||||||
#include "pico/i2c_slave.h"
|
|
||||||
|
|
||||||
const uint PIN_DIGIT_BASE = 18;
|
const uint LED_PIN = 25;
|
||||||
const uint PIN_SEGMENT_BASE = 2;
|
|
||||||
|
|
||||||
const uint N_DIGITS = 4;
|
|
||||||
|
|
||||||
const uint I2C_PIN_SDA = 0;
|
|
||||||
const uint I2C_PIN_SCL = 1;
|
|
||||||
const uint I2C_SLAVE_ADDRESS = 0x17;
|
|
||||||
const uint I2C_RATE = 100 * 1000;
|
|
||||||
|
|
||||||
uint8_t digit_states[4] = { 0 };
|
|
||||||
static struct {
|
|
||||||
bool digit_written;
|
|
||||||
uint digit;
|
|
||||||
} i2c_context;
|
|
||||||
|
|
||||||
static void write_digit(uint8_t digit) {
|
|
||||||
const uint mask = (0xffffffff << PIN_SEGMENT_BASE) ^ (0xffffffff << PIN_SEGMENT_BASE + 8);
|
|
||||||
gpio_put_masked(mask, (~digit & 0xff) << PIN_SEGMENT_BASE);
|
|
||||||
gpio_put_masked(mask, digit << PIN_SEGMENT_BASE);
|
|
||||||
}
|
|
||||||
static void setup_io() {
|
|
||||||
for (uint i = PIN_DIGIT_BASE; i < PIN_DIGIT_BASE + N_DIGITS; i++) {
|
|
||||||
gpio_init(i);
|
|
||||||
gpio_set_dir(i, GPIO_OUT);
|
|
||||||
gpio_put(i, 0);
|
|
||||||
}
|
|
||||||
for (uint i = PIN_SEGMENT_BASE; i < PIN_SEGMENT_BASE + 8; i++) {
|
|
||||||
gpio_init(i);
|
|
||||||
gpio_set_dir(i, GPIO_OUT);
|
|
||||||
}
|
|
||||||
write_digit(0);
|
|
||||||
}
|
|
||||||
static void display_loop() {
|
|
||||||
for (uint i = 0; i < N_DIGITS; i++) {
|
|
||||||
uint prev = i == 0 ? N_DIGITS - 1 : i - 1;
|
|
||||||
|
|
||||||
gpio_put(PIN_DIGIT_BASE + prev, 0);
|
|
||||||
sleep_us(100);
|
|
||||||
|
|
||||||
write_digit(digit_states[i]);
|
|
||||||
gpio_put(PIN_DIGIT_BASE + i, 1);
|
|
||||||
sleep_ms(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event) {
|
|
||||||
switch (event) {
|
|
||||||
case I2C_SLAVE_RECEIVE: // master has written some data
|
|
||||||
if (!i2c_context.digit_written) {
|
|
||||||
// writes always start with the memory address
|
|
||||||
uint8_t addr = i2c_read_byte_raw(i2c);
|
|
||||||
i2c_context.digit = addr < N_DIGITS ? addr : -1;
|
|
||||||
i2c_context.digit_written = true;
|
|
||||||
} else if (i2c_context.digit != -1) {
|
|
||||||
// save into memory
|
|
||||||
digit_states[i2c_context.digit] = i2c_read_byte_raw(i2c);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_SLAVE_REQUEST: // master is requesting data
|
|
||||||
// load from memory
|
|
||||||
uint8_t data = i2c_context.digit != -1 ? digit_states[i2c_context.digit] : 0;
|
|
||||||
i2c_write_byte_raw(i2c, data);
|
|
||||||
break;
|
|
||||||
case I2C_SLAVE_FINISH: // master has signalled Stop / Restart
|
|
||||||
i2c_context.digit_written = false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void setup_i2c() {
|
|
||||||
gpio_init(I2C_PIN_SDA);
|
|
||||||
gpio_set_function(I2C_PIN_SDA, GPIO_FUNC_I2C);
|
|
||||||
gpio_pull_up(I2C_PIN_SDA);
|
|
||||||
|
|
||||||
gpio_init(I2C_PIN_SCL);
|
|
||||||
gpio_set_function(I2C_PIN_SCL, GPIO_FUNC_I2C);
|
|
||||||
gpio_pull_up(I2C_PIN_SCL);
|
|
||||||
|
|
||||||
i2c_init(i2c0, I2C_RATE);
|
|
||||||
// configure I2C0 for slave mode
|
|
||||||
i2c_slave_init(i2c0, I2C_SLAVE_ADDRESS, &i2c_slave_handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
bi_decl(bi_program_description("qCLK driver."));
|
bi_decl(bi_program_description("This is a test binary."));
|
||||||
|
bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED"));
|
||||||
|
|
||||||
stdio_init_all();
|
stdio_init_all();
|
||||||
setup_io();
|
|
||||||
setup_i2c();
|
|
||||||
|
|
||||||
while (1) display_loop();
|
gpio_init(LED_PIN);
|
||||||
|
gpio_set_dir(LED_PIN, GPIO_OUT);
|
||||||
|
while (1) {
|
||||||
|
gpio_put(LED_PIN, 0);
|
||||||
|
sleep_ms(250);
|
||||||
|
gpio_put(LED_PIN, 1);
|
||||||
|
puts("Hello World\n");
|
||||||
|
sleep_ms(1000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
adapter driver ftdi
|
|
||||||
transport select swd
|
|
||||||
ftdi_vid_pid 0x0403 0x6010
|
|
||||||
ftdi_channel 1
|
|
||||||
adapter speed 2000
|
|
||||||
ftdi_layout_init 0x0028 0x002b
|
|
||||||
ftdi_layout_signal SWD_EN -data 0
|
|
||||||
ftdi_layout_signal nSRST -data 0x0020
|
|
Loading…
x
Reference in New Issue
Block a user