Skip to content

Commit

Permalink
update to the latest Pico SDK/LWIP/TinyUSB; remove submodules; use PI…
Browse files Browse the repository at this point in the history
…O instead of SPI
  • Loading branch information
untoxa committed Mar 10, 2023
1 parent 1834426 commit 23c35da
Show file tree
Hide file tree
Showing 18 changed files with 321 additions and 162 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.vscode
build
makefsdata
unused
unused
gen_build.bat
10 changes: 0 additions & 10 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,10 +0,0 @@
[submodule "tinyusb"]
path = tinyusb
url = https://github.com/raspberrypi/tinyusb.git
branch = pico
[submodule "pico-sdk"]
path = pico-sdk
url = https://github.com/raspberrypi/pico-sdk.git
[submodule "lwip"]
path = lwip
url = https://git.savannah.nongnu.org/git/lwip.git
15 changes: 8 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
cmake_minimum_required(VERSION 3.13)

# We prefer to have all linked submodules at toplevel
set(PICO_TINYUSB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/tinyusb)

include(pico-sdk/pico_sdk_init.cmake)
include(pico_sdk_import.cmake)
project(pico_gb_printer)
#set(PICO_CXX_ENABLE_EXCEPTIONS 1)
pico_sdk_init()

# LWIP
set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lwip)
set(LWIP_DIR ${PICO_SDK_PATH}/lib/lwip)
set (LWIP_INCLUDE_DIRS
"include"
"${LWIP_DIR}/src/include"
Expand All @@ -18,16 +15,20 @@ set (LWIP_INCLUDE_DIRS
include(${LWIP_DIR}/src/Filelists.cmake)

# Extra stuff from TinyUSB, that is not part of tinyusb_device library
set(PICO_TINYUSB_PATH ${PICO_SDK_PATH}/lib/tinyusb)
set(TINYUSB_LIBNETWORKING_SOURCES
${PICO_TINYUSB_PATH}/lib/networking/dhserver.c
${PICO_TINYUSB_PATH}/lib/networking/dnserver.c
${PICO_TINYUSB_PATH}/lib/networking/rndis_reports.c
)

add_executable(${PROJECT_NAME} src/pico_gb_printer.c src/gb_printer.c src/tusb_lwip_glue.c src/usb_descriptors.c ${TINYUSB_LIBNETWORKING_SOURCES})
add_executable(${PROJECT_NAME} src/pico_gb_printer.c src/linkcable.c src/gb_printer.c src/tusb_lwip_glue.c src/usb_descriptors.c ${TINYUSB_LIBNETWORKING_SOURCES})

pico_generate_pio_header(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/src/linkcable.pio)

pico_enable_stdio_usb(${PROJECT_NAME} 0)
pico_enable_stdio_uart(${PROJECT_NAME} 0)
target_include_directories(${PROJECT_NAME} PRIVATE ${LWIP_INCLUDE_DIRS} ${PICO_TINYUSB_PATH}/src ${PICO_TINYUSB_PATH}/lib/networking)
target_link_libraries(${PROJECT_NAME} pico_stdlib pico_multicore pico_unique_id hardware_spi tinyusb_device lwipallapps lwipcore hardware_flash)
target_link_libraries(${PROJECT_NAME} pico_stdlib hardware_pio pico_unique_id tinyusb_device lwipallapps lwipcore hardware_flash)
pico_add_extra_outputs(${PROJECT_NAME})
target_compile_definitions(${PROJECT_NAME} PRIVATE PICO_ENTER_USB_BOOT_ON_EXIT=1)
Binary file modified build/pico_gb_printer.uf2
Binary file not shown.
13 changes: 0 additions & 13 deletions include/globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,6 @@
#define LED_TOGGLE
#endif

// SPI
#define SPI_BAUDRATE 64 * 1024 * 8

#define SPI_PORT spi0
#define PIN_SPI_SIN 0
#define PIN_SPI_SCK 2
#define PIN_SPI_SOUT 3

//#define SPI_PORT spi1
//#define PIN_SPI_SCK 10
//#define PIN_SPI_SOUT 11
//#define PIN_SPI_SIN 12

// "Tear" button pin, define to 0 to disable
#define PIN_KEY 23

Expand Down
29 changes: 29 additions & 0 deletions include/linkcable.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#ifndef _LINKCABLE_H_INCLUDE_
#define _LINKCABLE_H_INCLUDE_

#include "hardware/pio.h"

#define LINKCABLE_PIO pio0
#define LINKCABLE_SM 0

#define LINKCABLE_BITS 8

#define PIN_SIN 0
#define PIN_SCK 2
#define PIN_SOUT 3

static inline uint8_t linkcable_receive(void) {
return pio_sm_get(LINKCABLE_PIO, LINKCABLE_SM);
}

static inline void linkcable_send(uint8_t data) {
pio_sm_put(LINKCABLE_PIO, LINKCABLE_SM, data);
}

static inline void linkcable_reset(void) {
pio_sm_restart(LINKCABLE_PIO, LINKCABLE_SM);
}

void linkcable_init(irq_handler_t onReceive);

#endif
12 changes: 10 additions & 2 deletions include/lwipopts.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,14 @@
#define LWIP_ICMP 1
#define LWIP_UDP 1
#define LWIP_TCP 1
#define LWIP_IPV4 1
#define LWIP_IPV6 0
#define ETH_PAD_SIZE 0
#define LWIP_IP_ACCEPT_UDP_PORT(p) ((p) == PP_NTOHS(67))

#define TCP_MSS (1500 /*mtu*/ - 20 /*iphdr*/ - 20 /*tcphhr*/)
#define TCP_SND_BUF (2 * TCP_MSS)
#define TCP_WND (TCP_MSS)

#define ETHARP_SUPPORT_STATIC_ENTRIES 1

Expand All @@ -67,8 +70,13 @@
#define HTTPD_USE_CUSTOM_FSDATA 0
#define HTTPD_FSDATA_FILE "pico_printer_fs.c"

#define LWIP_SINGLE_NETIF 1

#define HTTPD_ADDITIONAL_CONTENT_TYPES {"bin", HTTP_CONTENT_TYPE("application/pico-printer-binary-log")}

#define LWIP_SINGLE_NETIF 1

#define PBUF_POOL_SIZE 2
#define LWIP_MULTICAST_PING 1
#define LWIP_BROADCAST_PING 1
#define LWIP_IPV6_MLD 0
#define LWIP_IPV6_SEND_ROUTER_SOLICIT 0
#endif /* __LWIPOPTS_H__ */
65 changes: 32 additions & 33 deletions include/tusb_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,46 +30,46 @@
extern "C" {
#endif

//--------------------------------------------------------------------
// COMMON CONFIGURATION
//--------------------------------------------------------------------
//--------------------------------------------------------------------+
// Board Specific Configuration
//--------------------------------------------------------------------+

// defined by board.mk
#ifndef CFG_TUSB_MCU
#error CFG_TUSB_MCU must be defined
#ifndef CFG_TUSB_RHPORT0_MODE
#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | OPT_MODE_HIGH_SPEED)
#endif

// RHPort number used for device can be defined by board.mk, default to port 0
#ifndef BOARD_DEVICE_RHPORT_NUM
#define BOARD_DEVICE_RHPORT_NUM 0
#ifndef BOARD_TUD_RHPORT
#define BOARD_TUD_RHPORT 0
#endif

// RHPort max operational speed can defined by board.mk
// Default to Highspeed for MCU with internal HighSpeed PHY (can be port specific), otherwise FullSpeed
#ifndef BOARD_DEVICE_RHPORT_SPEED
#if (CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_LPC43XX || CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX || \
CFG_TUSB_MCU == OPT_MCU_NUC505 || CFG_TUSB_MCU == OPT_MCU_CXD56)
#define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_HIGH_SPEED
#else
#define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_FULL_SPEED
#endif
#ifndef BOARD_TUD_MAX_SPEED
#define BOARD_TUD_MAX_SPEED OPT_MODE_DEFAULT_SPEED
#endif

// Device mode with rhport and speed defined by board.mk
#if BOARD_DEVICE_RHPORT_NUM == 0
#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED)
#elif BOARD_DEVICE_RHPORT_NUM == 1
#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED)
#else
#error "Incorrect RHPort configuration"
//--------------------------------------------------------------------
// Common Configuration
//--------------------------------------------------------------------

// defined by compiler flags for flexibility
#ifndef CFG_TUSB_MCU
#error CFG_TUSB_MCU must be defined
#endif

#ifndef CFG_TUSB_OS
#define CFG_TUSB_OS OPT_OS_NONE
#define CFG_TUSB_OS OPT_OS_NONE
#endif

#ifndef CFG_TUSB_DEBUG
#define CFG_TUSB_DEBUG 0
#endif

// CFG_TUSB_DEBUG is defined by compiler in DEBUG build
// #define CFG_TUSB_DEBUG 0
// Enable Device stack
#define CFG_TUD_ENABLED 1

// Default is max speed that hardware controller could support with on-chip PHY
#define CFG_TUD_MAX_SPEED BOARD_TUD_MAX_SPEED

/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
* Tinyusb use follows macros to declare transferring memory so that they can be put
Expand All @@ -83,7 +83,7 @@
#endif

#ifndef CFG_TUSB_MEM_ALIGN
#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4)))
#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4)))
#endif

//--------------------------------------------------------------------
Expand All @@ -95,12 +95,11 @@
#endif

//------------- CLASS -------------//
#define CFG_TUD_CDC 0
#define CFG_TUD_MSC 0
#define CFG_TUD_HID 0
#define CFG_TUD_MIDI 0
#define CFG_TUD_VENDOR 0
#define CFG_TUD_NET 1

// Network class has 2 drivers: ECM/RNDIS and NCM.
// Only one of the drivers can be enabled
#define CFG_TUD_ECM_RNDIS 0
#define CFG_TUD_NCM (1-CFG_TUD_ECM_RNDIS)

#ifdef __cplusplus
}
Expand Down
9 changes: 5 additions & 4 deletions include/tusb_lwip_glue.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@
#include "lwip/timeouts.h"
#include "lwip/apps/httpd.h"

void init_lwip();
void wait_for_netif_is_up();
void dhcpd_init();
void service_traffic();
void init_lwip(void);
void wait_for_netif_is_up(void);
void dhcpd_init(void);
void dns_init(void);
void service_traffic(void);

#ifdef __cplusplus
}
Expand Down
1 change: 0 additions & 1 deletion lwip
Submodule lwip deleted from 005652
1 change: 0 additions & 1 deletion pico-sdk
Submodule pico-sdk deleted from fc10a9
73 changes: 73 additions & 0 deletions pico_sdk_import.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# This is a copy of <PICO_SDK_PATH>/external/pico_sdk_import.cmake

