annotate packages/devs/spi/arm/at91/current/src/spi_at91.c @ 2729:74dbf4c3f2e1 after-copyright-change-20090129

Update all copyright banners to reflect FSF ownership; fix and improve licence text.
author jlarmour
date Thu, 29 Jan 2009 17:47:46 +0000
parents e40a637e7b2e
children fe2b9e9dcbe2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
1 //==========================================================================
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
2 //
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
3 // spi_at91.c
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
4 //
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
5 // Atmel AT91 (ARM) SPI driver
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
6 //
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
16 // version.
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
21 // for more details.
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
33 // General Public License v2.
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2569
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
39 //==========================================================================
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
41 //
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
42 // Author(s): Savin Zlobec <savin@elatec.si>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
43 // Date: 2004-08-25
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
44 //
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
45 //####DESCRIPTIONEND####
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
46 //
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
47 //==========================================================================
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
48
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
49 #include <pkgconf/hal.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
50 #include <pkgconf/io_spi.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
51 #include <pkgconf/devs_spi_arm_at91.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
52
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
53 #include <cyg/infra/cyg_type.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
54 #include <cyg/infra/cyg_ass.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
55 #include <cyg/hal/hal_io.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
56 #include <cyg/hal/hal_if.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
57 #include <cyg/hal/hal_intr.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
58 #include <cyg/hal/drv_api.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
59 #include <cyg/io/spi.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
60 #include <cyg/io/spi_at91.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
61 #include <cyg/error/codes.h>
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
62
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
63 // -------------------------------------------------------------------------
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
64 static void spi_at91_init_bus(cyg_spi_at91_bus_t * bus);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
65
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
66 static cyg_uint32 spi_at91_ISR(cyg_vector_t vector, cyg_addrword_t data);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
67
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
68 static void spi_at91_DSR(cyg_vector_t vector,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
69 cyg_ucount32 count,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
70 cyg_addrword_t data);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
71
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
72 static void spi_at91_transaction_begin(cyg_spi_device *dev);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
73
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
74 static void spi_at91_transaction_transfer(cyg_spi_device *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
75 cyg_bool polled,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
76 cyg_uint32 count,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
77 const cyg_uint8 *tx_data,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
78 cyg_uint8 *rx_data,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
79 cyg_bool drop_cs);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
80
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
81 static void spi_at91_transaction_tick(cyg_spi_device *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
82 cyg_bool polled,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
83 cyg_uint32 count);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
84
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
85 static void spi_at91_transaction_end(cyg_spi_device* dev);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
86
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
87 static int spi_at91_get_config(cyg_spi_device *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
88 cyg_uint32 key,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
89 void *buf,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
90 cyg_uint32 *len);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
91
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
92 static int spi_at91_set_config(cyg_spi_device *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
93 cyg_uint32 key,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
94 const void *buf,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
95 cyg_uint32 *len);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
96
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
97 // -------------------------------------------------------------------------
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
98 // AT91 SPI BUS
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
99
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
100 #ifdef CYGHWR_DEVS_SPI_ARM_AT91_BUS0
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
101 cyg_spi_at91_bus_t cyg_spi_at91_bus0 = {
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
102 .spi_bus.spi_transaction_begin = spi_at91_transaction_begin,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
103 .spi_bus.spi_transaction_transfer = spi_at91_transaction_transfer,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
104 .spi_bus.spi_transaction_tick = spi_at91_transaction_tick,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
105 .spi_bus.spi_transaction_end = spi_at91_transaction_end,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
106 .spi_bus.spi_get_config = spi_at91_get_config,
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
107 .spi_bus.spi_set_config = spi_at91_set_config,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
108 .interrupt_number = CYGNUM_HAL_INTERRUPT_SPI,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
109 .base = AT91_SPI,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
110 #ifndef CYGDAT_DEVS_SPI_ARM_AT91_BUS0_NPCS0_NONE
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
111 .cs_en[0] = true,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
112 .cs_gpio[0] = CYGDAT_DEVS_SPI_ARM_AT91_BUS0_NPCS0,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
113 #else
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
114 .cs_en[0] = false,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
115 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
116 #ifndef CYGDAT_DEVS_SPI_ARM_AT91_BUS0_NPCS1_NONE
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
117 .cs_en[1] = true,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
118 .cs_gpio[1] = CYGDAT_DEVS_SPI_ARM_AT91_BUS0_NPCS1,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
119 #else
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
120 .cs_en[1] = false,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
121 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
122 #ifndef CYGDAT_DEVS_SPI_ARM_AT91_BUS0_NPCS2_NONE
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
123 .cs_en[2] = true,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
124 .cs_gpio[2] = CYGDAT_DEVS_SPI_ARM_AT91_BUS0_NPCS2,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
125 #else
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
126 .cs_en[2] = false,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
127 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
128 #ifndef CYGDAT_DEVS_SPI_ARM_AT91_BUS0_NPCS3_NONE
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
129 .cs_en[3] = true,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
130 .cs_gpio[3] = CYGDAT_DEVS_SPI_ARM_AT91_BUS0_NPCS3,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
131 #else
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
132 .cs_en[3] = false,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
133 #endif
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
134 };
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
135
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
136 CYG_SPI_DEFINE_BUS_TABLE(cyg_spi_at91_device_t, 0);
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
137 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
138 #ifdef CYGHWR_DEVS_SPI_ARM_AT91_BUS1
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
139 cyg_spi_at91_bus_t cyg_spi_at91_bus1 = {
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
140 .spi_bus.spi_transaction_begin = spi_at91_transaction_begin,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
141 .spi_bus.spi_transaction_transfer = spi_at91_transaction_transfer,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
142 .spi_bus.spi_transaction_tick = spi_at91_transaction_tick,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
143 .spi_bus.spi_transaction_end = spi_at91_transaction_end,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
144 .spi_bus.spi_get_config = spi_at91_get_config,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
145 .spi_bus.spi_set_config = spi_at91_set_config,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
146 .interrupt_number = CYGNUM_HAL_INTERRUPT_SPI1,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
147 .base = AT91_SPI1,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
148 #ifndef CYGDAT_DEVS_SPI_ARM_AT91_BUS1_NPCS0_NONE
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
149 .cs_en[0] = true,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
150 .cs_gpio[0] = CYGDAT_DEVS_SPI_ARM_AT91_BUS1_NPCS0,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
151 #else
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
152 .cs_en[0] = false,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
153 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
154 #ifndef CYGDAT_DEVS_SPI_ARM_AT91_BUS1_NPCS1_NONE
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
155 .cs_en[1] = true,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
156 .cs_gpio[1] = CYGDAT_DEVS_SPI_ARM_AT91_BUS1_NPCS1,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
157 #else
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
158 .cs_en[1] = false,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
159 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
160 #ifndef CYGDAT_DEVS_SPI_ARM_AT91_BUS1_NPCS2_NONE
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
161 .cs_en[2] = true,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
162 .cs_gpio[2] = CYGDAT_DEVS_SPI_ARM_AT91_BUS1_NPCS2,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
163 #else
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
164 .cs_en[2] = false,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
165 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
166 #ifndef CYGDAT_DEVS_SPI_ARM_AT91_BUS1_NPCS3_NONE
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
167 .cs_en[3] = true,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
168 .cs_gpio[3] = CYGDAT_DEVS_SPI_ARM_AT91_BUS1_NPCS3,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
169 #else
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
170 .cs_en[3] = false,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
171 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
172 };
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
173
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
174 CYG_SPI_DEFINE_BUS_TABLE(cyg_spi_at91_device_t, 1);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
175 #endif
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
176 // -------------------------------------------------------------------------
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
177
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
178 void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
179 cyg_spi_at91_bus_init(void)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
180 {
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
181
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
182 #ifdef CYGHWR_DEVS_SPI_ARM_AT91_BUS0
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
183 // NOTE: here we let the SPI controller control
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
184 // the data in, out and clock signals, but
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
185 // we need to handle the chip selects manually
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
186 // in order to achieve better chip select control
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
187 // in between transactions.
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
188
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
189 // Put SPI MISO, MOSI and SPCK pins into peripheral mode
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
190 HAL_ARM_AT91_PIO_CFG(AT91_SPI_SPCK);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
191 HAL_ARM_AT91_PIO_CFG(AT91_SPI_MISO);
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
192 HAL_ARM_AT91_PIO_CFG(AT91_SPI_MOSI);
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
193 spi_at91_init_bus(&cyg_spi_at91_bus0);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
194 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
195 #ifdef CYGHWR_DEVS_SPI_ARM_AT91_BUS1
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
196 // NOTE: here we let the SPI controller control
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
197 // the data in, out and clock signals, but
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
198 // we need to handle the chip selects manually
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
199 // in order to achieve better chip select control
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
200 // in between transactions.
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
201
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
202 // Put SPI MISO, MOSI and SPCK pins into peripheral mode
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
203 HAL_ARM_AT91_PIO_CFG(AT91_SPI1_SPCK);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
204 HAL_ARM_AT91_PIO_CFG(AT91_SPI1_MISO);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
205 HAL_ARM_AT91_PIO_CFG(AT91_SPI1_MOSI);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
206 spi_at91_init_bus(&cyg_spi_at91_bus1);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
207 #endif
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
208 }
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
209
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
210 // -------------------------------------------------------------------------
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
211
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
212 static void spi_at91_init_bus(cyg_spi_at91_bus_t * spi_bus)
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
213 {
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
214 cyg_uint32 ctr;
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
215 // Create and attach SPI interrupt object
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
216 cyg_drv_interrupt_create(spi_bus->interrupt_number,
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
217 4,
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
218 (cyg_addrword_t)spi_bus,
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
219 spi_at91_ISR,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
220 spi_at91_DSR,
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
221 &spi_bus->spi_interrupt_handle,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
222 &spi_bus->spi_interrupt);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
223
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
224 cyg_drv_interrupt_attach(spi_bus->spi_interrupt_handle);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
225
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
226 // Init transfer mutex and condition
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
227 cyg_drv_mutex_init(&spi_bus->transfer_mx);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
228 cyg_drv_cond_init(&spi_bus->transfer_cond,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
229 &spi_bus->transfer_mx);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
230
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
231 // Init flags
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
232 spi_bus->transfer_end = true;
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
233 spi_bus->cs_up = false;
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
234
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
235 // Soft reset the SPI controller
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
236 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_CR, AT91_SPI_CR_SWRST);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
237
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
238 // Configure SPI pins
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
239
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
240
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
241 // Put SPI chip select pins in IO output mode
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
242 for(ctr = 0;ctr<4;ctr++)
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
243 {
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
244 if(spi_bus->cs_en[ctr])
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
245 {
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
246 HAL_ARM_AT91_GPIO_CFG_DIRECTION(spi_bus->cs_gpio[ctr],AT91_PIN_OUT);
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
247 HAL_ARM_AT91_GPIO_SET(spi_bus->cs_gpio[ctr]);
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
248 }
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
249 }
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
250 // Call upper layer bus init
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
251 CYG_SPI_BUS_COMMON_INIT(&spi_bus->spi_bus);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
252 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
253
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
254 static cyg_uint32
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
255 spi_at91_ISR(cyg_vector_t vector, cyg_addrword_t data)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
256 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
257 cyg_uint32 stat;
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
258 cyg_spi_at91_bus_t * spi_bus = (cyg_spi_at91_bus_t *)data;
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
259 // Read the status register and disable
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
260 // the SPI int events that have occurred
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
261
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
262 HAL_READ_UINT32(spi_bus->base+AT91_SPI_SR, stat);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
263 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_IDR, stat);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
264
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
265 cyg_drv_interrupt_mask(vector);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
266 cyg_drv_interrupt_acknowledge(vector);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
267
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
268 return CYG_ISR_CALL_DSR;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
269 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
270
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
271 static void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
272 spi_at91_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
273 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
274 cyg_spi_at91_bus_t *spi_bus = (cyg_spi_at91_bus_t *) data;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
275 cyg_uint32 stat;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
276
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
277 // Read the status register and
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
278 // check for transfer completion
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
279
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
280 HAL_READ_UINT32(spi_bus->base+AT91_SPI_SR, stat);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
281
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
282 if((stat & AT91_SPI_SR_ENDRX) && (stat & AT91_SPI_SR_ENDTX))
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
283 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
284 // Transfer ended
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
285 spi_bus->transfer_end = true;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
286 cyg_drv_cond_signal(&spi_bus->transfer_cond);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
287 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
288 else
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
289 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
290 // Transfer still in progress - unmask the SPI
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
291 // int so we can get more SPI int events
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
292 cyg_drv_interrupt_unmask(vector);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
293 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
294 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
295
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
296 static cyg_bool
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
297 spi_at91_calc_scbr(cyg_spi_at91_device_t *dev)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
298 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
299 cyg_uint32 scbr;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
300 cyg_bool res = true;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
301
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
302 // Calculate SCBR from baud rate
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
303
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
304 scbr = CYGNUM_HAL_ARM_AT91_CLOCK_SPEED / dev->cl_brate;
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
305 if ((2*(CYGNUM_HAL_ARM_AT91_CLOCK_SPEED % dev->cl_brate)) >= dev->cl_brate)
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
306 scbr++;
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
307
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
308 if (scbr < 2)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
309 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
310 dev->cl_scbr = 2;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
311 dev->cl_div32 = 0;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
312 res = false;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
313 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
314 else if (scbr > 255)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
315 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
316 dev->cl_div32 = 1;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
317
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
318 scbr = CYGNUM_HAL_ARM_AT91_CLOCK_SPEED / (32*dev->cl_brate);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
319
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
320 if (scbr < 2)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
321 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
322 dev->cl_scbr = 2;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
323 res = false;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
324 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
325 else if (scbr > 255)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
326 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
327 dev->cl_scbr = 255;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
328 res = false;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
329 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
330 else
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
331 dev->cl_scbr = (cyg_uint8)scbr;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
332 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
333 else
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
334 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
335 dev->cl_scbr = (cyg_uint8)scbr;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
336 dev->cl_div32 = 0;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
337 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
338
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
339 return res;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
340 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
341
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
342 static void
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
343 spi_at91_set_npcs(cyg_spi_at91_bus_t *spi_bus,int val)
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
344 {
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
345 cyg_uint32 ctr;
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
346 for(ctr=0;ctr<4;ctr++)
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
347 {
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
348 if(spi_bus->cs_en[ctr])
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
349 {
2369
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
350 HAL_ARM_AT91_GPIO_PUT(spi_bus->cs_gpio[ctr], (val & (1<<ctr)));
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
351 }
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
352 }
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
353 }
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
354
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
355 static void
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
356 spi_at91_start_transfer(cyg_spi_at91_device_t *dev)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
357 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
358 cyg_spi_at91_bus_t *spi_bus = (cyg_spi_at91_bus_t *)dev->spi_device.spi_bus;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
359
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
360 if (spi_bus->cs_up)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
361 return;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
362
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
363 // Force minimal delay between two transfers - in case two transfers
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
364 // follow each other w/o delay, then we have to wait here in order for
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
365 // the peripheral device to detect cs transition from inactive to active.
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
366 CYGACC_CALL_IF_DELAY_US(dev->tr_bt_udly);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
367
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
368 // Raise CS
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
369
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
370 #ifdef CYGHWR_DEVS_SPI_ARM_AT91_PCSDEC
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
371 spi_at91_set_npcs(spi_bus,~dev->dev_num);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
372 #else
2290
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
373 spi_at91_set_npcs(spi_bus,~(1<<dev->dev_num));
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
374 #endif
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
375 CYGACC_CALL_IF_DELAY_US(dev->cs_up_udly);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
376
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
377 spi_bus->cs_up = true;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
378 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
379
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
380 static void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
381 spi_at91_drop_cs(cyg_spi_at91_device_t *dev)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
382 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
383 cyg_spi_at91_bus_t *spi_bus = (cyg_spi_at91_bus_t *)dev->spi_device.spi_bus;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
384
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
385 if (!spi_bus->cs_up)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
386 return;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
387
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
388 // Drop CS
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
389
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
390 CYGACC_CALL_IF_DELAY_US(dev->cs_dw_udly);
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
391 spi_at91_set_npcs(spi_bus,0x0F);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
392 spi_bus->cs_up = false;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
393 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
394
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
395 static void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
396 spi_at91_transfer(cyg_spi_at91_device_t *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
397 cyg_uint32 count,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
398 const cyg_uint8 *tx_data,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
399 cyg_uint8 *rx_data)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
400 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
401 cyg_spi_at91_bus_t *spi_bus = (cyg_spi_at91_bus_t *)dev->spi_device.spi_bus;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
402
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
403 // Since PDC transfer buffer counters are 16 bit long,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
404 // we have to split longer transfers into chunks.
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
405 while (count > 0)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
406 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
407 cyg_uint16 tr_count = count > 0xFFFF ? 0xFFFF : count;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
408
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
409 // Set rx buf pointer and counter
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
410 if (NULL != rx_data)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
411 {
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
412 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_RPR, (cyg_uint32)rx_data);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
413 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_RCR, (cyg_uint32)tr_count);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
414 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
415
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
416 // Set tx buf pointer and counter
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
417 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_TPR, (cyg_uint32)tx_data);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
418 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_TCR, (cyg_uint32)tr_count);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
419
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
420 #ifdef AT91_SPI_PTCR
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
421 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_PTCR,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
422 AT91_SPI_PTCR_RXTEN | AT91_SPI_PTCR_TXTEN);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
423 #endif
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
424 // Enable the SPI int events we are interested in
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
425 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_IER,
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
426 AT91_SPI_SR_ENDRX | AT91_SPI_SR_ENDTX);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
427
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
428 cyg_drv_mutex_lock(&spi_bus->transfer_mx);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
429 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
430 spi_bus->transfer_end = false;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
431
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
432 // Unmask the SPI int
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
433 cyg_drv_interrupt_unmask(spi_bus->interrupt_number);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
434
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
435 // Wait for its completion
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
436 cyg_drv_dsr_lock();
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
437 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
438 while (!spi_bus->transfer_end)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
439 cyg_drv_cond_wait(&spi_bus->transfer_cond);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
440 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
441 cyg_drv_dsr_unlock();
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
442 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
443 cyg_drv_mutex_unlock(&spi_bus->transfer_mx);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
444
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
445 if (NULL == rx_data)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
446 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
447 cyg_uint32 val;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
448
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
449 // If rx buffer was NULL, then the PDC receiver data transfer
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
450 // was not started and we didn't wait for ENDRX, but only for
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
451 // ENDTX. Meaning that right now the last byte is being serialized
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
452 // over the line and when finished input data will appear in
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
453 // rx data reg. We have to wait for this to happen here, if we
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
454 // don't we'll get the last received byte as the first one in the
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
455 // next transfer!
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
456
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
457 // FIXME: is there any better way to do this?
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
458 // If not, then precalculate this value.
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
459 val = 8000000/dev->cl_brate;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
460 CYGACC_CALL_IF_DELAY_US(val > 1 ? val : 1);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
461
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
462 // Clear the rx data reg
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
463 HAL_READ_UINT32(spi_bus->base+AT91_SPI_RDR, val);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
464 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
465
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
466 // Adjust running variables
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
467
1807
950c4e9bf178 * src/spi_at91.c: Fixed a typo in spi_at91_transfer reported by
asl
parents: 1794
diff changeset
468 if (NULL != rx_data)
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
469 rx_data += tr_count;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
470 tx_data += tr_count;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
471 count -= tr_count;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
472 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
473 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
474
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
475 static void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
476 spi_at91_transfer_polled(cyg_spi_at91_device_t *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
477 cyg_uint32 count,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
478 const cyg_uint8 *tx_data,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
479 cyg_uint8 *rx_data)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
480 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
481 cyg_uint32 val;
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
482 cyg_spi_at91_bus_t *spi_bus = (cyg_spi_at91_bus_t *)dev->spi_device.spi_bus;
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
483
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
484 // Transmit and receive byte by byte
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
485 while (count-- > 0)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
486 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
487 // Wait for transmit data register empty
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
488 do
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
489 {
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
490 HAL_READ_UINT32(spi_bus->base+AT91_SPI_SR, val);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
491 } while ( !(val & AT91_SPI_SR_TDRE) );
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
492
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
493 // Send next byte over the wire
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
494 val = *tx_data++;
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
495 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_TDR, val);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
496
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
497 // Wait for reveive data register full
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
498 do
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
499 {
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
500 HAL_READ_UINT32(spi_bus->base+AT91_SPI_SR, val);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
501 } while ( !(val & AT91_SPI_SR_RDRF) );
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
502
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
503 // Store received byte
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
504 HAL_READ_UINT32(spi_bus->base+AT91_SPI_RDR, val);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
505 if (NULL != rx_data)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
506 *rx_data++ = val;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
507 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
508 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
509
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
510 // -------------------------------------------------------------------------
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
511
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
512 static void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
513 spi_at91_transaction_begin(cyg_spi_device *dev)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
514 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
515 cyg_spi_at91_device_t *at91_spi_dev = (cyg_spi_at91_device_t *) dev;
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
516 cyg_spi_at91_bus_t *spi_bus =
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
517 (cyg_spi_at91_bus_t *)at91_spi_dev->spi_device.spi_bus;
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
518 cyg_uint32 val;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
519
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
520 if (!at91_spi_dev->init)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
521 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
522 at91_spi_dev->init = true;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
523 spi_at91_calc_scbr(at91_spi_dev);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
524 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
525
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
526 // Configure SPI channel 0 - this is the only channel we
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
527 // use for all devices since we drive chip selects manually
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
528
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
529 val = AT91_SPI_CSR_BITS8;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
530
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
531 if (1 == at91_spi_dev->cl_pol)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
532 val |= AT91_SPI_CSR_CPOL;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
533
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
534 if (1 == at91_spi_dev->cl_pha)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
535 val |= AT91_SPI_CSR_NCPHA;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
536
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
537 val |= AT91_SPI_CSR_SCBR(at91_spi_dev->cl_scbr);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
538
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
539 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_CSR0, val);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
540
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
541 // Enable SPI clock
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
542 HAL_WRITE_UINT32(AT91_PMC+AT91_PMC_PCER, 1<<spi_bus->interrupt_number);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
543
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
544 // Enable the SPI controller
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
545 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_CR, AT91_SPI_CR_SPIEN);
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
546
2290
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
547 /* As we are using this driver only in master mode with NPCS0
2569
e40a637e7b2e * src/spi_at91.c: Typo fixes from var_io.h. Correctly calculate
asl
parents: 2369
diff changeset
548 configured as GPIO instead of a peripheral pin, it is necessary
2290
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
549 for the Mode Failure detection to be switched off as this will
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
550 cause havoc with the driver */
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
551
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
552 // Put SPI bus into master mode
2369
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
553 if (1 == at91_spi_dev->cl_div32) {
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
554 val = AT91_SPI_MR_MSTR | AT91_SPI_MR_DIV32;
2290
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
555 #ifdef AT91_SPI_MR_MODFDIS
2369
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
556 val |= AT91_SPI_MR_MODFDIS;
2290
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
557 #endif
2369
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
558 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_MR, val);
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
559 } else {
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
560 val = AT91_SPI_MR_MSTR;
2290
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
561 #ifdef AT91_SPI_MR_MODFDIS
2369
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
562 val |= AT91_SPI_MR_MODFDIS;
2290
d2e08e32ef04 * src/spi_at91.c: Fixed the chip select functions.
jlarmour
parents: 2220
diff changeset
563 #endif
2369
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
564 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_MR, val);
ad59d69732ff * src/spi_at91.c (spi_at91_transaction_begin): Don't use #ifdef
asl
parents: 2290
diff changeset
565 }
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
566 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
567
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
568 static void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
569 spi_at91_transaction_transfer(cyg_spi_device *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
570 cyg_bool polled,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
571 cyg_uint32 count,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
572 const cyg_uint8 *tx_data,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
573 cyg_uint8 *rx_data,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
574 cyg_bool drop_cs)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
575 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
576 cyg_spi_at91_device_t *at91_spi_dev = (cyg_spi_at91_device_t *) dev;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
577
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
578 // Select the device if not already selected
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
579 spi_at91_start_transfer(at91_spi_dev);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
580
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
581 // Perform the transfer
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
582 if (polled)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
583 spi_at91_transfer_polled(at91_spi_dev, count, tx_data, rx_data);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
584 else
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
585 spi_at91_transfer(at91_spi_dev, count, tx_data, rx_data);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
586
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
587 // Deselect the device if requested
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
588 if (drop_cs)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
589 spi_at91_drop_cs(at91_spi_dev);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
590 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
591
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
592 static void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
593 spi_at91_transaction_tick(cyg_spi_device *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
594 cyg_bool polled,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
595 cyg_uint32 count)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
596 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
597 const cyg_uint32 zeros[10] = { 0,0,0,0,0,0,0,0,0,0 };
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
598
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
599 cyg_spi_at91_device_t *at91_spi_dev = (cyg_spi_at91_device_t *) dev;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
600
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
601 // Transfer count zeros to the device - we don't touch the
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
602 // chip select, the device could be selected or deselected.
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
603 // It is up to the device driver to decide in wich state the
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
604 // device will be ticked.
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
605
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
606 while (count > 0)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
607 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
608 int tcnt = count > 40 ? 40 : count;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
609
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
610 if (polled)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
611 spi_at91_transfer_polled(at91_spi_dev, tcnt,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
612 (const cyg_uint8 *) zeros, NULL);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
613 else
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
614 spi_at91_transfer(at91_spi_dev, tcnt,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
615 (const cyg_uint8 *) zeros, NULL);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
616
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
617 count -= tcnt;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
618 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
619 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
620
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
621 static void
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
622 spi_at91_transaction_end(cyg_spi_device* dev)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
623 {
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
624 cyg_spi_at91_device_t * at91_spi_dev = (cyg_spi_at91_device_t *)dev;
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
625 cyg_spi_at91_bus_t *spi_bus =
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
626 (cyg_spi_at91_bus_t *)at91_spi_dev->spi_device.spi_bus;
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
627
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
628 // Disable the SPI controller
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
629 HAL_WRITE_UINT32(spi_bus->base+AT91_SPI_CR, AT91_SPI_CR_SPIDIS);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
630
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
631 // Disable SPI clock
2220
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
632 HAL_WRITE_UINT32(AT91_PMC+AT91_PMC_PCDR,1<<spi_bus->interrupt_number);
f0e05d8186d4 * src/spi_at91.c:
asl
parents: 1833
diff changeset
633
1794
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
634 spi_at91_drop_cs((cyg_spi_at91_device_t *) dev);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
635 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
636
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
637 static int
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
638 spi_at91_get_config(cyg_spi_device *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
639 cyg_uint32 key,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
640 void *buf,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
641 cyg_uint32 *len)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
642 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
643 cyg_spi_at91_device_t *at91_spi_dev = (cyg_spi_at91_device_t *) dev;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
644
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
645 switch (key)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
646 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
647 case CYG_IO_GET_CONFIG_SPI_CLOCKRATE:
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
648 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
649 if (*len != sizeof(cyg_uint32))
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
650 return -EINVAL;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
651 else
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
652 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
653 cyg_uint32 *cl_brate = (cyg_uint32 *)buf;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
654 *cl_brate = at91_spi_dev->cl_brate;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
655 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
656 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
657 break;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
658 default:
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
659 return -EINVAL;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
660 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
661 return ENOERR;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
662 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
663
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
664 static int
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
665 spi_at91_set_config(cyg_spi_device *dev,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
666 cyg_uint32 key,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
667 const void *buf,
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
668 cyg_uint32 *len)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
669 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
670 cyg_spi_at91_device_t *at91_spi_dev = (cyg_spi_at91_device_t *) dev;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
671
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
672 switch (key)
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
673 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
674 case CYG_IO_SET_CONFIG_SPI_CLOCKRATE:
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
675 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
676 if (*len != sizeof(cyg_uint32))
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
677 return -EINVAL;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
678 else
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
679 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
680 cyg_uint32 cl_brate = *((cyg_uint32 *)buf);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
681 cyg_uint32 old_cl_brate = at91_spi_dev->cl_brate;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
682
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
683 at91_spi_dev->cl_brate = cl_brate;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
684
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
685 if (!spi_at91_calc_scbr(at91_spi_dev))
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
686 {
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
687 at91_spi_dev->cl_brate = old_cl_brate;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
688 spi_at91_calc_scbr(at91_spi_dev);
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
689 return -EINVAL;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
690 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
691 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
692 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
693 break;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
694 default:
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
695 return -EINVAL;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
696 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
697 return ENOERR;
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
698 }
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
699
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
700 // -------------------------------------------------------------------------
6531d33a6737 Added support for SPI on the EB55
asl
parents:
diff changeset
701 // EOF spi_at91.c