git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@70 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
35dea10cc7
commit
61319fc705
|
@ -23,10 +23,49 @@
|
|||
#include "lpc214x_ssp.h"
|
||||
|
||||
static BYTE8 *ip, *op;
|
||||
static t_size icnt, ocnt;
|
||||
static int icnt, ocnt;
|
||||
static t_sspnotify callback;
|
||||
static void *cbpar;
|
||||
|
||||
void SSPIrq(void) {
|
||||
SSP *ssp = SSPBase;
|
||||
BYTE8 b;
|
||||
|
||||
while (ssp->SSP_MIS & (MIS_ROR | MIS_RT | MIS_RX | MIS_TX)) {
|
||||
|
||||
if (ssp->SSP_MIS & MIS_ROR)
|
||||
chSysHalt();
|
||||
|
||||
if (ssp->SSP_MIS & (MIS_RX | MIS_RT)) {
|
||||
ssp->SSP_ICR = ICR_RT;
|
||||
while (ssp->SSP_SR & SR_RNE) {
|
||||
b = ssp->SSP_DR;
|
||||
if (ip)
|
||||
*ip++ = b;
|
||||
icnt--;
|
||||
}
|
||||
if (icnt <= 0) { /* It should never become less than zero */
|
||||
t_sspnotify fn = callback;
|
||||
callback = NULL;
|
||||
ssp->SSP_IMSC = 0;
|
||||
VICVectAddr = 0;
|
||||
fn(cbpar);
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
/* It is MIS_TX, no need to test it again. */
|
||||
while (ocnt && (ssp->SSP_SR & SR_TNF)) {
|
||||
if (op)
|
||||
ssp->SSP_DR = *op++;
|
||||
else
|
||||
ssp->SSP_DR = 0xFF;
|
||||
ocnt--;
|
||||
}
|
||||
if (!ocnt)
|
||||
ssp->SSP_IMSC = IMSC_ROR | IMSC_RT | IMSC_RX;
|
||||
}
|
||||
VICVectAddr = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -37,19 +76,57 @@ void SSPIrq(void) {
|
|||
* \p NULL then 0xFF bytes will be output.
|
||||
* @param n the number of bytes to be transferred
|
||||
* @param fn callback function invoked when the operation is done
|
||||
* @return \p SSP_OK if the trasfer is started else \p SSP_RUNNING if a
|
||||
* @param par parameter to be passed to the callback function
|
||||
* @return \p SSP_OK if the trasfer was started else \p SSP_RUNNING if a
|
||||
* an operation was already started
|
||||
*/
|
||||
t_msg sspRWI(BYTE8 *in, BYTE8 *out, t_size n, t_sspnotify fn) {
|
||||
t_msg sspRWI(BYTE8 *in, BYTE8 *out, t_size n, t_sspnotify fn, void *par) {
|
||||
|
||||
if (callback)
|
||||
return SSP_RUNNING;
|
||||
|
||||
callback = fn, ip = in, op = out, icnt = ocnt = n;
|
||||
callback = fn, cbpar = par, ip = in, op = out, icnt = ocnt = n;
|
||||
SSPIMSC = IMSC_ROR | IMSC_RT | IMSC_RX | IMSC_TX;
|
||||
return SSP_OK;
|
||||
}
|
||||
|
||||
|
||||
static void done(void *tp) {
|
||||
|
||||
chThdResumeI(tp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Synchronous SSP transfer.
|
||||
* @param in pointer to the incoming data buffer, if this parameter is set to
|
||||
* \p NULL then the incoming data is discarded.
|
||||
* @param out pointer to the outgoing data buffer, if this parameter is set to
|
||||
* \p NULL then 0xFF bytes will be output.
|
||||
* @param n the number of bytes to be transferred
|
||||
* @return \p SSP_OK if the trasfer was performed else \p SSP_RUNNING if a
|
||||
* an operation was already started
|
||||
*/
|
||||
t_msg sspRW(BYTE8 *in, BYTE8 *out, t_size n) {
|
||||
|
||||
chSysLock();
|
||||
|
||||
t_msg sts = sspRWI(in, out, n, done, chThdSelf());
|
||||
if (sts == SSP_OK)
|
||||
chSchGoSleepS(PRSUSPENDED);
|
||||
|
||||
chSysUnlock();
|
||||
return sts;
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if a SSP operation is running.
|
||||
* @return \p TRUE if an asynchronous operation is already running.
|
||||
*/
|
||||
BOOL sspIsRunningI(void) {
|
||||
|
||||
return callback != NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* SSP setup, must be invoked with interrupts disabled.
|
||||
* Do not invoke while an operation is in progress.
|
||||
|
|
|
@ -23,10 +23,13 @@
|
|||
#define SSP_OK RDY_OK
|
||||
#define SSP_RUNNING -3
|
||||
|
||||
typedef void (*t_sspnotify)(void);
|
||||
typedef void (*t_sspnotify)(void *par);
|
||||
|
||||
void InitSSP(void);
|
||||
void SetSSPI(int cpsr, int cr0, int cr1);
|
||||
void SSPIrqHandler(void);
|
||||
|
||||
t_msg sspRWI(BYTE8 *in, BYTE8 *out, t_size n, t_sspnotify fn, void *par);
|
||||
BOOL sspIsRunningI(void);
|
||||
|
||||
#endif /* _LPC214x_SSP_H_*/
|
||||
|
|
|
@ -40,6 +40,9 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet.
|
|||
|
||||
*** 0.3.6 ***
|
||||
- Added SSP (SPI1) definitions to the lpc214x.h file.
|
||||
- Added SSP driver for the LPC2148. It allows both asynchronous and
|
||||
synchronous operations.
|
||||
- Added missing chThdSuspend() declararion in threads.h.
|
||||
|
||||
*** 0.3.5 ***
|
||||
- Space optimization in events code.
|
||||
|
|
|
@ -158,6 +158,9 @@ extern "C" {
|
|||
#ifdef CH_USE_RESUME
|
||||
void chThdResume(Thread *tp);
|
||||
#endif
|
||||
#ifdef CH_USE_SUSPEND
|
||||
void chThdSuspend(Thread **tpp);
|
||||
#endif
|
||||
#ifdef CH_USE_TERMINATE
|
||||
void chThdTerminate(Thread *tp);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue