git.droids-corp.org
/
protos
/
xbee-avr.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
beep when GPS ready
[protos/xbee-avr.git]
/
spi_servo.c
diff --git
a/spi_servo.c
b/spi_servo.c
index
4b0d241
..
7a85070
100644
(file)
--- a/
spi_servo.c
+++ b/
spi_servo.c
@@
-4,7
+4,7
@@
#include <aversive.h>
#include <aversive/wait.h>
#include <aversive.h>
#include <aversive/wait.h>
-#include <
scheduler
.h>
+#include <
callout
.h>
#include "spi_servo.h"
#include "main.h"
#include "spi_servo.h"
#include "main.h"
@@
-24,9
+24,6
@@
* callback is unloaded.
*/
* callback is unloaded.
*/
-/* 1ms */
-#define SPI_EVT_PERIOD (10000UL/SCHEDULER_UNIT)
-
#define PPM_BIT 0x01
#define BYPASS_BIT 0x02
#define PPM_BIT 0x01
#define BYPASS_BIT 0x02
@@
-44,6
+41,8
@@
struct spi_servo_rx {
};
static struct spi_servo_rx spi_servo_rx;
};
static struct spi_servo_rx spi_servo_rx;
+static struct callout spi_timer;
+
/*
* SPI protocol:
*
/*
* SPI protocol:
*
@@
-124,7
+123,7
@@
static void decode_rx_servo(union spi_byte0 byte0, union spi_byte1 byte1)
}
/* called by the scheduler */
}
/* called by the scheduler */
-static void spi_servo_cb(void *arg)
+static void spi_servo_cb(
struct callout_mgr *cm, struct callout *tim,
void *arg)
{
uint8_t idx;
union spi_byte0 byte0;
{
uint8_t idx;
union spi_byte0 byte0;
@@
-147,13
+146,13
@@
static void spi_servo_cb(void *arg)
if (spi_servo_tx.next_byte != 0) {
spi_send_byte(spi_servo_tx.next_byte);
spi_servo_tx.next_byte = 0;
if (spi_servo_tx.next_byte != 0) {
spi_send_byte(spi_servo_tx.next_byte);
spi_servo_tx.next_byte = 0;
-
return
;
+
goto reschedule
;
}
/* if there is no updated servo, send 0 and return. */
if (spi_servo_tx.cmd_mask == 0) {
spi_send_byte(0);
}
/* if there is no updated servo, send 0 and return. */
if (spi_servo_tx.cmd_mask == 0) {
spi_send_byte(0);
-
return
;
+
goto reschedule
;
}
/* else find it and send it */
}
/* else find it and send it */
@@
-170,6
+169,11
@@
static void spi_servo_cb(void *arg)
spi_send_one_servo(idx, spi_servo_tx.servo[idx]);
spi_servo_tx.cmd_mask &= (~(1 << idx));
spi_servo_tx.cur_idx = idx;
spi_send_one_servo(idx, spi_servo_tx.servo[idx]);
spi_servo_tx.cmd_mask &= (~(1 << idx));
spi_servo_tx.cur_idx = idx;
+
+ reschedule:
+ /* don't use callout_reschedule() here, we want to schedule in one tick
+ * relative to current time: 1 tick is 682us at 12Mhz */
+ callout_schedule(cm, tim, 0);
}
void spi_servo_init(void)
}
void spi_servo_init(void)
@@
-180,13
+184,13
@@
void spi_servo_init(void)
/* remove power reduction on spi */
PRR0 &= ~(1 << PRSPI);
/* remove power reduction on spi */
PRR0 &= ~(1 << PRSPI);
- /* Enable SPI, Master, set clock rate fck/
64
*/
- SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR
1
);
+ /* Enable SPI, Master, set clock rate fck/
16
*/
+ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR
0
);
SS_HIGH();
SS_HIGH();
- scheduler_add_periodical_event_priority(&spi_servo_cb, NULL,
- SPI_EVT_PERIOD, SPI_PRIO);
+ callout_init(&spi_timer, spi_servo_cb, NULL, SPI_PRIO);
+ callout_schedule(&xbeeboard.intr_cm, &spi_timer, 0); /* immediate */
spi_servo_set_bypass(1);
}
spi_servo_set_bypass(1);
}