Kconfig: Support selecting optional features on chips with small flash size

Add a new HAVE_LIMITED_CODE_SIZE symbol that enables a menu to select
optional features.  This symbol is enabled on chips with small build
sizes.

Replace the HAVE_GPIO_BITBANGING with four new symbols:
WANT_GPIO_BITBANGING, WANT_DISPLAYS, WANT_SENSORS, WANT_SOFTWARE_SPI,
and WANT_SOFTWARE_I2C.  This allows users a little more flexibility
when selecting features they need.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2023-06-08 11:20:59 -04:00
parent 645a1b8364
commit 15d302901f
18 changed files with 77 additions and 36 deletions

View File

@ -87,6 +87,46 @@ config USB_SERIAL_NUMBER
string "USB serial number" if !USB_SERIAL_NUMBER_CHIPID
endmenu
# Optional features that can be disabled (for devices with small flash sizes)
config WANT_GPIO_BITBANGING
bool
depends on HAVE_GPIO
default y
config WANT_DISPLAYS
bool
depends on HAVE_GPIO
default y
config WANT_SENSORS
bool
depends on HAVE_GPIO_I2C || HAVE_GPIO_SPI
default y
config WANT_SOFTWARE_I2C
bool
depends on HAVE_GPIO && HAVE_GPIO_I2C
default y
config WANT_SOFTWARE_SPI
bool
depends on HAVE_GPIO && HAVE_GPIO_SPI
default y
menu "Optional features (to reduce code size)"
depends on HAVE_LIMITED_CODE_SIZE
config WANT_GPIO_BITBANGING
bool "Support GPIO \"bit-banging\" devices"
depends on HAVE_GPIO
config WANT_DISPLAYS
bool "Support LCD devices"
depends on HAVE_GPIO
config WANT_SENSORS
bool "Support external sensor devices"
depends on HAVE_GPIO_I2C || HAVE_GPIO_SPI
config WANT_SOFTWARE_I2C
bool "Support software based I2C \"bit-banging\""
depends on HAVE_GPIO && HAVE_GPIO_I2C
config WANT_SOFTWARE_SPI
bool "Support software based SPI \"bit-banging\""
depends on HAVE_GPIO && HAVE_GPIO_SPI
endmenu
# Generic configuration options for CANbus
config CANSERIAL
bool
@ -124,8 +164,6 @@ config HAVE_GPIO_I2C
bool
config HAVE_GPIO_HARD_PWM
bool
config HAVE_GPIO_BITBANGING
bool
config HAVE_STRICT_TIMING
bool
config HAVE_CHIPID
@ -134,6 +172,8 @@ config HAVE_STEPPER_BOTH_EDGE
bool
config HAVE_BOOTLOADER_REQUEST
bool
config HAVE_LIMITED_CODE_SIZE
bool
config INLINE_STEPPER_HACK
# Enables gcc to inline stepper_event() into the main timer irq handler

View File

@ -4,11 +4,17 @@ src-y += sched.c command.c basecmd.c debugcmds.c
src-$(CONFIG_HAVE_GPIO) += initial_pins.c gpiocmds.c stepper.c endstop.c \
trsync.c
src-$(CONFIG_HAVE_GPIO_ADC) += adccmds.c
src-$(CONFIG_HAVE_GPIO_SPI) += spicmds.c thermocouple.c
src-$(CONFIG_HAVE_GPIO_SPI) += spicmds.c
src-$(CONFIG_HAVE_GPIO_SDIO) += sdiocmds.c
src-$(CONFIG_HAVE_GPIO_I2C) += i2ccmds.c
src-$(CONFIG_HAVE_GPIO_HARD_PWM) += pwmcmds.c
bb-src-$(CONFIG_HAVE_GPIO_SPI) := spi_software.c sensor_adxl345.c sensor_angle.c
bb-src-$(CONFIG_HAVE_GPIO_I2C) += i2c_software.c sensor_mpu9250.c
src-$(CONFIG_HAVE_GPIO_BITBANGING) += $(bb-src-y) lcd_st7920.c lcd_hd44780.c \
buttons.c tmcuart.c neopixel.c pulse_counter.c
src-$(CONFIG_WANT_GPIO_BITBANGING) += buttons.c tmcuart.c neopixel.c \
pulse_counter.c
src-$(CONFIG_WANT_DISPLAYS) += lcd_st7920.c lcd_hd44780.c
src-$(CONFIG_WANT_SOFTWARE_SPI) += spi_software.c
src-$(CONFIG_WANT_SOFTWARE_I2C) += i2c_software.c
sensors-src-$(CONFIG_HAVE_GPIO_SPI) := thermocouple.c sensor_adxl345.c \
sensor_angle.c
sensors-src-$(CONFIG_HAVE_GPIO_I2C) += sensor_mpu9250.c
src-$(CONFIG_WANT_SENSORS) += $(sensors-src-y)

View File

