feat: base project

This commit is contained in:
2025-03-27 16:10:02 +01:00
parent 457a02226f
commit dc14a7cb1c
6 changed files with 292 additions and 0 deletions

25
CMakeLists.txt Normal file
View File

@@ -0,0 +1,25 @@
cmake_minimum_required(VERSION 3.13)
# Initialize the Pico SDK
include(${PICO_SDK_PATH}/external/pico_sdk_import.cmake)
include_directories(${CMAKE_SOURCE_DIR}/config)
project(${PROJ_NAME})
pico_sdk_init()
add_executable(${PROJ_NAME})
if (STDIO_USB)
pico_enable_stdio_uart(${PROJ_NAME} 0)
pico_enable_stdio_usb(${PROJ_NAME} 1)
endif()
if (STDIO_UART)
pico_enable_stdio_uart(${PROJ_NAME} 1)
pico_enable_stdio_usb(${PROJ_NAME} 0)
endif()
# Adjust libraries as needed
target_link_libraries(${PROJ_NAME} ${APP_PICO_LIBS} ${CMAKE_SOURCE_DIR}/zig-out/${PROJ_NAME}.a)
# Generate binary
pico_add_extra_outputs(${PROJ_NAME})

57
build.zig Normal file
View File

@@ -0,0 +1,57 @@
const std = @import("std");
const pico = @import("pico_sdk").pico_sdk;
// Modify proj_name for your project name
const proj_name = "pico_doorbell";
// supported board: pico, pico_w, pico2, pico2_w
// Modify board_name for your board
const board_name = "pico_w";
// supported pico platform: rp2040, rp2350-arm-s, rp2350-riscv
// Modify pico_platform for select arm or risc-v, but the risc-v is not supported.
const pico_platform = "rp2040";
pub fn build(b: *std.Build) anyerror!void {
const stdio_type = .usb;
const cwy43_arch = .threadsafe_background;
const board = try pico.getBoardConfig(board_name, pico_platform, stdio_type, cwy43_arch);
const target = try pico.getCrossTarget(pico_platform);
const optimize = b.standardOptimizeOption(.{});
const lib = b.addStaticLibrary(.{
.name = "zig-pico",
.root_source_file = b.path("src/main.zig"),
.target = std.Build.resolveTargetQuery(b, target),
.optimize = optimize,
});
const option: pico.PicoAppOption = .{
.app_name = comptime proj_name,
.app_lib = lib,
.board = board,
// additional pico libs for application, it is none in blink application
.pico_libs = "pico_cyw43_arch_lwip_threadsafe_background",
};
std.log.info("Begin build app\n", .{});
const pico_build = try pico.addPicoApp(b, option);
const uf2_create_step = b.addInstallFile(b.path("build/pico_doorbell.uf2"), "pico_doorbell.uf2");
uf2_create_step.step.dependOn(pico_build);
const uf2_step = b.step("uf2", "Create firmware.uf2");
uf2_step.dependOn(&uf2_create_step.step);
const elf_create_step = b.addInstallFile(b.path("build/pico_doorbell.elf"), "pico_doorbell.elf");
elf_create_step.step.dependOn(pico_build);
const elf_step = b.step("elf", "Create firmware.elf");
elf_step.dependOn(&elf_create_step.step);
const copy_step = b.step("copy", "Copy firmware");
copy_step.dependOn(uf2_step);
copy_step.dependOn(elf_step);
b.default_step = copy_step;
}

52
build.zig.zon Normal file
View File

@@ -0,0 +1,52 @@
.{
// This is the default name used by packages depending on this one. For
// example, when a user runs `zig fetch --save <url>`, this field is used
// as the key in the `dependencies` table. Although the user can choose a
// different name, most users will stick with this provided value.
//
// It is redundant to include "zig" in this name because it is already
// within the Zig package namespace.
.name = .zig_pico_doorbell2,
// This is a [Semantic Version](https://semver.org/).
// In a future version of Zig it will be used for package deduplication.
.version = "0.0.0",
// Together with name, this represents a globally unique package
// identifier. This field is generated by the Zig toolchain when the
// package is first created, and then *never changes*. This allows
// unambiguous detection of one package being an updated version of
// another.
//
// When forking a Zig project, this id should be regenerated (delete the
// field and run `zig build`) if the upstream project is still maintained.
// Otherwise, the fork is *hostile*, attempting to take control over the
// original project's identity. Thus it is recommended to leave the comment
// on the following line intact, so that it shows up in code reviews that
// modify the field.
.fingerprint = 0x9bf2eb3e009a59d0, // Changing this has security and trust implications.
// Tracks the earliest Zig version that the package considers to be a
// supported use case.
.minimum_zig_version = "0.14.0",
// This field is optional.
// Each dependency must either provide a `url` and `hash`, or a `path`.
// `zig build --fetch` can be used to fetch all dependencies of a package, recursively.
// Once all dependencies are fetched, `zig build` no longer requires
// internet connectivity.
.dependencies = .{
.pico_sdk = .{
.url = "git+https://github.com/adix7/zig-pico-cmake.git#8adc8a40000174065c2525531de4f46800233a07",
.hash = "pico_sdk-0.2.0-0FI1kYdcAAD3yWZDXMQdsiYBbTvlUku-AHXIX8DI50k6",
},
},
.paths = .{
"build.zig",
"build.zig.zon",
"src",
// For example...
//"LICENSE",
//"README.md",
},
}

89
config/lwipopts.h Normal file
View File

