feat: base project
This commit is contained in:
25
CMakeLists.txt
Normal file
25
CMakeLists.txt
Normal 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
57
build.zig
Normal 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
52
build.zig.zon
Normal 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
89
config/lwipopts.h
Normal 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
22
config/pico/version.h
Normal 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
47
src/main.zig
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user