Added testing SW in folder test_sw.
[fpga/rpi-motor-control.git] / pmsm-control / test_sw / rp_spi.c
1 /*
2  *
3  */
4
5 #include <stdint.h>
6 #include <unistd.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <getopt.h>
10 #include <fcntl.h>
11 #include <sys/ioctl.h>
12 #include <linux/types.h>
13 #include <linux/spi/spidev.h>
14
15 #include "rp_spi.h" /*struct rpi_in */
16
17 //#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
18 #define ARRAY_SIZE 16
19 static void pabort(const char *s)
20 {
21         perror(s);
22         abort();
23 }
24
25 static const char *device = "/dev/spidev0.1";
26 static uint8_t mode = 0;
27 static uint8_t bits = 8;
28 static uint32_t speed = 500000;
29 static uint16_t delay = 0;
30 static int fd;
31
32 /**
33  * \brief Testovaci funkce. Odesle same nuly. Delka 64bit. Vysledek vypise.
34  */
35 void transfer()
36 {
37         int ret;
38         uint8_t tx[]={0,0,0,0,0,0,0,0} ;/*= {
39                 0x00, 0x00, 0x01, 0x23, 0x45, 0x67,
40                 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23,
41                 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
42                 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
43                 0xCD, 0xEF
44         };/**/
45         printf("ARRAY_SIZE=%d\n",ARRAY_SIZE);
46         uint8_t rx[ARRAY_SIZE] = {0, }; /* inicializace vsech prvku na nulu? */
47         struct spi_ioc_transfer tr = {
48                 .tx_buf = (unsigned long)tx,
49                 .rx_buf = (unsigned long)rx,
50                 .len = ARRAY_SIZE,
51                 .delay_usecs = delay,
52                 .speed_hz = speed,
53                 .bits_per_word = bits,
54         };
55
56         ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
57         if (ret < 1)
58                 pabort("can't send spi message");
59
60         for (ret = 0; ret < ARRAY_SIZE; ret++) {
61                 if (!(ret % 6))
62                         puts("");
63                 printf("%.2X ", rx[ret]);
64         }
65         puts("");
66 }
67 struct rpi_in spi_read(uint8_t * tx)
68 {
69         uint8_t *uint8_p;
70         uint16_t tmp;
71         int sign;
72         struct rpi_in in;
73         int ret;
74
75         uint8_t rx[ARRAY_SIZE] = {0, }; /* inicializace vsech prvku na nulu? */
76         struct spi_ioc_transfer tr = {
77                 .tx_buf = (unsigned long)tx,
78                 .rx_buf = (unsigned long)rx,
79                 .len = ARRAY_SIZE,
80                 .delay_usecs = delay,
81                 .speed_hz = speed,
82                 .bits_per_word = bits,
83         };
84
85         ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
86         /*vypisovani prichozich dat */
87         /*/
88         if (ret < 1)
89                 pabort("can't send spi message");
90
91         for (ret = 0; ret < ARRAY_SIZE; ret++) {
92                 if (!(ret % 6))
93                         puts("");
94                 printf("%.2X ", rx[ret]);
95         }
96         puts("");
97         /*/
98
99         /*prichozi data:
100          * rx[0] - bity 95 downto 88 - bits, that come first
101          * rx[1] - bity 87 downto 80
102          * rx[2] - bity 79 downto 72
103          * rx[3] - bity 71 downto 64
104          * rx[4] - bity 63 downto 56
105          * rx[5] - bity 55 downto 48
106          * rx[6] - bity 47 downto 40
107          * rx[7] - bity 39 downto 32
108          * rx[8] - bity 31 downto 24
109          * rx[9] - bity 23 downto 16
110          * rx[10] - bity 15 downto 8
111          * rx[11] - bity 7 downto 0
112          */
113
114         /*uprava endianity pozice*/
115         uint8_p=(uint8_t*)&in.pozice;
116         /* x86 je Little-Endian */
117         uint8_p[0]=rx[3]; /* LSB */
118         uint8_p[1]=rx[2];
119         uint8_p[2]=rx[1];
120         uint8_p[3]=rx[0]; /*MSB*/ /*with sign bit*/
121         uint8_p[4]=uint8_p[5]=uint8_p[6]=uint8_p[7]=0;
122
123         /*halove sondy
124          * hal1 - bit63
125          * hal2 - bit62
126          * hal3 - bit61
127          */
128         in.hal1=!!(0x80 & rx[4]);
129         in.hal2=!!(0x40 & rx[4]);
130         in.hal3=!!(0x20 & rx[4]);
131
132         /*pwm enable
133          * en1 - bit60
134          * en2 - bit59
135          * en2 - bit58
136          */
137         in.en1=!!(0x10 & rx[4]);
138         in.en2=!!(0x08 & rx[4]);
139         in.en3=!!(0x04 & rx[4]);
140
141         /*shutdown
142          * shdn1 - bit57
143          * shdn2 - bit56
144          * shdn3 - bit55
145          */
146         in.shdn1=!!(0x02 & rx[4]);
147         in.shdn2=!!(0x01 & rx[4]);
148         in.shdn3=!!(0x80 & rx[5]);
149
150         /*debug bits
151          *
152          */
153         in.b54=!!(0x40 & rx[5]);
154         in.b53=!!(0x20 & rx[5]);
155         in.b52=!!(0x10 & rx[5]);
156         in.b51=!!(0x08 & rx[5]);
157         in.b50=!!(0x04 & rx[5]);
158         in.b49=!!(0x02 & rx[5]);
159         in.b48=!!(0x01 & rx[5]);
160         in.b47=!!(0x80 & rx[6]);
161         in.b46=!!(0x40 & rx[6]);
162         in.b45=!!(0x20 & rx[6]);
163         in.b44=!!(0x10 & rx[6]);
164         in.b43=!!(0x08 & rx[6]);
165         in.b42=!!(0x04 & rx[6]);
166         in.b41=!!(0x02 & rx[6]);
167         in.b40=!!(0x01 & rx[6]);
168         in.b39=!!(0x80 & rx[7]);
169         in.b38=!!(0x40 & rx[7]);
170         in.b37=!!(0x20 & rx[7]);
171         in.b36=!!(0x10 & rx[7]);
172
173         /** currents
174          * ch0 - bits 35 downto 24
175          *      35..32 in rx[7] - last 4
176          *      31..24 in rx[8] - all bytte
177          * ch1 - bits 23 downto 12
178          *      23..16 in rx[9] - all byte
179          *      15..12 in rx[10] - first 4
180          * ch2 - bits 11 downto 0
181          *      11..8 in rx[10] - last 4
182          *      7..0 in rx[11] - all byte
183          */
184
185         in.ch0=0x0F & rx[7];
186         in.ch0<<=8;
187         in.ch0|=rx[8];
188
189         in.ch1= rx[9];
190         in.ch1<<=8;
191         in.ch1|=(rx[10] & 0xF0);
192         in.ch1>>=4;
193
194         in.ch2=(0xF & rx[10]);
195         in.ch2<<=8;
196         in.ch2|=rx[11];
197
198
199         return in;
200
201
202 }
203
204 int spi_init()
205 {
206         int ret = 0;
207
208         fd = open(device, O_RDWR);
209         if (fd < 0)
210                 pabort("can't open device");
211         printf("device open\n");
212         /*
213          * spi mode
214          */
215         ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
216         if (ret == -1)
217                 pabort("can't set spi mode");
218
219         ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
220         if (ret == -1)
221                 pabort("can't get spi mode");
222
223         /*
224          * bits per word
225          */
226         ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
227         if (ret == -1)
228                 pabort("can't set bits per word");
229
230         ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
231         if (ret == -1)
232                 pabort("can't get bits per word");
233
234         /*
235          * max speed hz
236          */
237         ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
238         if (ret == -1)
239                 pabort("can't set max speed hz");
240
241         ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
242         if (ret == -1)
243                 pabort("can't get max speed hz");
244
245         printf("spi mode: %d\n", mode);
246         printf("bits per word: %d\n", bits);
247         printf("delay: %d\n", delay);
248         printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
249
250
251         return ret;
252 }
253
254 void spi_disable(){
255         close(fd);
256
257 }