Bart Veer wrote:
This fixes the AT91 SPI driver in the same way as the CortexM STM32 one.
I object to this change. It requires very recent tools (gcc 4.3.0+). It's acceptable for the Cortex HAL to do this as it is a new HAL, but not all the AT91 HALs.
Instead I am reinstating the build of spi_at91_init.cxx, but ifdeffing it on the presence of CYGBLD_ATTRIB_C_INIT_PRI, which is only defined if GCC is recent enough. Patch is attached and checked in.
If there are any other examples of this sort of thing, that I haven't seen go past, please fix similarly or let me know.
Jifl -- *See us at Embedded World 2009, Nürnberg, Germany, 3-5 Mar, Stand 11-300* eCosCentric Limited http://www.eCosCentric.com/ The eCos experts Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571 Registered in England and Wales: Reg No 4422071. ------["Si fractum non sit, noli id reficere"]------ Opinions==mine
Index: ChangeLog =================================================================== RCS file: /cvs/ecos/ecos/packages/devs/spi/arm/at91/current/ChangeLog,v retrieving revision 1.10 diff -u -5 -p -r1.10 ChangeLog --- ChangeLog 12 Feb 2009 14:50:07 -0000 1.10 +++ ChangeLog 16 Feb 2009 23:31:27 -0000 @@ -1,5 +1,15 @@ +2009-02-16 Jonathan Larmour <[email protected]> + + * src/spi_at91.c (cyg_spi_at91_bus_init): Partially revert change of + 2009-02-11. Define an empty CYGBLD_ATTRIB_C_INIT_PRI and rely on + spi_at91_init.cxx to call, in case the compiler does not supply + that macro (e.g. if too old). + * cdl/spi_at91.cdl: Revert change of 2009-02-11. + * src/spi_at91_init.cxx: Revive. Set priority to CYG_INIT_BUS_SPI. + Conditionalise on CYGBLD_ATTRIB_C_INIT_PRI. + 2009-02-12 Nick Garnett <[email protected]> * cdl/spi_at91.cdl: Add a requires for CYGPKG_ERROR. 2009-02-11 Bart Veer <[email protected]> Index: cdl/spi_at91.cdl =================================================================== RCS file: /cvs/ecos/ecos/packages/devs/spi/arm/at91/current/cdl/spi_at91.cdl,v retrieving revision 1.5 diff -u -5 -p -r1.5 spi_at91.cdl --- cdl/spi_at91.cdl 12 Feb 2009 14:50:07 -0000 1.5 +++ cdl/spi_at91.cdl 16 Feb 2009 23:31:28 -0000 @@ -53,10 +53,11 @@ cdl_package CYGPKG_DEVS_SPI_ARM_AT91 { requires CYGPKG_HAL_ARM_AT91 requires CYGPKG_ERROR hardware include_dir cyg/io compile spi_at91.c + compile -library=libextras.a spi_at91_init.cxx cdl_option CYGHWR_DEVS_SPI_ARM_AT91_BUS0 { display "Enable support for SPI bus 0" flavor bool default_value 1 Index: src/spi_at91.c =================================================================== RCS file: /cvs/ecos/ecos/packages/devs/spi/arm/at91/current/src/spi_at91.c,v retrieving revision 1.9 diff -u -5 -p -r1.9 spi_at91.c --- src/spi_at91.c 11 Feb 2009 15:49:38 -0000 1.9 +++ src/spi_at91.c 16 Feb 2009 23:31:28 -0000 @@ -173,12 +173,18 @@ cyg_spi_at91_bus_t cyg_spi_at91_bus1 = { CYG_SPI_DEFINE_BUS_TABLE(cyg_spi_at91_device_t, 1); #endif // ------------------------------------------------------------------------- -static void CYGBLD_ATTRIB_C_INIT_PRI(CYG_INIT_BUS_SPI) -spi_at91_bus_init(void) +// If C constructor with init priority functionality is not in compiler, +// rely on spi_at91_init.cxx to init us. +#ifndef CYGBLD_ATTRIB_C_INIT_PRI +# define CYGBLD_ATTRIB_C_INIT_PRI(x) +#endif + +void CYGBLD_ATTRIB_C_INIT_PRI(CYG_INIT_BUS_SPI) +cyg_spi_at91_bus_init(void) { #ifdef CYGHWR_DEVS_SPI_ARM_AT91_BUS0 // NOTE: here we let the SPI controller control // the data in, out and clock signals, but Index: src/spi_at91_init.cxx =================================================================== RCS file: src/spi_at91_init.cxx diff -N src/spi_at91_init.cxx --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/spi_at91_init.cxx 16 Feb 2009 23:31:28 -0000 @@ -0,0 +1,73 @@ +//========================================================================== +// +// spi_at91_init.cxx +// +// Atmel AT91 (ARM) SPI bus init +// +//========================================================================== +// ####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2009 Free Software Foundation, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later +// version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License +// along with eCos; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// As a special exception, if other files instantiate templates or use +// macros or inline functions from this file, or you compile this file +// and link it with other works to produce a work based on this file, +// this file does not by itself cause the resulting work to be covered by +// the GNU General Public License. However the source code for this file +// must still be made available in accordance with section (3) of the GNU +// General Public License v2. +// +// This exception does not invalidate any other reasons why a work based +// on this file might be covered by the GNU General Public License. +// ------------------------------------------- +// ####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): Savin Zlobec <[email protected]> +// Date: 2004-08-25 +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <cyg/infra/cyg_type.h> + +// This file is not needed if we support CYGBLD_ATTRIB_C_INIT_PRI, as the +// init happens directly in spi_at91.c then. +#ifndef CYGBLD_ATTRIB_C_INIT_PRI + +// ------------------------------------------------------------------------- + +externC void cyg_spi_at91_bus_init(void); + +class cyg_spi_at91_bus_init_class { +public: + cyg_spi_at91_bus_init_class(void) { + cyg_spi_at91_bus_init(); + } +}; + +// ------------------------------------------------------------------------- + +static cyg_spi_at91_bus_init_class spi_at91_bus_init CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_BUS_SPI); + +#endif // ifndef CYGBLD_ATTRIB_C_INIT_PRI + +// ------------------------------------------------------------------------- +// EOF spi_at91_init.cxx
