| 1 | /* |
| 2 | * ifx_ssc.h defines some data sructures used in ifx_ssc.c |
| 3 | * |
| 4 | * Copyright (C) 2004 Michael Schoenenborn (IFX COM TI BT) |
| 5 | * |
| 6 | * |
| 7 | */ |
| 8 | |
| 9 | #ifndef __IFX_SSC_H |
| 10 | #define __IFX_SSC_H |
| 11 | #ifdef __KERNEL__ |
| 12 | #include <asm/amazon/ifx_ssc_defines.h> |
| 13 | #endif //__KERNEL__ |
| 14 | |
| 15 | #define PORT_CNT 1 // assume default value |
| 16 | |
| 17 | /* symbolic constants to be used in SSC routines */ |
| 18 | |
| 19 | // ### TO DO: bad performance |
| 20 | #define IFX_SSC_TXFIFO_ITL 1 |
| 21 | #define IFX_SSC_RXFIFO_ITL 1 |
| 22 | |
| 23 | |
| 24 | |
| 25 | struct ifx_ssc_statistics{ |
| 26 | unsigned int abortErr; /* abort error */ |
| 27 | unsigned int modeErr; /* master/slave mode error */ |
| 28 | unsigned int txOvErr; /* TX Overflow error */ |
| 29 | unsigned int txUnErr; /* TX Underrun error */ |
| 30 | unsigned int rxOvErr; /* RX Overflow error */ |
| 31 | unsigned int rxUnErr; /* RX Underrun error */ |
| 32 | unsigned int rxBytes; |
| 33 | unsigned int txBytes; |
| 34 | }; |
| 35 | |
| 36 | |
| 37 | struct ifx_ssc_hwopts { |
| 38 | unsigned int AbortErrDetect :1; /* Abort Error detection (in slave mode) */ |
| 39 | unsigned int rxOvErrDetect :1; /* Receive Overflow Error detection */ |
| 40 | unsigned int rxUndErrDetect :1; /* Receive Underflow Error detection */ |
| 41 | unsigned int txOvErrDetect :1; /* Transmit Overflow Error detection */ |
| 42 | unsigned int txUndErrDetect :1; /* Transmit Underflow Error detection */ |
| 43 | unsigned int echoMode :1; /* Echo mode */ |
| 44 | unsigned int loopBack :1; /* Loopback mode */ |
| 45 | unsigned int idleValue :1; /* Idle value */ |
| 46 | unsigned int clockPolarity :1; /* Idle clock is high or low */ |
| 47 | unsigned int clockPhase :1; /* Tx on trailing or leading edge*/ |
| 48 | unsigned int headingControl :1; /* LSB first or MSB first */ |
| 49 | unsigned int dataWidth :6; /* from 2 up to 32 bits */ |
| 50 | unsigned int masterSelect :1; /* Master or Slave mode */ |
| 51 | unsigned int modeRxTx :2; /* rx/tx mode */ |
| 52 | unsigned int gpoCs :8; /* choose outputs to use for chip select */ |
| 53 | unsigned int gpoInv :8; /* invert GPO outputs */ |
| 54 | }; |
| 55 | |
| 56 | |
| 57 | struct ifx_ssc_frm_opts { |
| 58 | bool FrameEnable; // SFCON.SFEN |
| 59 | unsigned int DataLength; // SFCON.DLEN |
| 60 | unsigned int PauseLength; // SFCON.PLEN |
| 61 | unsigned int IdleData; // SFCON.IDAT |
| 62 | unsigned int IdleClock; // SFCON.ICLK |
| 63 | bool StopAfterPause; // SFCON.STOP |
| 64 | }; |
| 65 | |
| 66 | struct ifx_ssc_frm_status { |
| 67 | bool DataBusy; // SFSTAT.DBSY |
| 68 | bool PauseBusy; // SFSTAT.PBSY |
| 69 | unsigned int DataCount; // SFSTAT.DCNT |
| 70 | unsigned int PauseCount; // SFSTAT.PCNT |
| 71 | bool EnIntAfterData; // SFCON.IBEN |
| 72 | bool EnIntAfterPause;// SFCON.IAEN |
| 73 | }; |
| 74 | |
| 75 | typedef struct { |
| 76 | char *buf; |
| 77 | size_t len; |
| 78 | } ifx_ssc_buf_item_t; |
| 79 | |
| 80 | |
| 81 | // data structures for batch execution |
| 82 | typedef union { |
| 83 | struct { |
| 84 | bool save_options; |
| 85 | } init; |
| 86 | ifx_ssc_buf_item_t read; |
| 87 | ifx_ssc_buf_item_t write; |
| 88 | ifx_ssc_buf_item_t rd_wr; |
| 89 | unsigned int set_baudrate; |
| 90 | struct ifx_ssc_frm_opts set_frm; |
| 91 | unsigned int set_gpo; |
| 92 | struct ifx_ssc_hwopts set_hwopts; |
| 93 | }ifx_ssc_batch_cmd_param; |
| 94 | |
| 95 | struct ifx_ssc_batch_list { |
| 96 | unsigned int cmd; |
| 97 | ifx_ssc_batch_cmd_param cmd_param; |
| 98 | struct ifx_ssc_batch_list *next; |
| 99 | }; |
| 100 | |
| 101 | #ifdef __KERNEL__ |
| 102 | #define IFX_SSC_IS_MASTER(p) ((p)->opts.masterSelect == SSC_MASTER_MODE) |
| 103 | |
| 104 | |
| 105 | struct ifx_ssc_port{ |
| 106 | unsigned long mapbase; |
| 107 | struct ifx_ssc_hwopts opts; |
| 108 | struct ifx_ssc_statistics stats; |
| 109 | struct ifx_ssc_frm_status frm_status; |
| 110 | struct ifx_ssc_frm_opts frm_opts; |
| 111 | /* wait queue for ifx_ssc_read() */ |
| 112 | wait_queue_head_t rwait, pwait; |
| 113 | int port_nr; |
| 114 | char port_is_open; /* exclusive open - boolean */ |
| 115 | // int no_of_bits; /* number of _valid_ bits */ |
| 116 | // int elem_size; /* shift for element (no of bytes)*/ |
| 117 | /* buffer and pointers to the read/write position */ |
| 118 | char *rxbuf; /* buffer for RX */ |
| 119 | char *rxbuf_end; /* buffer end pointer for RX */ |
| 120 | volatile char *rxbuf_ptr; /* buffer write pointer for RX */ |
| 121 | char *txbuf; /* buffer for TX */ |
| 122 | char *txbuf_end; /* buffer end pointer for TX */ |
| 123 | volatile char *txbuf_ptr; /* buffer read pointer for TX */ |
| 124 | unsigned int baud; |
| 125 | /* each channel has its own interrupts */ |
| 126 | /* (transmit/receive/error/frame) */ |
| 127 | unsigned int txirq, rxirq, errirq, frmirq; |
| 128 | }; |
| 129 | /* default values for SSC configuration */ |
| 130 | // values of CON |
| 131 | #define IFX_SSC_DEF_IDLE_DATA 1 /* enable */ |
| 132 | #define IFX_SSC_DEF_BYTE_VALID_CTL 1 /* enable */ |
| 133 | #define IFX_SSC_DEF_DATA_WIDTH 32 /* bits */ |
| 134 | #define IFX_SSC_DEF_ABRT_ERR_DETECT 0 /* disable */ |
| 135 | #define IFX_SSC_DEF_RO_ERR_DETECT 1 /* enable */ |
| 136 | #define IFX_SSC_DEF_RU_ERR_DETECT 0 /* disable */ |
| 137 | #define IFX_SSC_DEF_TO_ERR_DETECT 0 /* disable */ |
| 138 | #define IFX_SSC_DEF_TU_ERR_DETECT 0 /* disable */ |
| 139 | #define IFX_SSC_DEF_LOOP_BACK 0 /* disable */ |
| 140 | #define IFX_SSC_DEF_ECHO_MODE 0 /* disable */ |
| 141 | #define IFX_SSC_DEF_CLOCK_POLARITY 0 /* low */ |
| 142 | #define IFX_SSC_DEF_CLOCK_PHASE 1 /* 0: shift on leading edge, latch on trailling edge, 1, otherwise */ |
| 143 | #define IFX_SSC_DEF_HEADING_CONTROL IFX_SSC_MSB_FIRST |
| 144 | #define IFX_SSC_DEF_MODE_RXTX IFX_SSC_MODE_RXTX |
| 145 | // other values |
| 146 | #define IFX_SSC_DEF_MASTERSLAVE IFX_SSC_MASTER_MODE /* master */ |
| 147 | #define IFX_SSC_DEF_BAUDRATE 1000000 |
| 148 | #define IFX_SSC_DEF_RMC 0x10 |
| 149 | |
| 150 | #define IFX_SSC_DEF_TXFIFO_FL 8 |
| 151 | #define IFX_SSC_DEF_RXFIFO_FL 1 |
| 152 | |
| 153 | #if 1 //TODO |
| 154 | #define IFX_SSC_DEF_GPO_CS 2 /* no chip select */ |
| 155 | #define IFX_SSC_DEF_GPO_INV 0 /* no chip select */ |
| 156 | #else |
| 157 | #error "what is ur Chip Select???" |
| 158 | #endif |
| 159 | #define IFX_SSC_DEF_SFCON 0 /* no serial framing */ |
| 160 | #if 0 |
| 161 | #define IFX_SSC_DEF_IRNEN IFX_SSC_T_BIT | /* enable all int's */\ |
| 162 | IFX_SSC_R_BIT | IFX_SSC_E_BIT | IFX_SSC_F_BIT |
| 163 | #endif |
| 164 | #define IFX_SSC_DEF_IRNEN IFX_SSC_T_BIT | /* enable all int's */\ |
| 165 | IFX_SSC_R_BIT | IFX_SSC_E_BIT |
| 166 | #endif /* __KERNEL__ */ |
| 167 | |
| 168 | // batch execution commands |
| 169 | #define IFX_SSC_BATCH_CMD_INIT 1 |
| 170 | #define IFX_SSC_BATCH_CMD_READ 2 |
| 171 | #define IFX_SSC_BATCH_CMD_WRITE 3 |
| 172 | #define IFX_SSC_BATCH_CMD_RD_WR 4 |
| 173 | #define IFX_SSC_BATCH_CMD_SET_BAUDRATE 5 |
| 174 | #define IFX_SSC_BATCH_CMD_SET_HWOPTS 6 |
| 175 | #define IFX_SSC_BATCH_CMD_SET_FRM 7 |
| 176 | #define IFX_SSC_BATCH_CMD_SET_GPO 8 |
| 177 | #define IFX_SSC_BATCH_CMD_FIFO_FLUSH 9 |
| 178 | //#define IFX_SSC_BATCH_CMD_ |
| 179 | //#define IFX_SSC_BATCH_CMD_ |
| 180 | #define IFX_SSC_BATCH_CMD_END_EXEC 0 |
| 181 | |
| 182 | /* Macros to configure SSC hardware */ |
| 183 | /* headingControl: */ |
| 184 | #define IFX_SSC_LSB_FIRST 0 |
| 185 | #define IFX_SSC_MSB_FIRST 1 |
| 186 | /* dataWidth: */ |
| 187 | #define IFX_SSC_MIN_DATA_WIDTH 2 |
| 188 | #define IFX_SSC_MAX_DATA_WIDTH 32 |
| 189 | /* master/slave mode select */ |
| 190 | #define IFX_SSC_MASTER_MODE 1 |
| 191 | #define IFX_SSC_SLAVE_MODE 0 |
| 192 | /* rx/tx mode */ |
| 193 | // ### TO DO: !!! ATTENTION! Hardware dependency => move to ifx_ssc_defines.h |
| 194 | #define IFX_SSC_MODE_RXTX 0 |
| 195 | #define IFX_SSC_MODE_RX 1 |
| 196 | #define IFX_SSC_MODE_TX 2 |
| 197 | #define IFX_SSC_MODE_OFF 3 |
| 198 | #define IFX_SSC_MODE_MASK IFX_SSC_MODE_RX | IFX_SSC_MODE_TX |
| 199 | |
| 200 | /* GPO values */ |
| 201 | #define IFX_SSC_MAX_GPO_OUT 7 |
| 202 | |
| 203 | #define IFX_SSC_RXREQ_BLOCK_SIZE 32768 |
| 204 | |
| 205 | /***********************/ |
| 206 | /* defines for ioctl's */ |
| 207 | /***********************/ |
| 208 | #define IFX_SSC_IOCTL_MAGIC 'S' |
| 209 | /* read out the statistics */ |
| 210 | #define IFX_SSC_STATS_READ _IOR(IFX_SSC_IOCTL_MAGIC, 1, struct ifx_ssc_statistics) |
| 211 | /* clear the statistics */ |
| 212 | #define IFX_SSC_STATS_RESET _IO(IFX_SSC_IOCTL_MAGIC, 2) |
| 213 | /* set the baudrate */ |
| 214 | #define IFX_SSC_BAUD_SET _IOW(IFX_SSC_IOCTL_MAGIC, 3, unsigned int) |
| 215 | /* get the current baudrate */ |
| 216 | #define IFX_SSC_BAUD_GET _IOR(IFX_SSC_IOCTL_MAGIC, 4, unsigned int) |
| 217 | /* set hardware options */ |
| 218 | #define IFX_SSC_HWOPTS_SET _IOW(IFX_SSC_IOCTL_MAGIC, 5, struct ifx_ssc_hwopts) |
| 219 | /* get the current hardware options */ |
| 220 | #define IFX_SSC_HWOPTS_GET _IOR(IFX_SSC_IOCTL_MAGIC, 6, struct ifx_ssc_hwopts) |
| 221 | /* set transmission mode */ |
| 222 | #define IFX_SSC_RXTX_MODE_SET _IOW(IFX_SSC_IOCTL_MAGIC, 7, unsigned int) |
| 223 | /* get the current transmission mode */ |
| 224 | #define IFX_SSC_RXTX_MODE_GET _IOR(IFX_SSC_IOCTL_MAGIC, 8, unsigned int) |
| 225 | /* abort transmission */ |
| 226 | #define IFX_SSC_ABORT _IO(IFX_SSC_IOCTL_MAGIC, 9) |
| 227 | #define IFX_SSC_FIFO_FLUSH _IO(IFX_SSC_IOCTL_MAGIC, 9) |
| 228 | |
| 229 | /* set general purpose outputs */ |
| 230 | #define IFX_SSC_GPO_OUT_SET _IOW(IFX_SSC_IOCTL_MAGIC, 32, unsigned int) |
| 231 | /* clear general purpose outputs */ |
| 232 | #define IFX_SSC_GPO_OUT_CLR _IOW(IFX_SSC_IOCTL_MAGIC, 33, unsigned int) |
| 233 | /* get general purpose outputs */ |
| 234 | #define IFX_SSC_GPO_OUT_GET _IOR(IFX_SSC_IOCTL_MAGIC, 34, unsigned int) |
| 235 | |
| 236 | /*** serial framing ***/ |
| 237 | /* get status of serial framing */ |
| 238 | #define IFX_SSC_FRM_STATUS_GET _IOR(IFX_SSC_IOCTL_MAGIC, 48, struct ifx_ssc_frm_status) |
| 239 | /* get counter reload values and control bits */ |
| 240 | #define IFX_SSC_FRM_CONTROL_GET _IOR(IFX_SSC_IOCTL_MAGIC, 49, struct ifx_ssc_frm_opts) |
| 241 | /* set counter reload values and control bits */ |
| 242 | #define IFX_SSC_FRM_CONTROL_SET _IOW(IFX_SSC_IOCTL_MAGIC, 50, struct ifx_ssc_frm_opts) |
| 243 | |
| 244 | |
| 245 | /*** batch execution ***/ |
| 246 | /* do batch execution */ |
| 247 | #define IFX_SSC_BATCH_EXEC _IOW(IFX_SSC_IOCTL_MAGIC, 64, struct ifx_ssc_batch_list) |
| 248 | |
| 249 | |
| 250 | #ifdef __KERNEL__ |
| 251 | // routines from ifx_ssc.c |
| 252 | // ### TO DO |
| 253 | /* kernel interface for read and write */ |
| 254 | ssize_t ifx_ssc_kread(int, char *, size_t); |
| 255 | ssize_t ifx_ssc_kwrite(int, const char *, size_t); |
| 256 | |
| 257 | #ifdef CONFIG_IFX_VP_KERNEL_TEST |
| 258 | void ifx_ssc_tc(void); |
| 259 | #endif // CONFIG_IFX_VP_KERNEL_TEST |
| 260 | |
| 261 | #endif //__KERNEL__ |
| 262 | #endif // __IFX_SSC_H |
| 263 | |
| 264 | |