@ -7,8 +7,8 @@ config AR100_SELECT
default y
select HAVE_GPIO
select HAVE_GPIO_SPI
select HAVE_GPIO_BITBANGING
select HAVE_STEPPER_BOTH_EDGE
select HAVE_LIMITED_CODE_SIZE
config BOARD_DIRECTORY
string

View File

@ -19,12 +19,6 @@ src-y += ar100/main.c ar100/gpio.c ar100/serial.c
src-y += ar100/util.c ar100/timer.c
src-y += generic/crc16_ccitt.c generic/timer_irq.c
# Remove files that are not needed to save space
src-y := $(filter-out lcd_hd44780.c,$(src-y))
src-y := $(filter-out lcd_st7920.c,$(src-y))
src-y := $(filter-out sensor_angle.c,$(src-y))
src-y := $(filter-out thermocouple.c,$(src-y))
OBJS_klipper.elf += $(OUT)lib/ar100/start.o
OBJS_klipper.elf += $(OUT)lib/ar100/runtime.o

View File

@ -10,7 +10,6 @@ config ATSAM_SELECT
select HAVE_GPIO_I2C
select HAVE_GPIO_SPI
select HAVE_GPIO_HARD_PWM if !MACH_SAME70
select HAVE_GPIO_BITBANGING
select HAVE_STRICT_TIMING
select HAVE_CHIPID
select HAVE_STEPPER_BOTH_EDGE

View File

@ -10,7 +10,6 @@ config ATSAMD_SELECT
select HAVE_GPIO_I2C
select HAVE_GPIO_SPI
select HAVE_GPIO_HARD_PWM if MACH_SAMX2
select HAVE_GPIO_BITBANGING
select HAVE_STRICT_TIMING
select HAVE_CHIPID
select HAVE_STEPPER_BOTH_EDGE

View File

@ -10,8 +10,8 @@ config AVR_SELECT
select HAVE_GPIO_SPI
select HAVE_GPIO_I2C
select HAVE_GPIO_HARD_PWM
select HAVE_GPIO_BITBANGING if !MACH_atmega168
select HAVE_STRICT_TIMING
select HAVE_LIMITED_CODE_SIZE if MACH_atmega168
config BOARD_DIRECTORY
string

View File

@ -7,7 +7,6 @@ config HC32F460_SELECT
default y
select HAVE_GPIO
select HAVE_GPIO_ADC
select HAVE_GPIO_BITBANGING
select HAVE_STRICT_TIMING
select HAVE_GPIO_HARD_PWM
select HAVE_STEPPER_BOTH_EDGE

View File

@ -5,6 +5,7 @@
// This file may be distributed under the terms of the GNU GPLv3 license.
#include <string.h> // memcpy
#include "autoconf.h" // CONFIG_WANT_SOFTWARE_I2C
#include "basecmd.h" //oid_alloc
#include "command.h" //sendf
#include "sched.h" //DECL_COMMAND
@ -56,7 +57,7 @@ command_i2c_write(uint32_t *args)
uint8_t data_len = args[1];
uint8_t *data = command_decode_ptr(args[2]);
uint_fast8_t flags = i2c->flags;
if (flags & IF_SOFTWARE)
if (CONFIG_WANT_SOFTWARE_I2C && flags & IF_SOFTWARE)
i2c_software_write(i2c->i2c_software, data_len, data);
else
i2c_write(i2c->i2c_config, data_len, data);
@ -73,12 +74,10 @@ command_i2c_read(uint32_t * args)
uint8_t data_len = args[3];
uint8_t data[data_len];
uint_fast8_t flags = i2c->flags;
if (flags & IF_SOFTWARE)
i2c_software_read(
i2c->i2c_software, reg_len, reg, data_len, data);
if (CONFIG_WANT_SOFTWARE_I2C && flags & IF_SOFTWARE)
i2c_software_read(i2c->i2c_software, reg_len, reg, data_len, data);
else
i2c_read(
i2c->i2c_config, reg_len, reg, data_len, data);
i2c_read(i2c->i2c_config, reg_len, reg, data_len, data);
sendf("i2c_read_response oid=%c response=%*s", oid, data_len, data);
}
DECL_COMMAND(command_i2c_read, "i2c_read oid=%c reg=%*s read_len=%u");
@ -98,7 +97,7 @@ command_i2c_modify_bits(uint32_t *args)
uint8_t receive_data[reg_len + data_len];
uint_fast8_t flags = i2c->flags;
memcpy(receive_data, reg, reg_len);
if (flags & IF_SOFTWARE)
if (CONFIG_WANT_SOFTWARE_I2C && flags & IF_SOFTWARE)
i2c_software_read(
i2c->i2c_software, reg_len, reg, data_len, receive_data + reg_len);
else
@ -108,7 +107,7 @@ command_i2c_modify_bits(uint32_t *args)
receive_data[reg_len + i] &= ~clear_set[i];
receive_data[reg_len + i] |= clear_set[data_len + i];
}
if (flags & IF_SOFTWARE)
if (CONFIG_WANT_SOFTWARE_I2C && flags & IF_SOFTWARE)
i2c_software_write(i2c->i2c_software, reg_len + data_len, receive_data);
else
i2c_write(i2c->i2c_config, reg_len + data_len, receive_data);

