hardware button support
This commit is contained in:
@@ -57,6 +57,8 @@ add_executable(basic1
|
|||||||
lib/fatfs/source/ff.c
|
lib/fatfs/source/ff.c
|
||||||
lib/fatfs/source/ffsystem.c
|
lib/fatfs/source/ffsystem.c
|
||||||
lib/fatfs/source/ffunicode.c
|
lib/fatfs/source/ffunicode.c
|
||||||
|
lib/Pico_ePaper_Code/c/lib/Config/DEV_Config.c
|
||||||
|
lib/Pico_ePaper_Code/c/lib/e-Paper/EPD_4in2_V2.c
|
||||||
)
|
)
|
||||||
|
|
||||||
pico_set_program_name(basic1 "basic1")
|
pico_set_program_name(basic1 "basic1")
|
||||||
@@ -78,6 +80,8 @@ target_include_directories(basic1 PRIVATE
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/lib/ft6336u
|
${CMAKE_CURRENT_LIST_DIR}/lib/ft6336u
|
||||||
${CMAKE_CURRENT_LIST_DIR}/lib/sd_card
|
${CMAKE_CURRENT_LIST_DIR}/lib/sd_card
|
||||||
${CMAKE_CURRENT_LIST_DIR}/display
|
${CMAKE_CURRENT_LIST_DIR}/display
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/lib/Pico_ePaper_Code/c/lib/Config
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/lib/Pico_ePaper_Code/c/lib/e-Paper
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add any user requested libraries
|
# Add any user requested libraries
|
||||||
|
|||||||
101
basic1.cpp
101
basic1.cpp
@@ -17,6 +17,7 @@
|
|||||||
#include "display/low_level_render.h"
|
#include "display/low_level_render.h"
|
||||||
#include "display/low_level_gui.h"
|
#include "display/low_level_gui.h"
|
||||||
#include "display/low_level_display.h"
|
#include "display/low_level_display.h"
|
||||||
|
#include "display/low_level_display_epaper.h"
|
||||||
#include "display/low_level_touch.h"
|
#include "display/low_level_touch.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -30,6 +31,12 @@ volatile bool touch_interrupt_flag = false;
|
|||||||
volatile bool touch_event_down = false;
|
volatile bool touch_event_down = false;
|
||||||
LowLevelTouch* touch = nullptr;
|
LowLevelTouch* touch = nullptr;
|
||||||
|
|
||||||
|
// Button interrupt handling
|
||||||
|
#ifdef BUTTON_KEY0_PIN
|
||||||
|
volatile bool button_key0_pressed = false;
|
||||||
|
volatile bool button_key1_pressed = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Touch interrupt callback handler
|
* @brief Touch interrupt callback handler
|
||||||
*
|
*
|
||||||
@@ -86,6 +93,35 @@ void touch_interrupt_handler(uint gpio, uint32_t events) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BUTTON_KEY0_PIN
|
||||||
|
/**
|
||||||
|
* @brief Button interrupt callback handler
|
||||||
|
*
|
||||||
|
* Called automatically by hardware when button pins change state.
|
||||||
|
* Buttons are active LOW (pressed = 0, released = 1) with pull-ups.
|
||||||
|
*
|
||||||
|
* This runs in interrupt context, so keep it fast - just set flags.
|
||||||
|
*
|
||||||
|
* @param gpio GPIO pin number that triggered the interrupt
|
||||||
|
* @param events Event mask (GPIO_IRQ_EDGE_FALL and/or GPIO_IRQ_EDGE_RISE)
|
||||||
|
*/
|
||||||
|
void button_interrupt_handler(uint gpio, uint32_t events) {
|
||||||
|
// Only respond to falling edge (button press)
|
||||||
|
if (events & GPIO_IRQ_EDGE_FALL) {
|
||||||
|
if (gpio == BUTTON_KEY0_PIN) {
|
||||||
|
button_key0_pressed = true;
|
||||||
|
printf("Button KEY0 pressed\n");
|
||||||
|
}
|
||||||
|
#ifdef BUTTON_KEY1_PIN
|
||||||
|
else if (gpio == BUTTON_KEY1_PIN) {
|
||||||
|
button_key1_pressed = true;
|
||||||
|
printf("Button KEY1 pressed\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Screen dimensions and configuration from board_config.h
|
// Screen dimensions and configuration from board_config.h
|
||||||
const int V_WIDTH = DISPLAY_WIDTH;
|
const int V_WIDTH = DISPLAY_WIDTH;
|
||||||
const int V_HEIGHT = DISPLAY_HEIGHT;
|
const int V_HEIGHT = DISPLAY_HEIGHT;
|
||||||
@@ -139,6 +175,20 @@ int main()
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do a full refresh with white screen first (removes ghosting on e-paper)
|
||||||
|
printf("Performing initial full refresh to white...\n");
|
||||||
|
display->clear(true); // Clear to white
|
||||||
|
|
||||||
|
// For e-paper, do a full refresh to ensure clean display
|
||||||
|
if (display->get_type() == DISPLAY_TYPE_EPAPER) {
|
||||||
|
LowLevelDisplayEPaper* epaper = static_cast<LowLevelDisplayEPaper*>(display);
|
||||||
|
epaper->full_refresh(); // Full refresh removes ghosting
|
||||||
|
printf("Full refresh complete\n");
|
||||||
|
} else {
|
||||||
|
refresh_screen(bit_buffer, display); // For TFT, just refresh normally
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now clear to black for drawing
|
||||||
display->clear(false); // Clear to black
|
display->clear(false); // Clear to black
|
||||||
|
|
||||||
LowLevelRenderer renderer(bit_buffer, V_WIDTH, V_HEIGHT);
|
LowLevelRenderer renderer(bit_buffer, V_WIDTH, V_HEIGHT);
|
||||||
@@ -173,6 +223,36 @@ int main()
|
|||||||
printf("Touch initialization failed or not configured\n");
|
printf("Touch initialization failed or not configured\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BUTTON_KEY0_PIN
|
||||||
|
// Initialize hardware buttons (e-ink board only)
|
||||||
|
printf("\nInitializing hardware buttons...\n");
|
||||||
|
|
||||||
|
// Initialize KEY0 button
|
||||||
|
gpio_init(BUTTON_KEY0_PIN);
|
||||||
|
gpio_set_dir(BUTTON_KEY0_PIN, GPIO_IN);
|
||||||
|
gpio_pull_up(BUTTON_KEY0_PIN); // Active LOW with pull-up
|
||||||
|
printf(" KEY0 initialized on GP%d (active LOW)\n", BUTTON_KEY0_PIN);
|
||||||
|
|
||||||
|
#ifdef BUTTON_KEY1_PIN
|
||||||
|
// Initialize KEY1 button
|
||||||
|
gpio_init(BUTTON_KEY1_PIN);
|
||||||
|
gpio_set_dir(BUTTON_KEY1_PIN, GPIO_IN);
|
||||||
|
gpio_pull_up(BUTTON_KEY1_PIN); // Active LOW with pull-up
|
||||||
|
printf(" KEY1 initialized on GP%d (active LOW)\n", BUTTON_KEY1_PIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Enable interrupts on falling edge (button press)
|
||||||
|
gpio_set_irq_enabled_with_callback(BUTTON_KEY0_PIN,
|
||||||
|
GPIO_IRQ_EDGE_FALL,
|
||||||
|
true,
|
||||||
|
&button_interrupt_handler);
|
||||||
|
#ifdef BUTTON_KEY1_PIN
|
||||||
|
gpio_set_irq_enabled(BUTTON_KEY1_PIN, GPIO_IRQ_EDGE_FALL, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf("Button interrupts enabled (falling edge = press)\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
// Test SD card and FatFS
|
// Test SD card and FatFS
|
||||||
// if (sd_card_init_with_board_config()) {
|
// if (sd_card_init_with_board_config()) {
|
||||||
// sd_card_test_fatfs();
|
// sd_card_test_fatfs();
|
||||||
@@ -203,6 +283,27 @@ int main()
|
|||||||
// Te(); // Wait For Event - CPU sleeps until interrupt or evenurs
|
// Te(); // Wait For Event - CPU sleeps until interrupt or evenurs
|
||||||
__wfi(); // Wait For Interrupt - CPU sleeps until any interrupt
|
__wfi(); // Wait For Interrupt - CPU sleeps until any interrupt
|
||||||
|
|
||||||
|
#ifdef BUTTON_KEY0_PIN
|
||||||
|
// Handle button presses with debouncing
|
||||||
|
if (button_key0_pressed) {
|
||||||
|
button_key0_pressed = false;
|
||||||
|
sleep_ms(50); // Debounce delay
|
||||||
|
if (gpio_get(BUTTON_KEY0_PIN) == 0) { // Verify button still pressed
|
||||||
|
printf("Button KEY0 action triggered\n");
|
||||||
|
// TODO: Add your KEY0 action here (e.g., focus next widget)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (button_key1_pressed) {
|
||||||
|
button_key1_pressed = false;
|
||||||
|
sleep_ms(50); // Debounce delay
|
||||||
|
if (gpio_get(BUTTON_KEY1_PIN) == 0) { // Verify button still pressed
|
||||||
|
printf("Button KEY1 action triggered\n");
|
||||||
|
// TODO: Add your KEY1 action here (e.g., activate focused widget)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Check if our touch interrupt flag was set
|
// Check if our touch interrupt flag was set
|
||||||
if (!touch_interrupt_flag) {
|
if (!touch_interrupt_flag) {
|
||||||
continue; // Woken by different interrupt, go back to sleep
|
continue; // Woken by different interrupt, go back to sleep
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
// ---- SELECT YOUR BOARD HERE ----
|
// ---- SELECT YOUR BOARD HERE ----
|
||||||
#define BOARD_FEATHER_TFT // Feather RP2350 + 4.0" TFT ST7796
|
// #define BOARD_FEATHER_TFT // Feather RP2350 + 4.0" TFT ST7796
|
||||||
// #define BOARD_PICO2_TFT // Pico 2 + 4.0" TFT ST7796
|
// #define BOARD_PICO2_TFT // Pico 2 + 4.0" TFT ST7796
|
||||||
// #define BOARD_PICO2_EINK // Pico 2 + E-Ink Display
|
#define BOARD_PICO2_EINK // Pico 2 + E-Ink Display
|
||||||
// --------------------------------
|
// --------------------------------
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|||||||
@@ -20,33 +20,38 @@
|
|||||||
#define TOUCH_INVERT_X false
|
#define TOUCH_INVERT_X false
|
||||||
#define TOUCH_INVERT_Y false
|
#define TOUCH_INVERT_Y false
|
||||||
|
|
||||||
// SPI pins for E-Ink display (using SPI0)
|
// SPI pins for E-Ink display (using SPI1)
|
||||||
#define DISPLAY_SPI_PORT spi0
|
#define DISPLAY_SPI_PORT spi1
|
||||||
#define DISPLAY_SCK_PIN 2 // GP2
|
#define DISPLAY_SCK_PIN 10 // GP10
|
||||||
#define DISPLAY_MOSI_PIN 3 // GP3
|
#define DISPLAY_MOSI_PIN 11 // GP11
|
||||||
#define DISPLAY_MISO_PIN 4 // GP4 (often not used by e-paper)
|
#define DISPLAY_MISO_PIN 12 // GP12 (often not used by e-paper)
|
||||||
#define DISPLAY_CS_PIN 5 // GP5
|
#define DISPLAY_CS_PIN 9 // GP9
|
||||||
#define DISPLAY_DC_PIN 6 // GP6 (Data/Command)
|
#define DISPLAY_DC_PIN 8 // GP8 (Data/Command)
|
||||||
#define DISPLAY_RST_PIN 7 // GP7 (Reset)
|
#define DISPLAY_RST_PIN 12 // GP12 (Reset)
|
||||||
#define DISPLAY_BL_PIN 8 // GP8 - Not used for e-ink, but needs valid pin number
|
#define DISPLAY_BL_PIN 8 // GP8 - Not used for e-ink, but needs valid pin number
|
||||||
#define DISPLAY_BUSY_PIN 9 // GP9 - E-paper BUSY pin (critical!)
|
#define DISPLAY_BUSY_PIN 13 // GP13 - E-paper BUSY pin (critical!)
|
||||||
|
|
||||||
// I2C pins for touch (if using touch-enabled e-ink)
|
// I2C pins for touch (not used - this board has no touch)
|
||||||
|
// Dummy values to satisfy compilation, but TOUCH_TYPE_NONE means they won't be used
|
||||||
#define TOUCH_I2C_PORT i2c0
|
#define TOUCH_I2C_PORT i2c0
|
||||||
#define TOUCH_SDA_PIN 12 // GP12
|
#define TOUCH_SDA_PIN 12 // GP12
|
||||||
#define TOUCH_SCL_PIN 13 // GP13
|
#define TOUCH_SCL_PIN 13 // GP13
|
||||||
#define TOUCH_INT_PIN 14 // GP14
|
#define TOUCH_INT_PIN 14 // GP14
|
||||||
#define TOUCH_RST_PIN 15 // GP15
|
#define TOUCH_RST_PIN 15 // GP15
|
||||||
|
|
||||||
// SD card pins (separate SPI1) - optional
|
// SD card pins (not used - this board has no SD card slot)
|
||||||
|
// Dummy values to satisfy compilation, but won't be initialized
|
||||||
#define SD_SPI_PORT spi1
|
#define SD_SPI_PORT spi1
|
||||||
#define SD_CS_PIN 17 // GP17
|
#define SD_CS_PIN 22 // GP22 - dummy value
|
||||||
#define SD_MISO_PIN 16 // GP16
|
#define SD_MISO_PIN 16 // GP16
|
||||||
#define SD_MOSI_PIN 19 // GP19
|
#define SD_MOSI_PIN 19 // GP19
|
||||||
#define SD_SCK_PIN 18 // GP18
|
#define SD_SCK_PIN 18 // GP18
|
||||||
|
|
||||||
|
// Button pins (Waveshare e-Paper has 2 user buttons)
|
||||||
|
#define BUTTON_KEY0_PIN 15 // GP15 - User key 0
|
||||||
|
#define BUTTON_KEY1_PIN 17 // GP17 - User key 1
|
||||||
|
|
||||||
// Common configuration
|
// Common configuration
|
||||||
#define SPI_BAUDRATE (4 * 1000 * 1000) // 4 MHz for e-paper (slower than TFT)
|
#define SPI_BAUDRATE (4 * 1000 * 1000) // 4 MHz for e-paper (slower than TFT)
|
||||||
#define I2C_BAUDRATE (400 * 1000) // 400 kHz for touch
|
|
||||||
|
|
||||||
#endif // BOARD_PICO2_EINK_H
|
#endif // BOARD_PICO2_EINK_H
|
||||||
|
|||||||
@@ -3,8 +3,13 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
// Note: This is a placeholder implementation
|
// Waveshare 4.2" e-Paper monochrome driver (supports partial refresh)
|
||||||
// You'll need to add the actual e-paper driver code to lib/epaper/
|
extern "C" {
|
||||||
|
#include "EPD_4in2_V2.h"
|
||||||
|
#include "DEV_Config.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: EPD_4IN2_V2 is monochrome (black/white) and supports fast partial refresh
|
||||||
|
|
||||||
LowLevelDisplayEPaper::LowLevelDisplayEPaper(const epaper_config* cfg, int w, int h)
|
LowLevelDisplayEPaper::LowLevelDisplayEPaper(const epaper_config* cfg, int w, int h)
|
||||||
: config(cfg), width(w), height(h), initialized(false), framebuffer(nullptr), dirty(false) {
|
: config(cfg), width(w), height(h), initialized(false), framebuffer(nullptr), dirty(false) {
|
||||||
@@ -33,11 +38,15 @@ bool LowLevelDisplayEPaper::init() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Implement e-paper initialization
|
printf("Initializing Waveshare 4.2\" e-Paper display (%dx%d)...\n", width, height);
|
||||||
// epaper_init(config, width, height);
|
|
||||||
printf("E-paper display initialized: %dx%d (stub)\n", width, height);
|
// Initialize Waveshare driver (handles GPIO and SPI setup)
|
||||||
|
DEV_Module_Init();
|
||||||
|
EPD_4IN2_V2_Init();
|
||||||
|
|
||||||
|
printf("E-paper display initialized successfully (partial refresh enabled)\n");
|
||||||
initialized = true;
|
initialized = true;
|
||||||
return false; // Return false until actual driver is implemented
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LowLevelDisplayEPaper::clear(bool white) {
|
void LowLevelDisplayEPaper::clear(bool white) {
|
||||||
@@ -79,19 +88,56 @@ void LowLevelDisplayEPaper::refresh() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Implement actual e-paper refresh
|
if (!initialized) {
|
||||||
// epaper_update(framebuffer);
|
printf("E-paper not initialized, cannot refresh\n");
|
||||||
printf("E-paper refresh (stub)\n");
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Refreshing e-paper display (partial refresh)...\n");
|
||||||
|
|
||||||
|
// Use partial refresh for fast updates (~1 second instead of ~15 seconds)
|
||||||
|
// Partial refresh updates only the changed pixels
|
||||||
|
EPD_4IN2_V2_PartialDisplay(framebuffer, 0, 0, EPD_4IN2_V2_WIDTH, EPD_4IN2_V2_HEIGHT);
|
||||||
|
|
||||||
|
printf("E-paper partial refresh complete\n");
|
||||||
dirty = false;
|
dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LowLevelDisplayEPaper::clear_display() {
|
void LowLevelDisplayEPaper::clear_display() {
|
||||||
clear(true); // Fill with white
|
if (!initialized) {
|
||||||
refresh();
|
printf("E-paper not initialized, cannot clear\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Clearing e-paper display...\n");
|
||||||
|
EPD_4IN2_V2_Clear();
|
||||||
|
|
||||||
|
// Also clear framebuffer
|
||||||
|
clear(true);
|
||||||
|
dirty = false; // Already refreshed by EPD_4IN2_V2_Clear
|
||||||
|
}
|
||||||
|
|
||||||
|
void LowLevelDisplayEPaper::full_refresh() {
|
||||||
|
if (!framebuffer || !initialized) {
|
||||||
|
printf("E-paper not initialized or no framebuffer\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Performing full refresh (removes ghosting, ~15 seconds)...\n");
|
||||||
|
|
||||||
|
// Full refresh uses EPD_4IN2_V2_Display for complete screen update
|
||||||
|
// This is slower but removes any ghosting from partial refreshes
|
||||||
|
EPD_4IN2_V2_Display(framebuffer);
|
||||||
|
|
||||||
|
printf("Full refresh complete\n");
|
||||||
|
dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LowLevelDisplayEPaper::sleep() {
|
void LowLevelDisplayEPaper::sleep() {
|
||||||
// TODO: Implement e-paper sleep mode
|
if (!initialized) {
|
||||||
// epaper_sleep();
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Putting e-paper display to sleep...\n");
|
||||||
|
EPD_4IN2_V2_Sleep();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ public:
|
|||||||
bool is_color() const override { return false; } // Most e-paper is monochrome
|
bool is_color() const override { return false; } // Most e-paper is monochrome
|
||||||
|
|
||||||
// E-paper specific
|
// E-paper specific
|
||||||
void clear_display();
|
void clear_display(); // Full clear with refresh
|
||||||
|
void full_refresh(); // Force full screen refresh (slower but removes ghosting)
|
||||||
void sleep(); // Put display in low power mode
|
void sleep(); // Put display in low power mode
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -28,8 +28,10 @@
|
|||||||
#
|
#
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
#include "DEV_Config.h"
|
#include "DEV_Config.h"
|
||||||
|
#include "board_config.h" // Use our board configuration
|
||||||
|
|
||||||
#define SPI_PORT spi1
|
// Use SPI port from board config
|
||||||
|
#define SPI_PORT DISPLAY_SPI_PORT
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GPIO
|
* GPIO
|
||||||
@@ -90,14 +92,16 @@ void DEV_Delay_ms(UDOUBLE xms)
|
|||||||
|
|
||||||
void DEV_GPIO_Init(void)
|
void DEV_GPIO_Init(void)
|
||||||
{
|
{
|
||||||
|
// Use pin definitions from board_config.h
|
||||||
|
EPD_RST_PIN = DISPLAY_RST_PIN;
|
||||||
|
EPD_DC_PIN = DISPLAY_DC_PIN;
|
||||||
|
EPD_BUSY_PIN = DISPLAY_BUSY_PIN;
|
||||||
|
EPD_CS_PIN = DISPLAY_CS_PIN;
|
||||||
|
EPD_CLK_PIN = DISPLAY_SCK_PIN;
|
||||||
|
EPD_MOSI_PIN = DISPLAY_MOSI_PIN;
|
||||||
|
|
||||||
EPD_RST_PIN = 12;
|
printf("E-Paper pins: RST=%d, DC=%d, CS=%d, BUSY=%d, CLK=%d, MOSI=%d\r\n",
|
||||||
EPD_DC_PIN = 8;
|
EPD_RST_PIN, EPD_DC_PIN, EPD_CS_PIN, EPD_BUSY_PIN, EPD_CLK_PIN, EPD_MOSI_PIN);
|
||||||
EPD_BUSY_PIN = 13;
|
|
||||||
|
|
||||||
EPD_CS_PIN = 9;
|
|
||||||
EPD_CLK_PIN = 10;
|
|
||||||
EPD_MOSI_PIN = 11;
|
|
||||||
|
|
||||||
DEV_GPIO_Mode(EPD_RST_PIN, 1);
|
DEV_GPIO_Mode(EPD_RST_PIN, 1);
|
||||||
DEV_GPIO_Mode(EPD_DC_PIN, 1);
|
DEV_GPIO_Mode(EPD_DC_PIN, 1);
|
||||||
@@ -118,9 +122,12 @@ UBYTE DEV_Module_Init(void)
|
|||||||
// GPIO Config
|
// GPIO Config
|
||||||
DEV_GPIO_Init();
|
DEV_GPIO_Init();
|
||||||
|
|
||||||
|
// Initialize SPI at 4MHz
|
||||||
spi_init(SPI_PORT, 4000 * 1000);
|
spi_init(SPI_PORT, 4000 * 1000);
|
||||||
gpio_set_function(EPD_CLK_PIN, GPIO_OUT);
|
|
||||||
gpio_set_function(EPD_MOSI_PIN, GPIO_OUT);
|
// Configure SPI pins to use hardware SPI function
|
||||||
|
gpio_set_function(EPD_CLK_PIN, GPIO_FUNC_SPI);
|
||||||
|
gpio_set_function(EPD_MOSI_PIN, GPIO_FUNC_SPI);
|
||||||
|
|
||||||
printf("DEV_Module_Init OK \r\n");
|
printf("DEV_Module_Init OK \r\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user