IEEE 802.15.4 subsystem
Sign in or create your account | Project List | Help
IEEE 802.15.4 subsystem Git Source Tree
Root/
Source at commit 49d6067e887e91038e83ade0233eba7e0d99ecdb created 12 years 8 months ago. By Werner Almesberger, tools/lib/: added HardMAC functions to the atusb drivers | |
---|---|
1 | /* |
2 | * lib/atusb_spi.c - ATRF access functions library (USB-SPI version) |
3 | * |
4 | * Written 2010-2011 by Werner Almesberger |
5 | * Copyright 2010-2011 Werner Almesberger |
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, or |
10 | * (at your option) any later version. |
11 | */ |
12 | |
13 | |
14 | #include <stdint.h> |
15 | #include <stdlib.h> |
16 | #include <stdio.h> |
17 | #include <string.h> |
18 | #include <usb.h> |
19 | |
20 | #include "atusb/ep0.h" |
21 | #include "atusb/usb-ids.h" |
22 | |
23 | #include "usbopen.h" |
24 | #include "at86rf230.h" |
25 | #include "driver.h" |
26 | #include "atusb-common.h" |
27 | |
28 | |
29 | static void atusb_spi_reg_write(void *handle, uint8_t reg, uint8_t v) |
30 | { |
31 | struct atusb_dsc *dsc = handle; |
32 | int res; |
33 | |
34 | if (dsc->error) |
35 | return; |
36 | |
37 | res = usb_control_msg(dsc->dev, TO_DEV, ATUSB_SPI_WRITE, |
38 | AT86RF230_REG_WRITE | reg, v, NULL, 0, 1000); |
39 | if (res < 0) { |
40 | fprintf(stderr, "ATUSB_SPI_WRITE: %d\n", res); |
41 | dsc->error = 1; |
42 | } |
43 | } |
44 | |
45 | |
46 | static uint8_t atusb_spi_reg_read(void *handle, uint8_t reg) |
47 | { |
48 | struct atusb_dsc *dsc = handle; |
49 | uint8_t value = 0; |
50 | int res; |
51 | |
52 | if (dsc->error) |
53 | return 0; |
54 | |
55 | res = usb_control_msg(dsc->dev, FROM_DEV, ATUSB_SPI_READ1, |
56 | AT86RF230_REG_READ | reg, 0, (void *) &value, 1, 1000); |
57 | if (res < 0) { |
58 | fprintf(stderr, "ATUSB_SPI_READ1: %d\n", res); |
59 | dsc->error = 1; |
60 | } |
61 | return value; |
62 | } |
63 | |
64 | |
65 | static void atusb_spi_buf_write(void *handle, const void *buf, int size) |
66 | { |
67 | struct atusb_dsc *dsc = handle; |
68 | int res; |
69 | |
70 | if (dsc->error) |
71 | return; |
72 | |
73 | res = usb_control_msg(dsc->dev, TO_DEV, ATUSB_SPI_WRITE, |
74 | AT86RF230_BUF_WRITE, size, (void *) buf, size, 1000); |
75 | if (res < 0) { |
76 | fprintf(stderr, "ATUSB_SPI_WRITE: %d\n", res); |
77 | dsc->error = 1; |
78 | } |
79 | } |
80 | |
81 | |
82 | static int atusb_spi_buf_read(void *handle, void *buf, int size) |
83 | { |
84 | struct atusb_dsc *dsc = handle; |
85 | uint8_t tmp[SRAM_SIZE]; |
86 | int res, got; |
87 | |
88 | if (dsc->error) |
89 | return -1; |
90 | |
91 | res = usb_control_msg(dsc->dev, FROM_DEV, ATUSB_SPI_READ1, |
92 | AT86RF230_BUF_READ, 0, tmp, sizeof(tmp), 1000); |
93 | if (res < 0) { |
94 | fprintf(stderr, "ATUSB_SPI_READ1: %d\n", res); |
95 | dsc->error = 1; |
96 | return res; |
97 | } |
98 | got = tmp[0]+1; /* +1 for LQI */ |
99 | if (got >= res) { |
100 | fprintf(stderr, |
101 | "atusb_spi_buf_read: got %d >= received %d bytes\n", |
102 | got, res); |
103 | return -1; |
104 | } |
105 | if (got > size) { |
106 | fprintf(stderr, "atusb_spi_buf_read: got %d > max %d bytes\n", |
107 | got, size); |
108 | return -1; |
109 | } |
110 | memcpy(buf, tmp+1, got); |
111 | |
112 | return got; |
113 | } |
114 | |
115 | |
116 | static void atusb_spi_sram_write(void *handle, uint8_t addr, uint8_t v) |
117 | { |
118 | struct atusb_dsc *dsc = handle; |
119 | int res; |
120 | |
121 | if (dsc->error) |
122 | return; |
123 | |
124 | res = usb_control_msg(dsc->dev, TO_DEV, ATUSB_SPI_WRITE, |
125 | AT86RF230_SRAM_WRITE, addr, &v, 1, 1000); |
126 | if (res < 0) { |
127 | fprintf(stderr, "ATUSB_SPI_WRITE: %d\n", res); |
128 | dsc->error = 1; |
129 | } |
130 | } |
131 | |
132 | |
133 | static uint8_t atusb_spi_sram_read(void *handle, uint8_t addr) |
134 | { |
135 | struct atusb_dsc *dsc = handle; |
136 | uint8_t value = 0; |
137 | int res; |
138 | |
139 | if (dsc->error) |
140 | return 0; |
141 | |
142 | res = usb_control_msg(dsc->dev, FROM_DEV, ATUSB_SPI_READ2, |
143 | AT86RF230_SRAM_READ, addr, (void *) &value, 1, 1000); |
144 | if (res < 0) { |
145 | fprintf(stderr, "ATUSB_SPI_READ2: %d\n", res); |
146 | dsc->error = 1; |
147 | } |
148 | return value; |
149 | } |
150 | |
151 | |
152 | /* ----- Driver interface -------------------------------------------------- */ |
153 | |
154 | |
155 | struct atrf_driver atusb_spi_driver = { |
156 | .name = "usb-spi", |
157 | .open = atusb_open, |
158 | .close = atusb_close, |
159 | .reset = NULL, |
160 | .reset_rf = atusb_reset_rf, |
161 | .test_mode = NULL, |
162 | .slp_tr = atusb_slp_tr, |
163 | .set_clkm = atusb_set_clkm, |
164 | .reg_write = atusb_spi_reg_write, |
165 | .reg_read = atusb_spi_reg_read, |
166 | .buf_write = atusb_spi_buf_write, |
167 | .buf_read = atusb_spi_buf_read, |
168 | .sram_write = atusb_spi_sram_write, |
169 | .sram_read = atusb_spi_sram_read, |
170 | .interrupt_wait = atusb_interrupt_wait, |
171 | .rx_mode = atusb_rx_mode, |
172 | .rx = atusb_rx, |
173 | .tx = atusb_tx, |
174 | }; |
175 |