* fix AT91 SPI driver @ 2009-02-11 15:49 Bart Veer 2009-02-16 23:35 ` Jonathan Larmour 0 siblings, 1 reply; 4+ messages in thread From: Bart Veer @ 2009-02-11 15:49 UTC (permalink / raw) To: ecos-patches This fixes the AT91 SPI driver in the same way as the CortexM STM32 one. Bart 2009-02-11 Bart Veer <bartv@ecoscentric.com> * src/spi_at91.c (cyg_spi_at91_bus_init): turn into a prioritized constructor, make it a static and rename. * cdl/spi_at91.cdl: remove src/spi_at91_init.cxx * src/spi_at91_init.cxx: removed, no longer needed. Index: cdl/spi_at91.cdl =================================================================== RCS file: /cvs/ecos/ecos/packages/devs/spi/arm/at91/current/cdl/spi_at91.cdl,v retrieving revision 1.3 diff -u -p -r1.3 spi_at91.cdl --- cdl/spi_at91.cdl 29 Jan 2009 17:48:44 -0000 1.3 +++ cdl/spi_at91.cdl 11 Feb 2009 15:48:12 -0000 @@ -54,8 +54,6 @@ cdl_package CYGPKG_DEVS_SPI_ARM_AT91 { 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" Index: src/spi_at91.c =================================================================== RCS file: /cvs/ecos/ecos/packages/devs/spi/arm/at91/current/src/spi_at91.c,v retrieving revision 1.8 diff -u -p -r1.8 spi_at91.c --- src/spi_at91.c 29 Jan 2009 17:48:45 -0000 1.8 +++ src/spi_at91.c 11 Feb 2009 15:48:34 -0000 @@ -175,8 +175,8 @@ CYG_SPI_DEFINE_BUS_TABLE(cyg_spi_at91_de #endif // ------------------------------------------------------------------------- -void -cyg_spi_at91_bus_init(void) +static void CYGBLD_ATTRIB_C_INIT_PRI(CYG_INIT_BUS_SPI) +spi_at91_bus_init(void) { #ifdef CYGHWR_DEVS_SPI_ARM_AT91_BUS0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: fix AT91 SPI driver 2009-02-11 15:49 fix AT91 SPI driver Bart Veer @ 2009-02-16 23:35 ` Jonathan Larmour 2009-02-17 18:01 ` Bart Veer 0 siblings, 1 reply; 4+ messages in thread From: Jonathan Larmour @ 2009-02-16 23:35 UTC (permalink / raw) To: Bart Veer; +Cc: ecos-patches [-- Attachment #1: Type: text/plain, Size: 941 bytes --] 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 [-- Attachment #2: at91.spi.init.patch --] [-- Type: text/x-patch, Size: 6351 bytes --] 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 <jifl@eCosCentric.com> + + * 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 <nickg@ecoscentric.com> * cdl/spi_at91.cdl: Add a requires for CYGPKG_ERROR. 2009-02-11 Bart Veer <bartv@ecoscentric.com> 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 <savin@elatec.si> +// 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 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: fix AT91 SPI driver 2009-02-16 23:35 ` Jonathan Larmour @ 2009-02-17 18:01 ` Bart Veer 2009-02-18 17:29 ` Jonathan Larmour 0 siblings, 1 reply; 4+ messages in thread From: Bart Veer @ 2009-02-17 18:01 UTC (permalink / raw) To: Jonathan Larmour; +Cc: ecos-patches [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain, Size: 2458 bytes --] >>>>> "Jifl" == Jonathan Larmour <jifl@eCosCentric.com> writes: Jifl> Bart Veer wrote: >> This fixes the AT91 SPI driver in the same way as the CortexM >> STM32 one. Jifl> I object to this change. It requires very recent tools (gcc Jifl> 4.3.0+). It's acceptable for the Cortex HAL to do this as it Jifl> is a new HAL, but not all the AT91 HALs. Jifl> Instead I am reinstating the build of spi_at91_init.cxx, but Jifl> ifdeffing it on the presence of CYGBLD_ATTRIB_C_INIT_PRI, Jifl> which is only defined if GCC is recent enough. Patch is Jifl> attached and checked in. I did think about this. We have already changed the relevant platform HALs to default to arm-eabi-gcc instead of arm-elf-gcc, so the default behaviour is already to require an up-to-date compiler that provides the necessary functionality. I expect some 3.0 testing of AT91 tools with the new tools, but none with the old tools. If anybody really does want to keep building AT91 targets with old tools then they can continue to use old sources: either for all of eCos, or just for the SPI driver. I really don't see this as a big problem. Partially reverting the change means there is a still an SPI driver in the source tree which gets linker garbage collection wrong, albeit only if built with an old compiler. I really wanted all SPI drivers to get this right, since any of the existing drivers may get used as the starting point for a new driver. There are other ways in which it could have been fixed, e.g. turning spi_at91.c into spi_at91.cxx as per the LPC driver, or something less pleasant like: #ifdef CYGBLD_ATTRIB_C_INIT_PRI ... #else static void (*spi_at91_init_constructor)(void) __attribute__((unused)) CYGBLD_ATTRIB_SECTION(".ctors.33535") = &spi_at91_bus_init; #endif which makes the fairly safe assumption that any pre-4.3 ARM toolchains use .ctors. So I would have preferred it if you had not reinstated the _init.cxx module. But if you really think it is important, I'll live with it. Bart -- Bart Veer eCos Configuration Architect eCosCentric Limited The eCos experts http://www.ecoscentric.com/ Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571 Registered in England and Wales: Reg No 4422071. Besuchen Sie uns vom 3.-5.03.09 auf der Embedded World 2009, Stand 11-300 Visit us at Embedded World 2009, Nürnberg, Germany, 3-5 Mar, Stand 11-300 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: fix AT91 SPI driver 2009-02-17 18:01 ` Bart Veer @ 2009-02-18 17:29 ` Jonathan Larmour 0 siblings, 0 replies; 4+ messages in thread From: Jonathan Larmour @ 2009-02-18 17:29 UTC (permalink / raw) To: Bart Veer; +Cc: ecos-patches Bart Veer wrote: >>>>>>"Jifl" == Jonathan Larmour <jifl@eCosCentric.com> writes: > > > Jifl> Bart Veer wrote: > >> This fixes the AT91 SPI driver in the same way as the CortexM > >> STM32 one. > > Jifl> I object to this change. It requires very recent tools (gcc > Jifl> 4.3.0+). It's acceptable for the Cortex HAL to do this as it > Jifl> is a new HAL, but not all the AT91 HALs. > > Jifl> Instead I am reinstating the build of spi_at91_init.cxx, but > Jifl> ifdeffing it on the presence of CYGBLD_ATTRIB_C_INIT_PRI, > Jifl> which is only defined if GCC is recent enough. Patch is > Jifl> attached and checked in. > > I did think about this. We have already changed the relevant platform > HALs to default to arm-eabi-gcc instead of arm-elf-gcc, so the default > behaviour is already to require an up-to-date compiler that provides > the necessary functionality. I expect some 3.0 testing of AT91 tools > with the new tools, but none with the old tools. Just because something isn't tested doesn't mean it should be avoidably broken. It's different from preventing use of old tools from working. > If anybody really does want to keep building AT91 targets with old > tools then they can continue to use old sources: either for all of > eCos, or just for the SPI driver. I really don't see this as a big > problem. GCC 4.3.x is too recent to mandate. If it turns out there are problems with some people's sources (maybe not exposed in our own testing) they have no fallback of an earlier version. And they may not want to change to the bleeding edge. Or there may be all sorts of reasons why they can't. > Partially reverting the change means there is a still an SPI driver in > the source tree which gets linker garbage collection wrong, albeit > only if built with an old compiler. I really wanted all SPI drivers to > get this right, since any of the existing drivers may get used as the > starting point for a new driver. There are other ways in which it > could have been fixed, e.g. turning spi_at91.c into spi_at91.cxx as > per the LPC driver, or something less pleasant like: > > #ifdef CYGBLD_ATTRIB_C_INIT_PRI > ... > #else > static void (*spi_at91_init_constructor)(void) __attribute__((unused)) CYGBLD_ATTRIB_SECTION(".ctors.33535") = &spi_at91_bus_init; > #endif > > which makes the fairly safe assumption that any pre-4.3 ARM toolchains > use .ctors. That's incompatible with the eabi. And people may be using eabi tools older than 4.3.x. And keying off version wouldn't be a solution as we should still be allowing people to use arm-elf if they want. arm-elf isn't obsolete. Nor is it deprecated. If you would like to change it in line with the LPC driver, please feel free - that seems a fine solution. > So I would have preferred it if you had not reinstated the _init.cxx > module. But if you really think it is important, I'll live with it. I think allowing GCC prior to 4.3.x is essential. Some people are using earlier GCC 4. eCosCentric still don't officially ship 4.3.x yet. Some people are using tools provided by codesourcery (particularly true for eabi). It's a simple matter of changing a compiler prefix in comparison. So for the record, any change which breaks older tools can be considered a bug which wants to be fixed (unless the fix would cause problems with newer tools and ifdeffing isn't practicable). Jifl -- 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. ------["The best things in life aren't things."]------ Opinions==mine ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-02-18 17:29 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2009-02-11 15:49 fix AT91 SPI driver Bart Veer 2009-02-16 23:35 ` Jonathan Larmour 2009-02-17 18:01 ` Bart Veer 2009-02-18 17:29 ` Jonathan Larmour
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).