diff --git a/litex/soc/software/bios/Makefile b/litex/soc/software/bios/Makefile index 0e288a43b..4ab4a7d56 100755 --- a/litex/soc/software/bios/Makefile +++ b/litex/soc/software/bios/Makefile @@ -17,6 +17,7 @@ OBJECTS = isr.o \ cmd_bios.o \ cmd_mem.o \ cmd_boot.o \ + cmd_i2c.o \ cmd_spiflash.o \ cmd_litedram.o \ cmd_liteeth.o \ diff --git a/litex/soc/software/bios/cmds/cmd_i2c.c b/litex/soc/software/bios/cmds/cmd_i2c.c new file mode 100644 index 000000000..6c53b76cc --- /dev/null +++ b/litex/soc/software/bios/cmds/cmd_i2c.c @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: BSD-Source-Code + +#include +#include +#include + +#include +#include + +#include "../command.h" +#include "../helpers.h" + + +/** + * Command "i2creset" + * + * Reset I2C line state in case a slave locks the line. + * + */ +#ifdef CSR_I2C_BASE +define_command(i2creset, i2c_reset, "Reset I2C line state", I2C_CMDS); +#endif + +/** + * Command "i2cwr" + * + * Write I2C slave memory using 7-bit slave address and 8-bit memory address. + * + */ +#ifdef CSR_I2C_BASE +static void i2cwr_handler(int nb_params, char **params) +{ + int i; + char *c; + unsigned char write_params[32]; // also indirectly limited by CMD_LINE_BUFFER_SIZE + + if (nb_params < 2) { + printf("i2cwr [, ...]"); + return; + } + + if (nb_params - 1 > sizeof(write_params)) { + printf("Max data length is %d", sizeof(write_params)); + return; + } + + for (i = 0; i < nb_params; ++i) { + write_params[i] = strtoul(params[i], &c, 0); + if (*c != 0) { + printf("Incorrect value of parameter %d", i); + return; + } + } + + if (!i2c_write(write_params[0], write_params[1], &write_params[2], nb_params - 2)) { + printf("Error during I2C write"); + return; + } +} +define_command(i2cwr, i2cwr_handler, "Write over I2C", I2C_CMDS); +#endif + +/** + * Command "i2crd" + * + * Read I2C slave memory using 7-bit slave address and 8-bit memory address. + * + */ +#ifdef CSR_I2C_BASE +static void i2crd_handler(int nb_params, char **params) +{ + char *c; + int len; + unsigned char slave_addr, addr; + unsigned char buf[256]; + bool send_stop = true; + + if (nb_params < 3) { + printf("i2crd []"); + return; + } + + slave_addr = strtoul(params[0], &c, 0); + if (*c != 0) { + printf("Incorrect slave address"); + return; + } + + addr = strtoul(params[1], &c, 0); + if (*c != 0) { + printf("Incorrect memory address"); + return; + } + + len = strtoul(params[2], &c, 0); + if (*c != 0) { + printf("Incorrect data length"); + return; + } + if (len > sizeof(buf)) { + printf("Max data count is %d", sizeof(buf)); + return; + } + + if (nb_params > 3) { + send_stop = strtoul(params[3], &c, 0) != 0; + if (*c != 0) { + printf("Incorrect send_stop value"); + return; + } + } + + if (!i2c_read(slave_addr, addr, buf, len, send_stop)) { + printf("Error during I2C read"); + return; + } + + dump_bytes((unsigned int *) buf, len, addr); +} +define_command(i2crd, i2crd_handler, "Read over I2C", I2C_CMDS); +#endif diff --git a/litex/soc/software/bios/cmds/cmd_litedram.c b/litex/soc/software/bios/cmds/cmd_litedram.c index 17d0bd17f..026ab882e 100644 --- a/litex/soc/software/bios/cmds/cmd_litedram.c +++ b/litex/soc/software/bios/cmds/cmd_litedram.c @@ -5,6 +5,7 @@ #include #include +#include #include "sdram.h" @@ -223,115 +224,6 @@ define_command(sdrlevel, sdrlevel, "Perform read/write leveling", LITEDRAM_CMDS) define_command(memtest, memtest, "Run a memory test", LITEDRAM_CMDS); #endif -/** - * Command "i2creset" - * - * Reset I2C line state in case a slave locks the line. - * - */ -#ifdef CSR_I2C_BASE -define_command(i2creset, i2c_reset, "Reset I2C line state", LITEDRAM_CMDS); -#endif - -/** - * Command "i2cwr" - * - * Write I2C slave memory using 7-bit slave address and 8-bit memory address. - * - */ -#ifdef CSR_I2C_BASE -static void i2cwr_handler(int nb_params, char **params) -{ - int i; - char *c; - unsigned char write_params[32]; // also indirectly limited by CMD_LINE_BUFFER_SIZE - - if (nb_params < 2) { - printf("i2cwr [, ...]"); - return; - } - - if (nb_params - 1 > sizeof(write_params)) { - printf("Max data length is %d", sizeof(write_params)); - return; - } - - for (i = 0; i < nb_params; ++i) { - write_params[i] = strtoul(params[i], &c, 0); - if (*c != 0) { - printf("Incorrect value of parameter %d", i); - return; - } - } - - if (!i2c_write(write_params[0], write_params[1], &write_params[2], nb_params - 2)) { - printf("Error during I2C write"); - return; - } -} -define_command(i2cwr, i2cwr_handler, "Write over I2C", LITEDRAM_CMDS); -#endif - -/** - * Command "i2crd" - * - * Read I2C slave memory using 7-bit slave address and 8-bit memory address. - * - */ -#ifdef CSR_I2C_BASE -static void i2crd_handler(int nb_params, char **params) -{ - char *c; - int len; - unsigned char slave_addr, addr; - unsigned char buf[256]; - bool send_stop = true; - - if (nb_params < 3) { - printf("i2crd []"); - return; - } - - slave_addr = strtoul(params[0], &c, 0); - if (*c != 0) { - printf("Incorrect slave address"); - return; - } - - addr = strtoul(params[1], &c, 0); - if (*c != 0) { - printf("Incorrect memory address"); - return; - } - - len = strtoul(params[2], &c, 0); - if (*c != 0) { - printf("Incorrect data length"); - return; - } - if (len > sizeof(buf)) { - printf("Max data count is %d", sizeof(buf)); - return; - } - - if (nb_params > 3) { - send_stop = strtoul(params[3], &c, 0) != 0; - if (*c != 0) { - printf("Incorrect send_stop value"); - return; - } - } - - if (!i2c_read(slave_addr, addr, buf, len, send_stop)) { - printf("Error during I2C read"); - return; - } - - dump_bytes((unsigned int *) buf, len, addr); -} -define_command(i2crd, i2crd_handler, "Read over I2C", LITEDRAM_CMDS); -#endif - /** * Command "spdread" * diff --git a/litex/soc/software/bios/command.h b/litex/soc/software/bios/command.h index 1640231ff..05a93e805 100644 --- a/litex/soc/software/bios/command.h +++ b/litex/soc/software/bios/command.h @@ -15,6 +15,7 @@ #define MEM_CMDS 3 #define BOOT_CMDS 3 #define SPIFLASH_CMDS 4 +#define I2C_CMDS 4 #define LITEDRAM_CMDS 4 #define LITEETH_CMDS 5 #define LITESDCARD_CMDS 7 diff --git a/litex/soc/software/liblitedram/i2c.h b/litex/soc/software/include/base/i2c.h similarity index 88% rename from litex/soc/software/liblitedram/i2c.h rename to litex/soc/software/include/base/i2c.h index c0cc2bfe6..7021c9424 100644 --- a/litex/soc/software/liblitedram/i2c.h +++ b/litex/soc/software/include/base/i2c.h @@ -1,8 +1,11 @@ #ifndef __I2C_H #define __I2C_H +#ifdef __cplusplus +extern "C" { +#endif + #include -#include /* I2C frequency defaults to a safe value in range 10-100 kHz to be compatible with SMBus */ #ifndef I2C_FREQ_HZ @@ -16,4 +19,8 @@ void i2c_reset(void); bool i2c_write(unsigned char slave_addr, unsigned char addr, const unsigned char *data, unsigned int len); bool i2c_read(unsigned char slave_addr, unsigned char addr, unsigned char *data, unsigned int len, bool send_stop); +#ifdef __cplusplus +} +#endif + #endif /* __I2C_H */ diff --git a/litex/soc/software/libbase/Makefile b/litex/soc/software/libbase/Makefile index b29bffb42..dff9f7188 100755 --- a/litex/soc/software/libbase/Makefile +++ b/litex/soc/software/libbase/Makefile @@ -1,8 +1,8 @@ include ../include/generated/variables.mak include $(SOC_DIRECTORY)/software/common.mak -OBJECTS=exception.o libc.o errno.o crc16.o crc32.o console.o \ - system.o id.o uart.o time.o qsort.o strtod.o spiflash.o strcasecmp.o +OBJECTS = exception.o libc.o errno.o crc16.o crc32.o console.o \ + system.o id.o uart.o time.o qsort.o strtod.o spiflash.o strcasecmp.o i2c.o all: crt0-ctr.o crt0-xip.o libbase.a libbase-nofloat.a diff --git a/litex/soc/software/liblitedram/i2c.c b/litex/soc/software/libbase/i2c.c similarity index 98% rename from litex/soc/software/liblitedram/i2c.c rename to litex/soc/software/libbase/i2c.c index af40b8f49..cd15abb53 100644 --- a/litex/soc/software/liblitedram/i2c.c +++ b/litex/soc/software/libbase/i2c.c @@ -1,7 +1,6 @@ // This file is Copyright (c) 2020 Antmicro - -#include -#include "i2c.h" +#include +#include #ifdef CSR_I2C_BASE diff --git a/litex/soc/software/liblitedram/Makefile b/litex/soc/software/liblitedram/Makefile index c6113c0ab..c541e3f65 100644 --- a/litex/soc/software/liblitedram/Makefile +++ b/litex/soc/software/liblitedram/Makefile @@ -1,7 +1,7 @@ include ../include/generated/variables.mak include $(SOC_DIRECTORY)/software/common.mak -OBJECTS = sdram.o i2c.o +OBJECTS = sdram.o all: liblitedram.a diff --git a/litex/soc/software/liblitedram/sdram.h b/litex/soc/software/liblitedram/sdram.h index 7deb82e39..21433c03c 100644 --- a/litex/soc/software/liblitedram/sdram.h +++ b/litex/soc/software/liblitedram/sdram.h @@ -2,7 +2,6 @@ #define __SDRAM_H #include -#include "i2c.h" void sdrsw(void); void sdrhw(void);