Compare commits

...

4 Commits

Author SHA1 Message Date
Weckyy702
a5f4a1e3a8 Add hsync and vsync signals for 480x640 resolution 2026-03-10 11:17:07 +01:00
Weckyy702
74b74dcb6e Format flake.nix 2026-03-10 11:16:15 +01:00
Weckyy702
7cdfb565f3 Update .gitignore 2026-03-09 20:37:03 +01:00
Weckyy702
41bf80157b Flake: Use flake-utils instead of a self-written solution 2026-03-09 20:37:01 +01:00
4 changed files with 76 additions and 49 deletions

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@ build/
.cache .cache
.direnv .direnv
pico_sdk_import.cmake pico_sdk_import.cmake
compile_commands.json

27
flake.lock generated
View File

@@ -1,5 +1,23 @@
{ {
"nodes": { "nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1771369470, "lastModified": 1771369470,
@@ -18,8 +36,8 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs", "flake-utils": "flake-utils",
"systems": "systems" "nixpkgs": "nixpkgs"
} }
}, },
"systems": { "systems": {
@@ -32,8 +50,9 @@
"type": "github" "type": "github"
}, },
"original": { "original": {
"id": "systems", "owner": "nix-systems",
"type": "indirect" "repo": "default",
"type": "github"
} }
} }
}, },

View File

@@ -1,51 +1,41 @@
{ {
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = outputs =
inputs @ { nixpkgs { nixpkgs
, systems , flake-utils
, ... , ...
}: }:
flake-utils.lib.eachDefaultSystem (system:
let let
inherit (nixpkgs) lib; pkgs = import nixpkgs { inherit system; };
eachSystem = lib.genAttrs (import systems); pico-sdk = pkgs.pico-sdk.override {
pkgsFor = eachSystem (system: withSubmodules = true;
import nixpkgs { };
localSystem = system; PICO_SDK_PATH = "${pico-sdk}/lib/pico-sdk";
});
in in
{ {
devShells = devShell = pkgs.mkShell {
eachSystem name = "PicoVGA dev shell";
(system: { inputsFrom = [ pico-sdk ];
default = packages = with pkgs; [
let gcc-arm-embedded
pkgs = pkgsFor.${system}; python3
pico-sdk = pkgs.pico-sdk.override { pico-sdk
withSubmodules = true;
};
PICO_SDK_PATH = "${pico-sdk}/lib/pico-sdk";
in
pkgs.mkShell {
name = "PicoVGA dev shell";
inputsFrom = [ pico-sdk ];
packages = with pkgs;
[
gcc-arm-embedded
python3
usbutils picocom
picotool
picocom
]
++ [ pico-sdk ];
shellHook = '' usbutils
ln -sf ${PICO_SDK_PATH}/external/pico_sdk_import.cmake pico_sdk_import.cmake picotool
''; ];
shellHook = ''
ln -sf ${PICO_SDK_PATH}/external/pico_sdk_import.cmake pico_sdk_import.cmake
'';
inherit PICO_SDK_PATH; inherit PICO_SDK_PATH;
}; };
}); });
};
} }

View File

@@ -1,25 +1,42 @@
#include "hardware/gpio.h" #include "hardware/gpio.h"
#include "pico/stdlib.h" #include "pico/stdlib.h"
#include <pico/time.h>
#include <concepts>
#include <cstdint> #include <cstdint>
#include <cstdio> #include <cstdio>
#include <pico/time.h>
constexpr static uint start_pin = 2; constexpr static uint start_pin = 2;
constexpr static uint pin_mask = (0xFFF) << start_pin; constexpr static uint pin_mask = (0xFFF) << start_pin;
template <std::integral T> constexpr bool between(T x, T min, T max) {
return (x >= min) && (x < max);
}
int main() { int main() {
stdio_init_all(); stdio_init_all();
for (uint offset{}; offset != 14; ++offset) { for (uint offset{}; offset != 14; ++offset) {
auto const pin = start_pin + offset; auto const pin = start_pin + offset;
std::printf("Initializing GPIO %d\n", pin);
gpio_init(pin); gpio_init(pin);
gpio_set_dir(pin, GPIO_OUT); gpio_set_dir(pin, GPIO_OUT);
} }
for (uint16_t pixel{};; ++pixel) { for (uint32_t y{}; y != 525; ++y) {
auto const set_mask = (pixel & 0xFFF) << start_pin; for (uint32_t x{}; x != 800; ++x) {
printf("Set mask=%03x", pixel); const auto is_blanking = y >= 480 || x >= 640;
gpio_put_masked(pin_mask, set_mask); const auto hsync = between(x, 656ul, 752ul);
sleep_ms(100); const auto vsync = between(y, 490ul, 492ul);
auto const pixel = (0u << 8) | ((y & 0xF) << 4) | (x & 0xF);
auto const set_mask =
(((uint32_t)vsync << 13) | ((uint32_t)hsync << 12) | (pixel & 0xFFF))
<< start_pin;
std::printf("Set mask=%04X\n", set_mask >> start_pin);
gpio_put_masked(pin_mask, set_mask);
sleep_ms(10);
}
} }
} }