blob: e48e9e2decf060c7902439c88bf6d7fd25727fa7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "encoding.h"
#include "platform.h"
#include "eos.h"
#include "spi9bit.h"
#define BIT_GET ((GPIO_REG(GPIO_INPUT_VAL) & (1 << IOF_SPI1_MISO)) >> IOF_SPI1_MISO)
#define BIT_PUT(b) { clear_csr(mstatus, MSTATUS_MIE); if (b) GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << IOF_SPI1_MOSI); else GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << IOF_SPI1_MOSI); set_csr(mstatus, MSTATUS_MIE); }
#define SCK_UP { clear_csr(mstatus, MSTATUS_MIE); GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << IOF_SPI1_SCK); set_csr(mstatus, MSTATUS_MIE); }
#define SCK_DN { clear_csr(mstatus, MSTATUS_MIE); GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << IOF_SPI1_SCK); set_csr(mstatus, MSTATUS_MIE); }
static inline void _sleep(int n) {
volatile int x = n;
while(x) x--;
}
/* sck frequency for r/w operations is 0.8Mhz */
void eos_spi9bit_read(uint8_t *data) {
int i;
*data = 0;
for (i=0; i<8; i++) {
_sleep(10);
*data = *data << 1;
*data |= BIT_GET;
SCK_UP;
_sleep(10);
SCK_DN;
}
}
void eos_spi9bit_write(uint8_t dc, uint8_t data) {
int i;
BIT_PUT(dc);
_sleep(10);
SCK_UP;
for (i=0; i<8; i++) {
_sleep(10);
SCK_DN;
BIT_PUT(data & 0x80);
_sleep(10);
SCK_UP;
data = data << 1;
}
_sleep(10);
SCK_DN;
BIT_PUT(0);
}
|