Update sipo api.
[bertos.git] / bertos / drv / sipo.h
1 /**
2  * \file
3  * <!--
4  * This file is part of BeRTOS.
5  *
6  * Bertos is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  * As a special exception, you may use this file as part of a free software
21  * library without restriction.  Specifically, if other files instantiate
22  * templates or use macros or inline functions from this file, or you compile
23  * this file and link it with other files to produce an executable, this
24  * file does not by itself cause the resulting executable to be covered by
25  * the GNU General Public License.  This exception does not however
26  * invalidate any other reasons why the executable file might be covered by
27  * the GNU General Public License.
28  *
29  * Copyright 2009 Develer S.r.l. (http://www.develer.com/)
30  *
31  * -->
32  *
33  * \brief Generic Serial-in, Parallel-out implementation (SIPO).
34  *
35  *
36  *
37  * \author Andrea Grandi <andrea@develer.com>
38  * \author Daniele Basile <asterix@develer.com>
39  *
40  * $WIZ$ module_name = "sipo"
41  * $WIZ$ module_depends = "kfile"
42  * $WIZ$ module_hw = "bertos/hw/hw_sipo.h"
43  */
44
45 #ifndef DRV_SIPO_H
46 #define DRV_SIPO_H
47
48 #include "hw/hw_sipo.h"
49 #include "cfg/cfg_sipo.h"
50
51 #include <io/kfile.h>
52
53
54 /*
55  * The following macros are needed to maintain compatibility with older sipo API.
56  * They can be safely removed once the old API is removed.
57  */
58
59  /**
60   * \addtogroup sipo_api
61   * \{
62   */
63 #if COMPILER_C99
64         #define sipo_init(...)           PP_CAT(sipo_init ## _, COUNT_PARMS(__VA_ARGS__)) (__VA_ARGS__)
65 #else
66         /**
67          * Initialize SIPO module.
68          *
69          * To initialize the module you can write this code:
70          * \code
71          * Sipo ctx;
72          * sipo_init(&ctx, settings);
73          * \endcode
74          */
75         #define sipo_init(args...)       PP_CAT(sipo_init ## _, COUNT_PARMS(args)) (args)
76
77 #endif
78 /**\}*/
79
80
81 #define SIPO_DATAORDER_START_LSB        1
82 #define SIPO_DATAORDER_START_MSB     0x80
83
84 #if !CONFIG_SIPO_DISABLE_OLD_API
85 /**
86  * Define enum to set sipo data order.
87  */
88 typedef enum SipoBitOrder
89 {
90         SIPO_DATAORDER_MSB = 0,
91         SIPO_DATAORDER_LSB = 1
92 } SipoBitOrder;
93
94 /**
95  * Define enum to set the start level of clock.
96  */
97 typedef enum SipoClockPol
98 {
99         SIPO_START_LOW = 0,
100         SIPO_START_HIGH = 1
101
102 } SipoClkPol;
103
104 /**
105  * Define enum to set load signal level.
106  */
107 typedef enum SipoLoadPol
108 {
109         SIPO_LOW_TO_HIGH = 0,
110         SIPO_HIGH_TO_LOW = 1
111
112 } SipoLoadPol;
113
114 /**
115  * Sipo KFile context structure.
116  */
117 typedef struct Sipo
118 {
119         KFile fd;                 ///< File descriptor.
120         SipoMap load_device;      ///< Descriptor of the device that we want drive.
121         SipoLoadPol load_pol;     ///< Set polarity of load signal.
122         SipoClkPol clock_pol;     ///< Set polarity of data clock.
123         SipoBitOrder bit_order;   ///< Set the order of pushed bits in sipo.
124
125 } Sipo;
126 #else /* New api */
127
128 #define SIPO_DATAORDER      BV(0)
129 #define SIPO_DATAORDER_MSB  BV(0) ///< MSB sipo data order setting
130 #define SIPO_DATAORDER_LSB     0  ///< LSB sipo data order setting
131
132 #define SIPO_CLOCK_POL      BV(1)
133 #define SIPO_START_LOW      BV(1) ///< sipo clock start level high setting
134 #define SIPO_START_HIGH        0  ///< sipo clock start level low setting
135
136 #define SIPO_LOAD_LEV       BV(2)
137 #define SIPO_LOW_TO_HIGH    BV(2) ///< sipo load high signal level setting.
138 #define SIPO_HIGH_TO_LOW       0  ///< sipo load low signal level setting.
139
140 /**
141  * Sipo KFile context structure.
142  */
143 typedef struct Sipo
144 {
145         KFile fd;                 ///< File descriptor.
146         SipoMap device;           ///< Descriptor of the device that we want drive.
147         uint8_t settings;
148 } Sipo;
149
150 #endif
151
152 /**
153  * ID for sipo.
154  */
155 #define KFT_SIPO MAKE_ID('S', 'I', 'P', 'O')
156
157 /**
158  * Convert + ASSERT from generic KFile to Sipo.
159  */
160 INLINE Sipo * SIPO_CAST(KFile *fd)
161 {
162         ASSERT(fd->_type == KFT_SIPO);
163         return (Sipo *)fd;
164 }
165
166 void sipo_init_1(Sipo *fd);
167 void sipo_init_3(Sipo *fd, SipoMap dev, uint8_t settings);
168
169 #endif /* DRV_SIPO_H */
170