diff --git a/src/Kconfig b/src/Kconfig index cc557fb77..915af2956 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -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 diff --git a/src/Makefile b/src/Makefile index 7881622b0..e89845549 100644 --- a/src/Makefile +++ b/src/Makefile @@ -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) diff --git a/src/ar100/Kconfig b/src/ar100/Kconfig index fc7743da8..bd3050833 100644 --- a/src/ar100/Kconfig +++ b/src/ar100/Kconfig @@ -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 diff --git a/src/ar100/Makefile b/src/ar100/Makefile index d1203a0e8..29693fe20 100644 --- a/src/ar100/Makefile +++ b/src/ar100/Makefile @@ -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 diff --git a/src/atsam/Kconfig b/src/atsam/Kconfig index aa802072e..7fac95f50 100644 --- a/src/atsam/Kconfig +++ b/src/atsam/Kconfig @@ -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 diff --git a/src/atsamd/Kconfig b/src/atsamd/Kconfig index e1062e534..19709ef39 100644 --- a/src/atsamd/Kconfig +++ b/src/atsamd/Kconfig @@ -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 diff --git a/src/avr/Kconfig b/src/avr/Kconfig index fd24852db..ac3ffa2ab 100644 --- a/src/avr/Kconfig +++ b/src/avr/Kconfig @@ -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 diff --git a/src/hc32f460/Kconfig b/src/hc32f460/Kconfig index e204bebf7..9de4a7fc6 100644 --- a/src/hc32f460/Kconfig +++ b/src/hc32f460/Kconfig @@ -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 diff --git a/src/i2ccmds.c b/src/i2ccmds.c index 099fe7753..377a9537d 100644 --- a/src/i2ccmds.c +++ b/src/i2ccmds.c @@ -5,6 +5,7 @@ // This file may be distributed under the terms of the GNU GPLv3 license. #include // 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); diff --git a/src/linux/Kconfig b/src/linux/Kconfig index edf575b08..661f3c302 100644 --- a/src/linux/Kconfig +++ b/src/linux/Kconfig @@ -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 diff --git a/src/lpc176x/Kconfig b/src/lpc176x/Kconfig index 79c3b3006..390a081f0 100644 --- a/src/lpc176x/Kconfig +++ b/src/lpc176x/Kconfig @@ -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 diff --git a/src/pru/Kconfig b/src/pru/Kconfig index 8956e6bcf..f2c2019a5 100644 --- a/src/pru/Kconfig +++ b/src/pru/Kconfig @@ -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 diff --git a/src/rp2040/Kconfig b/src/rp2040/Kconfig index ba6f00f80..59891649e 100644 --- a/src/rp2040/Kconfig +++ b/src/rp2040/Kconfig @@ -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 diff --git a/src/spicmds.c b/src/spicmds.c index 2c3f3ed60..8ea915d9b 100644 --- a/src/spicmds.c +++ b/src/spicmds.c @@ -5,7 +5,7 @@ // This file may be distributed under the terms of the GNU GPLv3 license. #include // 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); diff --git a/src/stm32/Kconfig b/src/stm32/Kconfig index 21e78f533..e39611764 100644 --- a/src/stm32/Kconfig +++ b/src/stm32/Kconfig @@ -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 diff --git a/test/configs/ar100.config b/test/configs/ar100.config index 5abf7bf6e..a717fe3d0 100644 --- a/test/configs/ar100.config +++ b/test/configs/ar100.config @@ -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 diff --git a/test/configs/pru.config b/test/configs/pru.config index eee1a4674..265fbb53c 100644 --- a/test/configs/pru.config +++ b/test/configs/pru.config @@ -1,2 +1,4 @@ # Base config file for the Beaglebone PRU CONFIG_MACH_PRU=y +CONFIG_WANT_GPIO_BITBANGING=n +CONFIG_WANT_DISPLAYS=n diff --git a/test/configs/stm32f031.config b/test/configs/stm32f031.config index 719c6563e..aa9c282be 100644 --- a/test/configs/stm32f031.config +++ b/test/configs/stm32f031.config @@ -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