コード例 #1
0
ファイル: i2c.c プロジェクト: dadongdong/kinomajs
void xs_i2c_init(xsMachine *the)
{
    xsI2C i2c = NULL;
    FskErr err;
    int address;
    int sdaPin = 0, clkPin = 0, sdaDev = 0, clkDev = 0;
	FskPinI2C pin = NULL;

    if (xsGetHostData(xsThis))
        xsThrowDiagnosticIfFskErr(kFskErrBadState, "I2C pin already initialized (SDA pin %d).", i2c->sdaPin);

    address = xsToInteger(xsGet(xsThis, xsID("address")));
    xsResult = xsGet(xsThis, xsID("bus"));
    if (xsUndefinedType == xsTypeOf(xsResult)) {
        sdaPin = xsToInteger(xsGet(xsThis, xsID("sda")));
        clkPin = xsToInteger(xsGet(xsThis, xsID("clock")));

		err = FskPinI2CNew(&pin, sdaPin, clkPin, kFskPinI2CNoBus);
    }
    else {
        sdaDev = xsToInteger(xsResult);
		err = FskPinI2CNew(&pin, 0, 0, sdaDev);
	}

    xsThrowDiagnosticIfFskErr(err, "I2C open failed %s (SDA pin %d, CLK pin %d).", FskInstrumentationGetErrorString(err), sdaPin, clkPin);

    err = FskMemPtrNewClear(sizeof(xsI2CRecord), &i2c);
    if (err) {
        FskPinI2CDispose(pin);
        xsError(err);
    }
    
    xsSetHostData(xsThis, i2c);

	i2c->pin = pin;
    i2c->sdaPin = sdaPin;
    i2c->clkPin = clkPin;
    i2c->sdaDev = sdaDev;
    i2c->clkDev = clkDev;
    i2c->address = (UInt8)address;
    i2c->bus = sdaDev;

#if SUPPORT_XS_DEBUG
    if (0 != sdaPin)
        snprintf(i2c->diagnosticID, sizeof(i2c->diagnosticID), "(Address 0x%x, SDA pin %d, CLK pin %d)", address, sdaPin, clkPin);
    else
        snprintf(i2c->diagnosticID, sizeof(i2c->diagnosticID), "(Address 0x%x, Bus %d)", address, sdaDev);
#endif
}
コード例 #2
0
FskErr createFrontAnalogNew(FskPinAnalog *pin, SInt32 number, const char *name)
{
	FskErr err;
	createFrontAnalog cfa = NULL;

	err = FskMemPtrNewClear(sizeof(createFrontAnalogRecord), &cfa);
	if (err) return err;

	err = FskPinI2CNew(&cfa->i2c, 0, 0, I2CBUS);
	if (err) {
		FskMemPtrDispose(cfa);
		return err;
	}

	cfa->pin = number - 51;
	cfa->address = (cfa->pin < 8) ? a2dAddr1 : a2dAddr2;
	cfa->pin = 7 - (cfa->pin & 7);
//@@ this is odd.... this makes it an analog pin. seems like we should be checking that it is an analog pin, rather than forcing it
	FskHardwarePinsDoMux(cfa->pin, cfa->address, 3);

	*pin = (FskPinAnalog)cfa;

	return err;
}