View File

@ -6,12 +6,11 @@ if MACH_LINUX
config LINUX_SELECT
bool
default y
select HAVE_GPIO
select HAVE_GPIO_ADC
select HAVE_GPIO_SPI
select HAVE_GPIO_HARD_PWM
select HAVE_GPIO_I2C
select HAVE_GPIO_BITBANGING
select HAVE_GPIO
select HAVE_GPIO_HARD_PWM
config BOARD_DIRECTORY
string

View File

@ -9,10 +9,9 @@ config LPC_SELECT
select HAVE_GPIO_ADC
select HAVE_GPIO_I2C
select HAVE_GPIO_SPI
select HAVE_GPIO_BITBANGING
select HAVE_GPIO_HARD_PWM
select HAVE_STRICT_TIMING
select HAVE_CHIPID
select HAVE_GPIO_HARD_PWM
select HAVE_STEPPER_BOTH_EDGE
select HAVE_BOOTLOADER_REQUEST

View File

@ -8,6 +8,7 @@ config PRU_SELECT
select HAVE_GPIO
#select HAVE_GPIO_ADC
select HAVE_STRICT_TIMING
select HAVE_LIMITED_CODE_SIZE
config BOARD_DIRECTORY
string

View File

@ -9,7 +9,6 @@ config RP2040_SELECT
select HAVE_GPIO_ADC
select HAVE_GPIO_SPI
select HAVE_GPIO_I2C
select HAVE_GPIO_BITBANGING
select HAVE_STRICT_TIMING
select HAVE_CHIPID
select HAVE_GPIO_HARD_PWM

View File

@ -5,7 +5,7 @@
// This file may be distributed under the terms of the GNU GPLv3 license.
#include <string.h> // memcpy
#include "autoconf.h" // CONFIG_HAVE_GPIO_BITBANGING
#include "autoconf.h" // CONFIG_WANT_SOFTWARE_SPI
#include "board/gpio.h" // gpio_out_write
#include "basecmd.h" // oid_alloc
#include "command.h" // DECL_COMMAND
@ -92,7 +92,7 @@ spidev_transfer(struct spidev_s *spi, uint8_t receive_data
// Not yet initialized
return;
if (CONFIG_HAVE_GPIO_BITBANGING && flags & SF_SOFTWARE)
if (CONFIG_WANT_SOFTWARE_SPI && flags & SF_SOFTWARE)
spi_software_prepare(spi->spi_software);
else
spi_prepare(spi->spi_config);
@ -100,7 +100,7 @@ spidev_transfer(struct spidev_s *spi, uint8_t receive_data
if (flags & SF_HAVE_PIN)
gpio_out_write(spi->pin, !!(flags & SF_CS_ACTIVE_HIGH));
if (CONFIG_HAVE_GPIO_BITBANGING && flags & SF_SOFTWARE)
if (CONFIG_WANT_SOFTWARE_SPI && flags & SF_SOFTWARE)
spi_software_transfer(spi->spi_software, receive_data, data_len, data);
else
spi_transfer(spi->spi_config, receive_data, data_len, data);

View File

@ -11,11 +11,11 @@ config STM32_SELECT
select HAVE_GPIO_SPI if !MACH_STM32F031
select HAVE_GPIO_SDIO if MACH_STM32F4
select HAVE_GPIO_HARD_PWM if MACH_STM32F1 || MACH_STM32F4 || MACH_STM32F7 || MACH_STM32G0 || MACH_STM32H7
select HAVE_GPIO_BITBANGING if !MACH_STM32F031
select HAVE_STRICT_TIMING
select HAVE_CHIPID
select HAVE_STEPPER_BOTH_EDGE
select HAVE_BOOTLOADER_REQUEST
select HAVE_LIMITED_CODE_SIZE if MACH_STM32F031 || MACH_STM32F042
config BOARD_DIRECTORY
string

View File

@ -1,2 +1,5 @@
# Base config file for the ar100 CPU
CONFIG_MACH_AR100=y
CONFIG_WANT_DISPLAYS=n
CONFIG_WANT_SOFTWARE_I2C=n
CONFIG_WANT_SOFTWARE_SPI=n

View File

@ -1,2 +1,4 @@
# Base config file for the Beaglebone PRU
CONFIG_MACH_PRU=y
CONFIG_WANT_GPIO_BITBANGING=n
CONFIG_WANT_DISPLAYS=n

View File

@ -1,3 +1,5 @@
# Base config file for STM32F031 boards
CONFIG_MACH_STM32=y
CONFIG_MACH_STM32F031=y
CONFIG_WANT_GPIO_BITBANGING=n
CONFIG_WANT_DISPLAYS=n