# This can be dropped into an external project to help locate this SDK
# It should be include()ed prior to project()

if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH))
set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')")
endif ()

if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT))
set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT})
message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')")
endif ()

if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH))
set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH})
message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')")
endif ()

set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK")
set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable")
set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK")

if (NOT PICO_SDK_PATH)
if (PICO_SDK_FETCH_FROM_GIT)
include(FetchContent)
set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR})
if (PICO_SDK_FETCH_FROM_GIT_PATH)
get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}")
endif ()
# GIT_SUBMODULES_RECURSE was added in 3.17
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0")
FetchContent_Declare(
pico_sdk
GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk
GIT_TAG master
GIT_SUBMODULES_RECURSE FALSE
)
else ()
FetchContent_Declare(
pico_sdk
GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk
GIT_TAG master
)
endif ()

if (NOT pico_sdk)
message("Downloading Raspberry Pi Pico SDK")
FetchContent_Populate(pico_sdk)
set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR})
endif ()
set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE})
else ()
message(FATAL_ERROR
"SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git."
)
endif ()
endif ()

get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
if (NOT EXISTS ${PICO_SDK_PATH})
message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found")
endif ()

set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake)
if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE})
message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK")
endif ()

set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE)

include(${PICO_SDK_INIT_CMAKE_FILE})
27 changes: 27 additions & 0 deletions src/linkcable.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include <stdint.h>

