• R/O
  • HTTP
  • SSH
  • HTTPS

spike-ad: Commit

Overo用のspiドライバ
/dev/spi-ad
サブCPU基板からSPIでADデータを取得する。


Commit MetaInfo

Revisão11c4a2d9ed05cc91f5862f0071179fce77d761a5 (tree)
Hora2011-12-15 23:49:38
AutorNaoya Takamura <ntaka206@user...>
CommiterNaoya Takamura

Mensagem de Log

Ring Buffer for SPI RCV実装
SPI CMD send add

Mudança Sumário

Diff

--- a/spike-ad.c
+++ b/spike-ad.c
@@ -47,18 +47,18 @@
4747
4848 #include "spike-ad.h"
4949
50-#define SPI_BUFF_SIZE 2048
50+#define SPI_BUFF_SIZE 2048 // for spike_ctl
5151 #define USER_BUFF_SIZE 128
5252
5353 #define SPI_BUS 1
5454 #define SPI_BUS_CS0 0
5555 #define SPI_BUS_SPEED 500000 // Hz
5656
57-#define SPI_DATA_SIZE 945 // $含む
57+#define SPI_DATA_SIZE 965 // $含む PICから受信するデータ長
5858
5959 #define GPIO_DRDY_IN 144 // DRDY Input = GPIO144
6060
61-#define DEBUG_TOGGLE_OUT // デバッグ時定義する
61+//#define DEBUG_TOGGLE_OUT // デバッグ時定義する
6262 #ifdef DEBUG_TOGGLE_OUT
6363 #define GPIO_TOGGLE_OUT 145 // Debug用toggle出力 = GPIO145
6464 #endif
@@ -117,33 +117,118 @@ static FileInfo finfo;
117117 void spike_tasklet_func(unsigned long data);
118118 DECLARE_TASKLET(spike_tasklet, spike_tasklet_func, 0);
119119
120-//仮
121-static char ring_buf[SPI_DATA_SIZE];
122-
123-// 送信データ
120+//
121+/**** SPI送信データ バッファ ******************************************
122+*/
123+// 送信データ(CMD for PIC)
124124 #define SPI_TX_MAX (64)
125125 static unsigned char spitxbuf[SPI_TX_MAX];
126-int spi_tx_len;
126+static int spi_tx_len;
127+
128+//
129+/**** SPI受信データ リングバッファ ******************************************
130+*/
131+#define RING_NUM (30) // リングバッファ個数
132+#define SPI_MAX (SPI_DATA_SIZE+256) // 1回のデータバイト数max
133+static unsigned char spibuf[RING_NUM][SPI_MAX];
134+
135+/*
136+ 受信データのデコード結果と
137+ ソケット送信・記録パケット
138+*/
139+
140+// 読み出し位置
141+static int ring_read;
142+// 書き込み位置 データ受信で使用
143+static int ring_write;
144+
145+void ring_init(void)
146+{
147+ ring_read = 0;
148+ ring_write = ring_read;
149+ memset(spibuf, 0, sizeof(spibuf));
150+}
151+#define ring_clear() ring_read_set(ring_write_get())
152+
153+// 読み出し位置
154+int ring_read_get(void)
155+{
156+ return ring_read;
157+}
158+void ring_read_set(int i)
159+{
160+ ring_read = i;
161+}
162+void ring_read_plus(void)
163+{
164+ ring_read++;
165+ if (ring_read >= RING_NUM) ring_read = 0;
166+}
167+
168+// 書き込み位置 受信で使用
169+int ring_write_get(void)
170+{
171+ return ring_write;
172+}
173+void ring_write_plus(void)
174+{
175+ ring_write++;
176+ if (ring_write >= RING_NUM) ring_write = 0;
177+}
178+// 読み込んでいないデータ数
179+int ring_num_get(void)
180+{
181+ int i;
182+
183+ i = ring_write - ring_read;
184+ if (i < 0) i += RING_NUM;
185+ return i;
186+}
187+
188+// 位置指定してデータ取得
189+unsigned char* ring_get(int ptr)
190+{
191+ return spibuf[ptr];
192+}
193+/*
194+ 書き込み位置のパケットをゼロクリア
195+*/
196+void ring_zero(void)
197+{
198+ memset(spibuf[ring_write], 0, SPI_MAX);
199+}
200+/*
201+ パケットバッファフル?
202+ 1=Full
203+ 0=not Full
204+*/
205+int ring_full(void)
206+{
207+ if (ring_num_get() >= RING_NUM-1) return 1;
208+ return 0;
209+}
127210
128211
129212 /*
130213 spike_queue_spi_write()で開始した
131214 spi_async()終了後に呼ばれる
215+ つまりSPIでデータを受信完了した状態
132216 */
133217 static void spike_spi_completion_handler(void *arg)
134218 {
135- // Streaming mapping DMA unmap
136-// unmap_dma_buf();
219+ unsigned char *p;
137220
138221 spike_ctl.spi_callbacks++;
139222 spike_ctl.busy = 0;
140-// 受信したデータを保存 仮
141-memcpy(ring_buf, spike_ctl.rx_buff, SPI_DATA_SIZE);
223+
224+ // 受信したデータをリングバッファに保存
225+ p = ring_get(ring_write_get());
226+ memcpy(p, spike_ctl.rx_buff, SPI_DATA_SIZE);
142227 // 実際に受信できたデータ長
143228 spike_ctl.received_len = spike_ctl.msg.actual_length;
144229
145230 // 書き込み位置進める
146-// ring_write_plus();
231+ ring_write_plus();
147232
148233 // 寝ているものを起こす
149234 if (finfo.sleep_mode) {
@@ -155,7 +240,8 @@ memcpy(ring_buf, spike_ctl.rx_buff, SPI_DATA_SIZE);
155240 }
156241 }
157242 /*
158- spi_async()で送信
243+ spi_async()で送信開始
244+ 受信データはcallback funcで受ける
159245 */
160246 static int spike_queue_spi_write(void)
161247 {
@@ -174,6 +260,11 @@ static int spike_queue_spi_write(void)
174260 spike_ctl.tx_buff[0] = '$';
175261 memset(spike_ctl.rx_buff, 0, SPI_BUFF_SIZE);
176262
263+ // TXコマンドセット
264+ memcpy(spike_ctl.tx_buff, spitxbuf, spi_tx_len);
265+ // TXコマンドクリア
266+ memset(spitxbuf, 0, SPI_TX_MAX);
267+
177268 spike_ctl.transfer.tx_buf = spike_ctl.tx_buff;
178269 spike_ctl.transfer.rx_buf = spike_ctl.rx_buff;
179270 spike_ctl.transfer.len = SPI_DATA_SIZE;
@@ -197,6 +288,7 @@ static int spike_queue_spi_write(void)
197288 /*
198289 Tasklet
199290 IRQ Handlerで呼び出される
291+ SPI送受信を開始する
200292 */
201293 void spike_tasklet_func(unsigned long data)
202294 {
@@ -226,7 +318,7 @@ static irqreturn_t irq_handler(int irq, void *dev_id)
226318
227319 return IRQ_HANDLED;
228320 }
229-
321+#if 0
230322 static ssize_t spike_file_read(struct file *filp, char __user *buff, size_t count,
231323 loff_t *offp)
232324 {
@@ -300,6 +392,7 @@ status = spike_queue_spi_write();
300392
301393 return status;
302394 }
395+#endif
303396
304397 static int spike_file_open(struct inode *inode, struct file *filp)
305398 {
@@ -327,7 +420,7 @@ static int spike_file_open(struct inode *inode, struct file *filp)
327420 init_waitqueue_head(&(finfo.wait));
328421 filp->private_data = (void*)&finfo; // プライベートデータに構造体ポインタ設定
329422
330-// ring_clear();
423+ ring_clear();
331424
332425 up(&spike_dev.fop_sem);
333426
@@ -377,6 +470,7 @@ static long spike_file_ioctl(struct file *file, unsigned int cmd, unsigned long
377470 printk(KERN_ALERT "spike_file_ioctl(): copy_from_user() failed\n");
378471 return -EFAULT;
379472 }
473+printk(KERN_INFO "spike_file_ioctl: CMD_TX_LEN %d\n", spi_tx_len);
380474 if (spi_tx_len > SPI_TX_MAX) spi_tx_len = SPI_TX_MAX;
381475 return 0;
382476 // SPI送信データセット
@@ -385,14 +479,14 @@ static long spike_file_ioctl(struct file *file, unsigned int cmd, unsigned long
385479 printk(KERN_ALERT "spike_file_ioctl(): copy_from_user() failed\n");
386480 return -EFAULT;
387481 }
482+printk(KERN_INFO "spike_file_ioctl: CMD_TX_SET %02X %02X %02X %02X\n", spitxbuf[0], spitxbuf[1], spitxbuf[2], spitxbuf[3]);
388483 return 0;
389484 // SPI受信データ返す
390485 case CMD_RX_GET:
391486 // リングバッファからデータ取得
392-// p = ring_get(ring_read_get());
393-p = ring_buf;
487+ p = ring_get(ring_read_get());
394488 // 読み込み位置進める
395-// ring_read_plus();
489+ ring_read_plus();
396490 if (copy_to_user((void *)arg, p, SPI_DATA_SIZE)) {
397491 printk(KERN_ALERT "spike_file_ioctl(): copy_to_user() failed\n");
398492 return -EFAULT;
@@ -408,8 +502,7 @@ p = ring_buf;
408502 return 0;
409503 // リングバッファにあるデータ数を返す
410504 case CMD_DNUM_GET:
411-// i = ring_num_get();
412-i = 1;
505+ i = ring_num_get();
413506 if (copy_to_user((void *)arg, &i, sizeof(int))) {
414507 printk(KERN_ALERT "spike_file_ioctl(): copy_to_user() failed\n");
415508 return -EFAULT;
@@ -417,7 +510,7 @@ i = 1;
417510 return 0;
418511 // リングバッファクリア
419512 case CMD_BUF_CLEAR:
420-// ring_clear();
513+ ring_clear();
421514 return 0;
422515 default:
423516 printk(KERN_INFO "spike_file_ioctl: unknown cmd=%d\n", cmd);
@@ -730,10 +823,13 @@ static int __init spike_init(void)
730823 memset(&irq_dev, 0, sizeof(irq_dev));
731824 sema_init(&irq_dev.sem, 1);
732825
826+ // TXコマンドクリア
827+ memset(spitxbuf, 0, SPI_TX_MAX);
828+
733829 finfo.f_version = 0; // 未使用マーク
734830 spi_tx_len = 0;
735831 // リングバッファ初期化
736-// ring_init();
832+ ring_init();
737833
738834 if (spike_init_cdev() < 0)
739835 goto fail_1;
Show on old repository browser