1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,71 @@ |
1 |
+#include <msp430.h> |
|
2 |
+#include <msp430xgeneric.h> |
|
3 |
+#include <stdint.h> |
|
4 |
+ |
|
5 |
+#include "mw_main.h" |
|
6 |
+ |
|
7 |
+#include "mw_acc.h" |
|
8 |
+ |
|
9 |
+void mw_init_acc_i2c(void) |
|
10 |
+{ |
|
11 |
+ /* enable reset before configuration */ |
|
12 |
+ ACCELEROMETER_CTL1 |= UCSWRST; |
|
13 |
+ |
|
14 |
+ /* configure as master using smclk / 40 = 399.5 kHz */ |
|
15 |
+ ACCELEROMETER_CTL0 = UCMST + UCMODE_3 + UCSYNC; |
|
16 |
+ ACCELEROMETER_CTL1 = UCSSEL__SMCLK + UCSWRST; |
|
17 |
+ ACCELEROMETER_BR0 = 42; |
|
18 |
+ |
|
19 |
+ ACCELEROMETER_BR1 = 0; |
|
20 |
+ ACCELEROMETER_I2CSA = KIONIX_DEVICE_ADDRESS; |
|
21 |
+ |
|
22 |
+ /* release reset */ |
|
23 |
+ ACCELEROMETER_CTL1 &= ~UCSWRST; |
|
24 |
+} |
|
25 |
+ |
|
26 |
+/* |
|
27 |
+ * DMA2 = SPI for LCD |
|
28 |
+ */ |
|
29 |
+static void mw_acc_i2c_write_byte(uint8_t byte) |
|
30 |
+{ |
|
31 |
+ ACCELEROMETER_TXBUF = byte; |
|
32 |
+ while ((ACCELEROMETER_CTL1 & ACCELEROMETER_IFG) == 0) |
|
33 |
+ nop(); |
|
34 |
+} |
|
35 |
+ |
|
36 |
+/* OK this is polling write, but data is small and 400kHz I2C, it should "just work" :) */ |
|
37 |
+void mw_acc_i2c_write(const uint8_t addr, const void *data, const uint8_t len) |
|
38 |
+{ |
|
39 |
+ int i; |
|
40 |
+ |
|
41 |
+ if (len == 0) { |
|
42 |
+ return; |
|
43 |
+ } |
|
44 |
+ |
|
45 |
+ while (UCB1STAT & UCBBUSY) |
|
46 |
+ nop(); |
|
47 |
+ |
|
48 |
+ /* |
|
49 |
+ * setup for write and send the start condition |
|
50 |
+ */ |
|
51 |
+ ACCELEROMETER_IFG = 0; |
|
52 |
+ ACCELEROMETER_CTL1 |= UCTR + UCTXSTT; |
|
53 |
+ while (!(ACCELEROMETER_IFG & UCTXIFG)) |
|
54 |
+ nop(); |
|
55 |
+ |
|
56 |
+ /* |
|
57 |
+ * clear transmit interrupt flag, |
|
58 |
+ * send the register address |
|
59 |
+ */ |
|
60 |
+ ACCELEROMETER_IFG = 0; |
|
61 |
+ |
|
62 |
+ mw_acc_i2c_write_byte(addr); |
|
63 |
+ |
|
64 |
+ for (i=0; i<len; i++) |
|
65 |
+ mw_acc_i2c_write_byte(*(uint8_t *)(data+i)); |
|
66 |
+ |
|
67 |
+ while (ACCELEROMETER_CTL1 & UCTXSTP) |
|
68 |
+ nop(); |
|
69 |
+} |
|
70 |
+ |
|
71 |
+ |
0 | 72 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,109 @@ |
1 |
+#ifndef _MW_ACC_H |
|
2 |
+#define _MW_ACC_H |
|
3 |
+ |
|
4 |
+#define KIONIX_DEVICE_ADDRESS ( 0x0F ) |
|
5 |
+ |
|
6 |
+/* KIONIX accelerometer register addresses */ |
|
7 |
+#define KIONIX_XOUT_HPF_L ( 0x00 ) |
|
8 |
+#define KIONIX_XOUT_HPF_H ( 0x01 ) |
|
9 |
+#define KIONIX_YOUT_HPF_L ( 0x02 ) |
|
10 |
+#define KIONIX_YOUT_HPF_H ( 0x03 ) |
|
11 |
+#define KIONIX_ZOUT_HPF_L ( 0x04 ) |
|
12 |
+#define KIONIX_ZOUT_HPF_H ( 0x05 ) |
|
13 |
+#define KIONIX_XOUT_L ( 0x06 ) |
|
14 |
+#define KIONIX_XOUT_H ( 0x07 ) |
|
15 |
+#define KIONIX_YOUT_L ( 0x08 ) |
|
16 |
+#define KIONIX_YOUT_H ( 0x09 ) |
|
17 |
+#define KIONIX_ZOUT_L ( 0x0A ) |
|
18 |
+#define KIONIX_ZOUT_H ( 0x0B ) |
|
19 |
+#define KIONIX_DCST_RESP ( 0x0C ) |
|
20 |
+#define KIONIX_WHO_AM_I ( 0x0F ) |
|
21 |
+#define KIONIX_TILT_POS_CUR ( 0x10 ) |
|
22 |
+#define KIONIX_TILT_POS_PRE ( 0x11 ) |
|
23 |
+#define KIONIX_INT_SRC_REG1 ( 0x15 ) |
|
24 |
+#define KIONIX_INT_SRC_REG2 ( 0x16 ) |
|
25 |
+#define KIONIX_STATUS_REG ( 0x18 ) |
|
26 |
+#define KIONIX_INT_REL ( 0x1A ) |
|
27 |
+#define KIONIX_CTRL_REG1 ( 0x1B ) |
|
28 |
+#define KIONIX_CTRL_REG2 ( 0x1C ) |
|
29 |
+#define KIONIX_CTRL_REG3 ( 0x1D ) |
|
30 |
+#define KIONIX_INT_CTRL_REG1 ( 0x1E ) |
|
31 |
+#define KIONIX_INT_CTRL_REG2 ( 0x1F ) |
|
32 |
+#define KIONIX_INT_CTRL_REG3 ( 0x20 ) |
|
33 |
+#define KIONIX_DATA_CTRL_REG ( 0x21 ) |
|
34 |
+#define KIONIX_TILT_TIMER ( 0x28 ) |
|
35 |
+#define KIONIX_WUF_TIMER ( 0x29 ) |
|
36 |
+#define KIONIX_TDT_TIMER ( 0x2B ) |
|
37 |
+#define KIONIX_TDT_H_THRESH ( 0x2C ) |
|
38 |
+#define KIONIX_TDT_L_THRESH ( 0x2D ) |
|
39 |
+#define KIONIX_TDT_TAP_TIMER ( 0x2E ) |
|
40 |
+#define KIONIX_TDT_TOTAL_TIMER ( 0x2F ) |
|
41 |
+#define KIONIX_TDT_LATENCY_TIMER ( 0x30 ) |
|
42 |
+#define KIONIX_TDT_WINDOW_TIMER ( 0x31 ) |
|
43 |
+#define KIONIX_SELF_TEST ( 0x3A ) |
|
44 |
+#define KIONIX_WUF_THRESH ( 0x5A ) |
|
45 |
+#define KIONIX_TILT_ANGLE ( 0x5C ) |
|
46 |
+#define KIONIX_HYST_SET ( 0x5F ) |
|
47 |
+ |
|
48 |
+/* CTRL_REG1 */ |
|
49 |
+#define PC1_STANDBY_MODE ( 0 << 7 ) |
|
50 |
+#define PC1_OPERATING_MODE ( 1 << 7 ) |
|
51 |
+#define RESOLUTION_8BIT ( 0 << 6 ) |
|
52 |
+#define RESOLUTION_12BIT ( 1 << 6 ) |
|
53 |
+#define DRDYE_DATA_AVAILABLE ( 1 << 5 ) |
|
54 |
+#define WUF_ENABLE ( 1 << 1 ) |
|
55 |
+#define TAP_ENABLE_TDTE ( 1 << 2 ) |
|
56 |
+#define TILT_ENABLE_TPE ( 1 << 0 ) |
|
57 |
+ |
|
58 |
+/* CTRL_REG2 */ |
|
59 |
+#define TILT_LEM (1 << 5 ) |
|
60 |
+#define TILT_RIM (1 << 4 ) |
|
61 |
+#define TILT_DOM (1 << 3 ) |
|
62 |
+#define TILT_UPM (1 << 2 ) |
|
63 |
+#define TILT_FDM (1 << 1 ) |
|
64 |
+#define TILT_FUM (1 << 0 ) |
|
65 |
+ |
|
66 |
+/* CTRL_REG3 */ |
|
67 |
+#define SRST ( 1 << 7 ) |
|
68 |
+#define TILT_ODR_1_6HZ ( 0 << 5 ) |
|
69 |
+#define TILT_ODR_6_3HZ ( 1 << 5 ) |
|
70 |
+#define TILT_ODR_12_5HZ ( 2 << 5 ) |
|
71 |
+#define TILT_ODR_50HZ ( 3 << 5 ) |
|
72 |
+#define DCST ( 1 << 4 ) |
|
73 |
+#define TAP_ODR_50HZ ( 0 << 2 ) |
|
74 |
+#define TAP_ODR_100HZ ( 1 << 2 ) |
|
75 |
+#define TAP_ODR_200HZ ( 2 << 2 ) |
|
76 |
+#define TAP_ODR_400HZ ( 3 << 2 ) |
|
77 |
+#define WUF_ODR_25HZ ( 0 << 0 ) |
|
78 |
+#define WUF_ODR_50HZ ( 1 << 0 ) |
|
79 |
+#define WUF_ODR_100HZ ( 2 << 0 ) |
|
80 |
+#define WUF_ODR_200HZ ( 3 << 0 ) |
|
81 |
+ |
|
82 |
+/* INT_CTRL_REG1 */ |
|
83 |
+#define IEN ( 1 << 5 ) |
|
84 |
+#define IEA ( 1 << 4 ) |
|
85 |
+#define IEL ( 1 << 3 ) |
|
86 |
+#define IEU ( 1 << 2 ) |
|
87 |
+ |
|
88 |
+/* INT_CTRL_REG2 */ |
|
89 |
+#define XBW ( 1 << 7 ) |
|
90 |
+#define YBW ( 1 << 6 ) |
|
91 |
+#define ZBW ( 1 << 5 ) |
|
92 |
+ |
|
93 |
+/* INT_CTRL_REG3 */ |
|
94 |
+#define TLEM (1 << 5) |
|
95 |
+#define TRIM (1 << 4) |
|
96 |
+#define TDOM (1 << 3) |
|
97 |
+#define TUPM (1 << 2) |
|
98 |
+#define TFDM (1 << 1) |
|
99 |
+#define TFUM (1 << 0) |
|
100 |
+ |
|
101 |
+/* INT_SRC_REG2 */ |
|
102 |
+#define INT_TAP_SINGLE (0x04) |
|
103 |
+#define INT_TAP_DOUBLE (0x08) |
|
104 |
+ |
|
105 |
+/* for readability */ |
|
106 |
+#define ONE_BYTE ( 1 ) |
|
107 |
+ |
|
108 |
+#endif |
|
109 |
+ |
... | ... |
@@ -219,18 +219,18 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata) |
219 | 219 |
|
220 | 220 |
if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) { |
221 | 221 |
if (OswaldClk.clk24hr) { |
222 |
- oswald_write_character(2, 76, FONT_DROID8x12, 'x'); |
|
222 |
+ oswald_write_character(2, 76, FONT_6x9, 'x'); |
|
223 | 223 |
} else { |
224 |
- oswald_write_character(2, 76, FONT_DROID8x12, '_'); |
|
224 |
+ oswald_write_character(2, 76, FONT_6x9, '_'); |
|
225 | 225 |
} |
226 | 226 |
} |
227 | 227 |
oswald_write_string(15, 73, FONT_DROID8x12, "24hr"); |
228 | 228 |
|
229 | 229 |
if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) { |
230 | 230 |
if (OswaldClk.day_first) { |
231 |
- oswald_write_character(2, 87, FONT_DROID8x12, 'x'); |
|
231 |
+ oswald_write_character(2, 86, FONT_6x9, 'x'); |
|
232 | 232 |
} else { |
233 |
- oswald_write_character(2, 87, FONT_DROID8x12, '_'); |
|
233 |
+ oswald_write_character(2, 86, FONT_6x9, '_'); |
|
234 | 234 |
} |
235 | 235 |
} |
236 | 236 |
oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm. mm/dd"); |