Exemple #1
0
/*
 * Class:     edu_wpi_first_wpilibj_hal_SPIJNI
 * Method:    spiSetSpeed
 * Signature: (BI)V
 */
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_SPIJNI_spiSetSpeed
  (JNIEnv *, jclass, jbyte port, jint speed)
{
	SPIJNI_LOG(logDEBUG) << "Calling SPIJNI spiSetSpeed";
	SPIJNI_LOG(logDEBUG) << "Port = " << (jint) port;
	SPIJNI_LOG(logDEBUG) << "Speed = " << (jint) speed;
	spiSetSpeed(port, speed);
}
Exemple #2
0
/**
  * @brief Support some spi driver commands for application.
  * @param[in] fd is interface number.
  * @param[in] cmd is command.
  * @param[in] arg0 is the first argument of command.
  * @param[in] arg1 is the second argument of command.
  * @return command status.
  * @retval 0 Success otherwise fail. Fail value could be
  *                                    - \ref SPI_ERR_NODEV
  *                                    - \ref SPI_ERR_IO
  *                                    - \ref SPI_ERR_ARG
  */
int32_t spiIoctl(int32_t fd, uint32_t cmd, uint32_t arg0, uint32_t arg1)
{
    spi_dev *dev;

    if(fd != 0 && fd != 1)
        return(SPI_ERR_NODEV);

    dev = (spi_dev *)((uint32_t)&spi_device[fd]);
    if(dev->openflag == 0)
        return(SPI_ERR_IO);

    switch(cmd)
    {
        case SPI_IOC_TRIGGER:
            dev->intflag = 0;
            spi_out(dev, spi_in(dev, CNTRL) | 0x1 ,CNTRL);
            break;

        case SPI_IOC_SET_INTERRUPT:
            if(arg0 == SPI_ENABLE_INTERRUPT)
                spi_out(dev, spi_in(dev, CNTRL) | (0x1<<17) ,CNTRL);
            else
                spi_out(dev, spi_in(dev, CNTRL) & ~(0x1<<17) ,CNTRL);
            break;

        case SPI_IOC_SET_SPEED:
            spiSetSpeed(dev, (uint32_t)arg0);
            break;

        case SPI_IOC_SET_DUAL_QUAD_MODE:
            if(arg0 == SPI_DISABLE_DUAL_QUAD)
            {
                spi_out(dev, (spi_in(dev, CNTRL) & ~(0x3 << 21)) ,CNTRL);
                break;
            }

            if(arg0 == SPI_DUAL_MODE)
                spi_out(dev, (spi_in(dev, CNTRL) & ~(0x3 << 21)) | (0x1 << 22) ,CNTRL);
            else
                spi_out(dev, (spi_in(dev, CNTRL) & ~(0x3 << 21)) | (0x1 << 21) ,CNTRL);
            break;

        case SPI_IOC_SET_DUAL_QUAD_DIR:
            if(arg0 == SPI_DUAL_QUAD_INPUT)
                spi_out(dev, spi_in(dev, CNTRL) & ~(0x1 << 20) ,CNTRL);
            else
                spi_out(dev, spi_in(dev, CNTRL) | (0x1 << 20) ,CNTRL);
            break;

        case SPI_IOC_SET_LSB_MSB:
            if(arg0 == SPI_MSB)
                spi_out(dev, spi_in(dev, CNTRL) & ~(0x1 << 10) ,CNTRL);
            else
                spi_out(dev, spi_in(dev, CNTRL) | (0x1 << 10) ,CNTRL);
            break;

        case SPI_IOC_SET_TX_NUM:
            if(arg0 < 4)
                spi_out(dev, (spi_in(dev, CNTRL) & ~(0x3 << 8)) | (arg0 << 8) ,CNTRL);
            else
                return SPI_ERR_ARG;
            break;

        case SPI_IOC_SET_TX_BITLEN:
            if(arg0 < 32)
                spi_out(dev, (spi_in(dev, CNTRL) & ~(0x1f << 3)) | (arg0 << 3) ,CNTRL);
            else
                return SPI_ERR_ARG;
            break;

        case SPI_IOC_SET_MODE:
            if(arg0 > SPI_MODE_3)
                return SPI_ERR_ARG;

            if(arg0 == SPI_MODE_0)
                spi_out(dev, (spi_in(dev, CNTRL) & ~((0x3<<1) | (1UL<<31))) | (1<<2) ,CNTRL);
            else if(arg0 == SPI_MODE_1)
                spi_out(dev, (spi_in(dev, CNTRL) & ~((0x3<<1) | (1UL<<31))) | (1<<1) ,CNTRL);
            else if(arg0 == SPI_MODE_2)
                spi_out(dev, (spi_in(dev, CNTRL) & ~((0x3<<1) | (1UL<<31))) | ((1UL<<31) | (1<<2)) ,CNTRL);
            else
                spi_out(dev, (spi_in(dev, CNTRL) & ~((0x3<<1) | (1UL<<31))) | ((1UL<<31) | (1<<1)) ,CNTRL);
            break;

        case SPI_IOC_ENABLE_SS:
            if(arg0 == SPI_SS_SS0)
                spi_out(dev, (spi_in(dev, SSR) & ~(0x3)) | 0x1 ,SSR);
            else if(arg0 == SPI_SS_SS1)
                spi_out(dev, (spi_in(dev, SSR) & ~(0x3)) | 0x2 ,SSR);
            else if(arg0 == SPI_SS_BOTH)
                spi_out(dev, (spi_in(dev, SSR) & ~(0x3)) | 0x3 ,SSR);
            else
                return SPI_ERR_ARG;
            break;

        case SPI_IOC_DISABLE_SS:
            if(arg0 == SPI_SS_SS0)
                spi_out(dev, (spi_in(dev, SSR) & ~(0x1)) ,SSR);
            else if(arg0 == SPI_SS_SS1)
                spi_out(dev, (spi_in(dev, SSR) & ~(0x2)) ,SSR);
            else if(arg0 == SPI_SS_BOTH)
                spi_out(dev, (spi_in(dev, SSR) & ~(0x3)) ,SSR);
            else
                return SPI_ERR_ARG;
            break;

        case SPI_IOC_SET_AUTOSS:
            if(arg0 == SPI_DISABLE_AUTOSS)
                spi_out(dev, spi_in(dev, SSR) & ~(0x1 << 3) ,SSR);
            else
                spi_out(dev, spi_in(dev, SSR) | (0x1 << 3) ,SSR);
            break;

        case SPI_IOC_SET_SS_ACTIVE_LEVEL:
            if(arg0 == SPI_SS_ACTIVE_LOW)
                spi_out(dev, spi_in(dev, SSR) & ~(0x1 << 2) ,SSR);
            else
                spi_out(dev, spi_in(dev, SSR) | (0x1 << 2) ,SSR);
        default:
            break;
    }

    return 0;
}