[U-Boot] [PATCH v3] export SPI functions to standalone apps

While we're here, fix the broken #ifdef handling in _exports.h.
Signed-off-by: Mike Frysinger vapier@gentoo.org --- v3 - tweak code style
common/exports.c | 8 ++++++++ include/_exports.h | 14 ++++++++++---- include/exports.h | 3 ++- 3 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/common/exports.c b/common/exports.c index ec4656b..b3b6e1f 100644 --- a/common/exports.c +++ b/common/exports.c @@ -38,4 +38,12 @@ void jumptable_init (void) gd->jt[XF_i2c_write] = (void *) i2c_write; gd->jt[XF_i2c_read] = (void *) i2c_read; #endif +#ifdef CONFIG_CMD_SPI + gd->jt[XF_spi_init] = (void *) spi_init; + gd->jt[XF_spi_setup_slave] = (void *) spi_setup_slave; + gd->jt[XF_spi_free_slave] = (void *) spi_free_slave; + gd->jt[XF_spi_claim_bus] = (void *) spi_claim_bus; + gd->jt[XF_spi_release_bus] = (void *) spi_release_bus; + gd->jt[XF_spi_xfer] = (void *) spi_xfer; +#endif } diff --git a/include/_exports.h b/include/_exports.h index af43885..f3df568 100644 --- a/include/_exports.h +++ b/include/_exports.h @@ -1,3 +1,7 @@ +/* + * You do not need to use #ifdef around functions that may not exist + * in the final configuration (such as i2c). + */ EXPORT_FUNC(get_version) EXPORT_FUNC(getc) EXPORT_FUNC(tstc) @@ -14,13 +18,15 @@ EXPORT_FUNC(vprintf) EXPORT_FUNC(do_reset) EXPORT_FUNC(getenv) EXPORT_FUNC(setenv) -#ifdef CONFIG_HAS_UID EXPORT_FUNC(forceenv) -#endif EXPORT_FUNC(simple_strtoul) EXPORT_FUNC(simple_strtol) EXPORT_FUNC(strcmp) -#if defined(CONFIG_CMD_I2C) EXPORT_FUNC(i2c_write) EXPORT_FUNC(i2c_read) -#endif +EXPORT_FUNC(spi_init) +EXPORT_FUNC(spi_setup_slave) +EXPORT_FUNC(spi_free_slave) +EXPORT_FUNC(spi_claim_bus) +EXPORT_FUNC(spi_release_bus) +EXPORT_FUNC(spi_xfer) diff --git a/include/exports.h b/include/exports.h index 0620e9e..16ea03a 100644 --- a/include/exports.h +++ b/include/exports.h @@ -33,6 +33,7 @@ void forceenv (char *varname, char *varvalue); int i2c_write (uchar, uint, int , uchar* , int); int i2c_read (uchar, uint, int , uchar* , int); #endif +#include <spi.h>
void app_startup(char **);
@@ -46,7 +47,7 @@ enum { XF_MAX };
-#define XF_VERSION 4 +#define XF_VERSION 5
#if defined(CONFIG_I386) extern gd_t *global_data;

Dear Mike Frysinger,
In message 1248381468-29618-1-git-send-email-vapier@gentoo.org you wrote:
While we're here, fix the broken #ifdef handling in _exports.h.
Signed-off-by: Mike Frysinger vapier@gentoo.org
v3
- tweak code style
common/exports.c | 8 ++++++++ include/_exports.h | 14 ++++++++++---- include/exports.h | 3 ++- 3 files changed, 20 insertions(+), 5 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk

Dear Mike,
In message 1248381468-29618-1-git-send-email-vapier@gentoo.org you wrote:
While we're here, fix the broken #ifdef handling in _exports.h.
Signed-off-by: Mike Frysinger vapier@gentoo.org
v3
- tweak code style
common/exports.c | 8 ++++++++ include/_exports.h | 14 ++++++++++---- include/exports.h | 3 ++- 3 files changed, 20 insertions(+), 5 deletions(-)
This patch causes a build error on the "trab" board:
board/trab/../../examples/standalone/libstubs.a(stubs.o): In function `dummy': include/_exports.h:27: multiple definition of `spi_init' board/trab/tsc2000.o:board/trab/tsc2000.c:52: first defined here make[1]: *** [board/trab/trab_fkt.srec] Error 1 make: *** [board/trab/libtrab.a] Error 2
Please provide a fix.
Best regards,
Wolfgang Denk

