]> Git Repo - pov-display-rpi.git/blob - src/spi.c
oops array indexing was off
[pov-display-rpi.git] / src / spi.c
1 /*
2  * SPI testing utility (using spidev driver)
3  *
4  * Copyright (c) 2007  MontaVista Software, Inc.
5  * Copyright (c) 2007  Anton Vorontsov <[email protected]>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License.
10  *
11  * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
12  */
13
14 #include "spi.h"
15 #include <getopt.h>
16 #include <fcntl.h>
17 #include <sys/ioctl.h>
18 #include <linux/types.h>
19 #include <linux/spi/spidev.h>
20 static spiMode _mode;
21
22 static int fd;
23
24 extern int transfer(uint8_t tx[], uint8_t rx[], unsigned int size)
25 {
26         int ret;
27         struct spi_ioc_transfer tr = {
28                 .tx_buf = (unsigned long)tx,
29                 .rx_buf = (unsigned long)rx,
30                 .len = size,
31                 .speed_hz = _mode.speed,
32                 .delay_usecs = _mode.delay,
33                 .bits_per_word = _mode.bits};
34
35         ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
36         if (ret < 1)
37                 printf("can't send spi message\n");
38         return ret;
39 }
40 extern int spi_init(spiMode *modes, const char *device)
41 {
42         _mode = *modes;
43         int ret;
44         fd = open(device, O_RDWR);
45         if (fd < 0)
46         {
47                 printf("could not open %s\n", device);
48                 return fd;
49         }
50         ret = ioctl(fd, SPI_IOC_WR_MODE, &(modes->mode));
51         if (ret == -1)
52         {
53                 printf("can't set spi mode\n");
54                 return ret;
55         }
56         ret = ioctl(fd, SPI_IOC_RD_MODE, &(modes->mode));
57         if (ret == -1)
58         {
59                 printf("can't get spi mode\n");
60                 return ret;
61         }
62         ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &(modes->bits));
63         if (ret == -1)
64         {
65                 printf("can't set bits per word\n");
66                 return ret;
67         }
68         ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &(modes->bits));
69         if (ret == -1)
70         {
71                 printf("can't get bits per word\n");
72                 return ret;
73         }
74         ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &(modes->speed));
75         if (ret == -1)
76         {
77                 printf("can't set max speed hz\n");
78                 return ret;
79         }
80         ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &(modes->speed));
81         if (ret == -1)
82         {
83                 printf("can't get max speed hz\n");
84                 return ret;
85         }
86         printf("spi mode: %d\n", modes->mode);
87         printf("bits per word: %d\n", modes->bits);
88         printf("max speed: %d Hz (%d KHz)\n", modes->speed, modes->speed / 1000);
89         return fd;
90 }
91 extern void spi_deinit()
92 {
93         close(fd);
94 }
This page took 0.026109 seconds and 4 git commands to generate.