This is the mail archive of the
ecos-patches@sourceware.org
mailing list for the eCos project.
Re: fix AT91 SPI driver
- From: Jonathan Larmour <jifl at eCosCentric dot com>
- To: Bart Veer <bartv at ecoscentric dot com>
- Cc: ecos-patches at sourceware dot org
- Date: Mon, 16 Feb 2009 23:34:39 +0000
- Subject: Re: fix AT91 SPI driver
- References: <pnab8tdlek.fsf@delenn.bartv.net>
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 <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