The local board-specific spi_init() function conflicts with the common SPI layer, so rename it to something board-specific.
Signed-off-by: Mike Frysinger vapier@gentoo.org --- Note: i've only semi-compile tested this because building for arm results in common math build/link failures related to libgcc math and i really have no interest in tracking those down
board/trab/cmd_trab.c | 8 ++++---- board/trab/trab_fkt.c | 2 +- board/trab/tsc2000.c | 2 +- board/trab/tsc2000.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/board/trab/cmd_trab.c b/board/trab/cmd_trab.c index d0465fb..ae6f7c6 100644 --- a/board/trab/cmd_trab.c +++ b/board/trab/cmd_trab.c @@ -106,7 +106,7 @@ extern int i2c_write (uchar, uint, int , uchar* , int); extern int i2c_read (uchar, uint, int , uchar* , int); extern void tsc2000_reg_init (void); extern s32 tsc2000_contact_temp (void); -extern void spi_init(void); +extern void tsc2000_spi_init(void);
/* function declarations */ int do_dip (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); @@ -175,7 +175,7 @@ int do_burn_in (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) led_init (); global_vars_init (); test_function_table_init (); - spi_init (); + tsc2000_spi_init ();
if (global_vars_write_to_eeprom () != 0) { printf ("%s: error writing global_vars to eeprom\n", @@ -336,7 +336,7 @@ int do_contact_temp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 1; }
- spi_init (); + tsc2000_spi_init ();
contact_temp = tsc2000_contact_temp(); printf ("%d degree C * 100\n", contact_temp) ; @@ -859,7 +859,7 @@ int do_temp_log (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) delay = simple_strtoul(argv[1], NULL, 10); }
- spi_init (); + tsc2000_spi_init (); while (1) {
#if defined(CONFIG_CMD_DATE) diff --git a/board/trab/trab_fkt.c b/board/trab/trab_fkt.c index 53cdb5a..74cdbfc 100644 --- a/board/trab/trab_fkt.c +++ b/board/trab/trab_fkt.c @@ -729,7 +729,7 @@ int do_dac (char **argv) int brightness;
/* initialize SPI */ - spi_init (); + tsc2000_spi_init ();
if (((brightness = simple_strtoul (argv[2], NULL, 10)) < 0) || (brightness > 255)) { diff --git a/board/trab/tsc2000.c b/board/trab/tsc2000.c index f13a5a9..986b6fb 100644 --- a/board/trab/tsc2000.c +++ b/board/trab/tsc2000.c @@ -42,7 +42,7 @@ */ #define MAX_DEVIATION 18 /* unit: DIGITs of adc; 18 DIGIT = 0.5 °C */
-void spi_init(void) +void tsc2000_spi_init(void) { S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO(); S3C24X0_SPI * const spi = S3C24X0_GetBase_SPI(); diff --git a/board/trab/tsc2000.h b/board/trab/tsc2000.h index af1b644..50c09c2 100644 --- a/board/trab/tsc2000.h +++ b/board/trab/tsc2000.h @@ -121,7 +121,7 @@ void tsc2000_set_range (unsigned int); void tsc2000_reg_init (void); s32 tsc2000_contact_temp (void); void spi_wait_transmit_done (void); -void spi_init(void); +void tsc2000_spi_init(void); int tsc2000_interpolate(long value, long data[][2], long *result); void adc_wait_conversion_done(void);

Dear Mike Frysinger,
In message 1250137934-1586-1-git-send-email-vapier@gentoo.org you wrote:
The local board-specific spi_init() function conflicts with the common SPI layer, so rename it to something board-specific.
Signed-off-by: Mike Frysinger vapier@gentoo.org
Thanks.
Note: i've only semi-compile tested this because building for arm results in common math build/link failures related to libgcc math and i really have no interest in tracking those down
If your tool chain has problems, exporting "USE_PRIVATE_LIBGCC=yes" will use U-Boot's local routines which are supposed to work.
Best regards,
Wolfgang Denk

Dear Mike Frysinger,
In message 1250137934-1586-1-git-send-email-vapier@gentoo.org you wrote:
The local board-specific spi_init() function conflicts with the common SPI layer, so rename it to something board-specific.
Signed-off-by: Mike Frysinger vapier@gentoo.org
Note: i've only semi-compile tested this because building for arm results in common math build/link failures related to libgcc math and i really have no interest in tracking those down
board/trab/cmd_trab.c | 8 ++++---- board/trab/trab_fkt.c | 2 +- board/trab/tsc2000.c | 2 +- board/trab/tsc2000.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-)
Compile tested by me.
Applied. Thanks.
Best regards,
Wolfgang Denk
participants (2)
-
Mike Frysinger
-
Wolfgang Denk