@@ -0,0 +1,89 @@
#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__
// Common settings used in most of the pico_w examples
// (see https://www.nongnu.org/lwip/2_1_x/group__lwip__opts.html for details)
// allow override in some examples
#ifndef NO_SYS
#define NO_SYS 1
#endif
// allow override in some examples
#ifndef LWIP_SOCKET
#define LWIP_SOCKET 0
#endif
#if PICO_CYW43_ARCH_POLL
#define MEM_LIBC_MALLOC 1
#else
// MEM_LIBC_MALLOC is incompatible with non polling versions
#define MEM_LIBC_MALLOC 0
#endif
#define MEM_ALIGNMENT 4
#define MEM_SIZE 4000
#define MEMP_NUM_TCP_SEG 32
#define MEMP_NUM_ARP_QUEUE 10
#define PBUF_POOL_SIZE 24
#define LWIP_ARP 1
#define LWIP_ETHERNET 1
#define LWIP_ICMP 1
#define LWIP_RAW 1
#define TCP_WND (8 * TCP_MSS)
#define TCP_MSS 1460
#define TCP_SND_BUF (8 * TCP_MSS)
#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1)) / (TCP_MSS))
#define LWIP_NETIF_STATUS_CALLBACK 1
#define LWIP_NETIF_LINK_CALLBACK 1
#define LWIP_NETIF_HOSTNAME 1
#define LWIP_NETCONN 0
#define MEM_STATS 0
#define SYS_STATS 0
#define MEMP_STATS 0
#define LINK_STATS 0
// #define ETH_PAD_SIZE 2
#define LWIP_CHKSUM_ALGORITHM 3
#define LWIP_DHCP 1
#define LWIP_IPV4 1
#define LWIP_TCP 1
#define LWIP_UDP 1
#define LWIP_DNS 1
#define LWIP_TCP_KEEPALIVE 1
#define LWIP_NETIF_TX_SINGLE_PBUF 1
#define DHCP_DOES_ARP_CHECK 0
#define LWIP_DHCP_DOES_ACD_CHECK 0
#ifndef NDEBUG
#define LWIP_DEBUG 1
#define LWIP_STATS 1
#define LWIP_STATS_DISPLAY 1
#endif
#define ETHARP_DEBUG LWIP_DBG_OFF
#define NETIF_DEBUG LWIP_DBG_OFF
#define PBUF_DEBUG LWIP_DBG_OFF
#define API_LIB_DEBUG LWIP_DBG_OFF
#define API_MSG_DEBUG LWIP_DBG_OFF
#define SOCKETS_DEBUG LWIP_DBG_OFF
#define ICMP_DEBUG LWIP_DBG_OFF
#define INET_DEBUG LWIP_DBG_OFF
#define IP_DEBUG LWIP_DBG_OFF
#define IP_REASS_DEBUG LWIP_DBG_OFF
#define RAW_DEBUG LWIP_DBG_OFF
#define MEM_DEBUG LWIP_DBG_OFF
#define MEMP_DEBUG LWIP_DBG_OFF
#define SYS_DEBUG LWIP_DBG_OFF
#define TCP_DEBUG LWIP_DBG_OFF
#define TCP_INPUT_DEBUG LWIP_DBG_OFF
#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
#define TCP_RTO_DEBUG LWIP_DBG_OFF
#define TCP_CWND_DEBUG LWIP_DBG_OFF
#define TCP_WND_DEBUG LWIP_DBG_OFF
#define TCP_FR_DEBUG LWIP_DBG_OFF
#define TCP_QLEN_DEBUG LWIP_DBG_OFF
#define TCP_RST_DEBUG LWIP_DBG_OFF
#define UDP_DEBUG LWIP_DBG_OFF
#define TCPIP_DEBUG LWIP_DBG_OFF
#define PPP_DEBUG LWIP_DBG_OFF
#define SLIP_DEBUG LWIP_DBG_OFF
#define DHCP_DEBUG LWIP_DBG_OFF
#endif /* __LWIPOPTS_H__ */

22
config/pico/version.h Normal file
View File

@@ -0,0 +1,22 @@
// This file should look something like this:
// version.h seems not strictly necessary
/*
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
// ---------------------------------------
// THIS FILE IS AUTOGENERATED; DO NOT EDIT
// ---------------------------------------
// #ifndef _PICO_VERSION_H
// #define _PICO_VERSION_H
// #define PICO_SDK_VERSION_MAJOR 1
// #define PICO_SDK_VERSION_MINOR 5
// #define PICO_SDK_VERSION_REVISION 1
// #define PICO_SDK_VERSION_STRING "1.5.1"
// #endif

47
src/main.zig Normal file
View File

@@ -0,0 +1,47 @@
pub const p = @cImport({
@cInclude("pico.h");
@cInclude("stdio.h");
@cInclude("pico/stdlib.h");
// PICO W specific header
@cInclude("pico/cyw43_arch.h");
});
const std = @import("std");
const BUTTON_PIN = 15;
const GPIO_IN = false;
// Basically the pico_w blink sample
export fn main() c_int {
_ = p.stdio_init_all();
if (p.cyw43_arch_init() != 0) {
return -1;
}
p.cyw43_arch_enable_sta_mode();
if (p.cyw43_arch_wifi_connect_timeout_ms(@embedFile("wifi.txt"), @embedFile("password.txt"), p.CYW43_AUTH_WPA2_AES_PSK, 10000) == 1) {
p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, true);
return -1;
}
p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, true);
p.sleep_ms(200);
p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, false);
p.gpio_init(BUTTON_PIN);
p.gpio_set_dir(BUTTON_PIN, GPIO_IN);
// while (true) {
// p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, true);
// p.sleep_ms(500);
// p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, false);
// p.sleep_ms(1000);
// }
// _ = p.printf("Hello world\n");
while (true) {
while (p.gpio_get(BUTTON_PIN)) {
p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, true);
p.sleep_ms(50);
}
p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, false);
}
}