#include "hardware/pio.h"
#include "hardware/irq.h"

#include "linkcable.h"
#include "linkcable.pio.h"

static irq_handler_t linkcable_irq_handler = NULL;

static void linkcable_isr(void) {
if (linkcable_irq_handler) linkcable_irq_handler();
if (pio_interrupt_get(LINKCABLE_PIO, 0)) pio_interrupt_clear(LINKCABLE_PIO, 0);
}

void linkcable_init(irq_handler_t onDataReceive) {
linkcable_program_init(LINKCABLE_PIO, LINKCABLE_SM, pio_add_program(LINKCABLE_PIO, &linkcable_program), PIN_SIN);
// pio_sm_put_blocking(LINKCABLE_PIO, LINKCABLE_SM, LINKCABLE_BITS - 1);
pio_enable_sm_mask_in_sync(LINKCABLE_PIO, (1u << LINKCABLE_SM));

if (onDataReceive) {
linkcable_irq_handler = onDataReceive;
pio_set_irq0_source_enabled(LINKCABLE_PIO, pis_interrupt0, true);
irq_set_exclusive_handler(PIO0_IRQ_0, linkcable_isr);
irq_set_enabled(PIO0_IRQ_0, true);
}
}
Loading

0 comments on commit 23c35da

Please sign in to comment.