Example #1
0
static int ar7646_read12_ser(struct device *dev, unsigned command)
{
	struct spi_device	*spi = to_spi_device(dev);
	struct ar7646		*ts = dev_get_drvdata(dev);
	struct ser_req		*req = kzalloc(sizeof *req, GFP_KERNEL);
	int			status;
	int			use_internal;
	u8 tx_buf[3][2],rx_buf[2];
	
	if (!req)
		return -ENOMEM;

	spi_message_init(&req->msg);


	//req->command <<= 1;
	tx_buf[0][0] = 0x01;
	tx_buf[0][1] = (u8)((u16)0xd7 << 1);
	//tx_buf[0][0] = 0xd7;	
	req->xfer[0].tx_buf = tx_buf[0];	
	req->xfer[0].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[0].rx_buf = rx_buf;//tt			
	spi_message_add_tail(&req->xfer[0], &req->msg);	

	req->command = (u8) command;	
	tx_buf[1][0] = 0x01;
	tx_buf[1][1] = command << 1;	
	req->xfer[1].tx_buf = tx_buf[1];	
	//req->xfer[0].tx_buf = &req->command;
	req->xfer[1].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[1].rx_buf = &req->sample;//tt			
	spi_message_add_tail(&req->xfer[1], &req->msg);	
	
	tx_buf[2][0] = 0x01;
	tx_buf[2][1] = 0xe0 << 1;
	//tx_buf[2][0] = 0xe0;	
	req->xfer[2].tx_buf = tx_buf[2];	
	//req->xfer[0].tx_buf = &req->command;
	req->xfer[2].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[2].rx_buf = rx_buf;//tt			
	spi_message_add_tail(&req->xfer[2], &req->msg);		
	
	
//	ts->irq_disabled = 1;
	disable_irq(spi->irq);
	status = spi_sync(spi, &req->msg);
//	ts->irq_disabled = 0;
	enable_irq(spi->irq);

	/* on-wire is a must-ignore bit, a BE12 value, then padding */
	status = be16_to_cpu(req->sample);	
	status = status >> 4;
	status &= 0x0fff;
	
	DEBUG("--tx=0x%4x rx =0x%4x -> 0x%4x\n",command,req->sample,status);
	kfree(req);
	return status;
}
Example #2
0
static int ar7646_write_data(struct ts_ar7646 *touchscreen, u16 page, u16 addr, u16 data)
{
	int err = 0;
	struct spi_message msg;
	struct spi_transfer xfer;
	u16 tx_buf[2] = {0};
	DEBUG("tsc2000_write_data \n");
	dev_dbg(&touchscreen->spi->dev, "tsc2000_write_data()\n");

	tx_buf[0] = WRITE_CMD & ((addr<<ADDR_OFFSET) | page);
	tx_buf[1] = data;

	//spi_setup(touchscreen->spi);		//20080417 JS mask
	spi_message_init(&msg);
	memset(&xfer, 0, sizeof(struct spi_transfer));
//	xfer.speed_hz = 300;
	xfer.tx_buf = tx_buf;
//	xfer.rx_buf = &stat;
	xfer.len = SET_TX_RX_LEN(2, 0);

//	xfer.len = 2;

	spi_message_add_tail(&xfer, &msg);
	err = spi_sync(touchscreen->spi, &msg);
	DEBUG("tsc2000_write_data err=%d\n",err);	
	return err;

}
Example #3
0
static int
socle_spi_at25040_set_write_enable(void)
{
	u8 cmd;
	cmd = AT25040_CMD_WREN;
	if (socle_spi_transfer(&cmd, NULL,SET_TX_RX_LEN(1, 0)))
		return -1;
	return 0;
}
Example #4
0
static int
socle_spi_at25040_read_data(u8 addr, u8 *buf, u16 len)
{
	u8 cmd[2] = {0};
	
	cmd[0] = AT25040_CMD_READ;
	cmd[1] = addr;
	if (socle_spi_transfer(cmd, buf, SET_TX_RX_LEN(2,len)))
		return -1;
	return 0;
}
Example #5
0
static int
socle_spi_at25040_page_write_data(u8 addr, u8 *buf)
{
	u8 tx_buf[10] = {0};

	if (socle_spi_at25040_set_write_enable())
		return -1;
	if (socle_spi_at25040_wait_for_write_enable())
		return -1;
	tx_buf[0] = AT25040_CMD_WRITE;
	tx_buf[1] = addr;
	memcpy((char *)&tx_buf[2], (char *)buf, AT25040_MAX_PKG_LEN);
	if(socle_spi_transfer(tx_buf, NULL, SET_TX_RX_LEN(AT25040_MAX_PKG_LEN+2,0)))
		return -1;

	/* Wait for the device to be ready */
	if (socle_spi_at25040_wait_for_ready())
		return -1;
	return 0;
}
Example #6
0
static int
socle_spi_at25040_wait_for_ready(void)
{
	u8 cmd, stat;
	u32 retry_cnt = 0;

	cmd = AT25040_CMD_RDSR;
	while (1) {
		if (socle_spi_transfer(&cmd, &stat, SET_TX_RX_LEN(1, 1)))
			return -1;
		if (!(stat & AT25040_STAT_RDY))
			break;
		if (retry_cnt > RETRY_CNT_THRESHOLD) {
			printf("Retry count (%d) exceed threshold\n", retry_cnt);
			return -1;
		}
		retry_cnt++;
	}
	return 0;
}
Example #7
0
static ssize_t sq_spi_download_write(struct file *file, const char __user *data,
                                     size_t len, loff_t *ppos)
{
    int err = 0;
    //char *p;
    struct spi_message msg;
    struct spi_transfer xfer;
    //char buf[128];
    char *buf;

    buf = kmalloc(len,GFP_KERNEL);
    if(!buf) {
        return -ENOMEM;
    }


    if(copy_from_user(buf,data,len)) {
        return -EFAULT;
    }

    SPI_DOWNLOAD_DBG(" write len=0x%x =>",len);

#if (SPI_CTRL_GPIO_EN == 1 )
    do {
#endif

        /*
        i=0;
        while(1) {
        	sq_gpio_set_low(TST_GPIO_G,1<<i);
        	sq_gpio_set_high(TST_GPIO_G,1<<i);
        	i++;
        	if(i>0x07)
        		i=0;
        }
        */



#if 0
        i=1;
        while(i--)
        {

            sq_gpio_set_low(TST_GPIO_G,DL_PROGB);
            udelay(20);
            sq_gpio_set_high(TST_GPIO_G,DL_PROGB);
            /*
            sq_gpio_set_low(TST_GPIO_G,DL_RST);
            udelay(20);
            sq_gpio_set_high(TST_GPIO_G,DL_RST);


            sq_gpio_set_low(TST_GPIO_G,DL_INITB);
            udelay(20);
            sq_gpio_set_high(TST_GPIO_G,DL_INITB);


            sq_gpio_set_low(TST_GPIO_G,DL_DONE);
            udelay(20);
            sq_gpio_set_high(TST_GPIO_G,DL_DONE);
            */

            //sq_gpio_in(TST_GPIO_G,DL_INITB);
            //sq_gpio_in(TST_GPIO_G,DL_DONE);
            //sq_spi_download_write_rst();

        }
#endif


        /*
        	c = len;
        	p = data;
        	while(c--) {
        	printk("%c",*p++);
        	}
        	printk("\n");
        */


#if 1
        spi_message_init(&msg);
        memset(&xfer, 0, sizeof(struct spi_transfer));

        //SPI_DOWNLOAD_DBG(" bits_per_word= %d",msg.spi->bits_per_word);
        xfer.tx_buf = buf;



//	xfer.tx_buf = tx_buf;
        xfer.len = SET_TX_RX_LEN(len, 0);
        spi_message_add_tail(&xfer, &msg);
#if (SPI_CTRL_GPIO_EN == 1 )
        sq_spi_download_write_before();
#endif

        err = spi_sync(sq_spi_download_device, &msg);


#if (SPI_CTRL_GPIO_EN == 1 )
        //sq_spi_download_write_chk();

    } while (sq_spi_download_write_chk() != 0 );
#endif
#endif

    kfree(buf);

//	SPI_DOWNLOAD_DBG(" <============== sq_spi_download_write end ===============>");
    return 0;

}
Example #8
0
static int ar7646_read_data(struct device *dev, u16 *x, u16 *y, u16 *z1, u16 *z2)
{
	struct spi_device	*spi = to_spi_device(dev);
	struct ar7646		*ts = dev_get_drvdata(dev);
	struct ser_req		*req = kzalloc(sizeof *req, GFP_KERNEL);
	int			status;
	int			use_internal;

	u8 tx_buf[6][2],c = 0;
	u16 rx_buf[6];
	if (!req)
		return -ENOMEM;

	spi_message_init(&req->msg);


	tx_buf[c][0] = 0x01;
	tx_buf[c][1] = (u8)((u16)0xd7 << 1);
	req->xfer[c].tx_buf = tx_buf[c];	
	req->xfer[c].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[c].rx_buf = &rx_buf[c];//tt			
	spi_message_add_tail(&req->xfer[c], &req->msg);	
	c++;

	tx_buf[c][0] = 0x01;
	tx_buf[c][1] = ((READ_12BIT_VREF(d_x)| AR_PD10_ALL_ON) << 1);	
	req->xfer[c].tx_buf = tx_buf[c];	
	req->xfer[c].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[c].rx_buf = &rx_buf[c];//tt			
	spi_message_add_tail(&req->xfer[c], &req->msg);	
	c++;

	tx_buf[c][0] = 0x01;
	tx_buf[c][1] = ((READ_12BIT_VREF(d_y)| AR_PD10_ALL_ON) << 1);	
	req->xfer[c].tx_buf = tx_buf[c];	
	req->xfer[c].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[c].rx_buf = &rx_buf[c];//tt			
	spi_message_add_tail(&req->xfer[c], &req->msg);	
	c++;

	tx_buf[c][0] = 0x01;
	tx_buf[c][1] = ((READ_12BIT_VREF(d_z1)| AR_PD10_ALL_ON) << 1);	
	req->xfer[c].tx_buf = tx_buf[c];	
	req->xfer[c].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[c].rx_buf = &rx_buf[c];//tt			
	spi_message_add_tail(&req->xfer[c], &req->msg);	
	c++;

	tx_buf[c][0] = 0x01;
	tx_buf[c][1] = ((READ_12BIT_VREF(d_z2)| AR_PD10_ALL_ON) << 1);	
	req->xfer[c].tx_buf = tx_buf[c];	
	req->xfer[c].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[c].rx_buf = &rx_buf[c];//tt			
	spi_message_add_tail(&req->xfer[c], &req->msg);	
	c++;

	tx_buf[c][0] = 0x01;
	tx_buf[c][1] = 0xe0 << 1;
	req->xfer[c].tx_buf = tx_buf[c];	
	req->xfer[c].len = SET_TX_RX_LEN(2, 2);		
	req->xfer[c].rx_buf = &rx_buf[c];//tt			
	spi_message_add_tail(&req->xfer[c], &req->msg);		
	
	
//	ts->irq_disabled = 1;
	disable_irq(spi->irq);
	status = spi_sync(spi, &req->msg);
//	ts->irq_disabled = 0;
	enable_irq(spi->irq);

	/* on-wire is a must-ignore bit, a BE12 value, then padding */
	rx_buf[1] = be16_to_cpu(rx_buf[1]);	
	*x = rx_buf[1] >> 4;
	*x &= 0x0fff;

	rx_buf[2] = be16_to_cpu(rx_buf[2]);	
	*y = rx_buf[2] >> 4;
	*y &= 0x0fff;

	rx_buf[3] = be16_to_cpu(rx_buf[3]);	
	*z1 = rx_buf[3] >> 4;
	*z1 &= 0x0fff;

	rx_buf[4] = be16_to_cpu(rx_buf[4]);	
	*z2 = rx_buf[4] >> 4;
	*z2 &= 0x0fff;


//	DEBUG("--tx=0x%4x rx =0x%4x -> 0x%4x\n",command,req->sample,status);
	kfree(req);
	return status;
	
}
Example #9
0
extern int
sq_spi_internal_normal_run(int autotest)
{
    /* Reset SPI controller */
  sq_spi_write(
  	sq_spi_read(SQ_SPI_FWCR) |
    SQ_SPI_SOFT_RST, 
    SQ_SPI_FWCR);
    
    /* Configure SPI controller */
	sq_spi_write(
#ifdef CONFIG_SQ8000
		SQ_SPI_MASTER_SIGNAL_CTL_HW |
		SQ_SPI_MASTER_SIGNAL_ACT_NO |		
		SQ_SPI_MODE_MASTER |
#endif
		SQ_SPI_SOFT_N_RST |
		SQ_SPI_TXRX_N_RUN |
		SQ_SPI_CLK_IDLE_AST |
		SQ_SPI_TXRX_SIMULT_DIS |
		SQ_SPI_CPOL_0 |
		SQ_SPI_CPHA_0 |
		SQ_SPI_TX_LSB_FIRST |
		SQ_SPI_OP_LOOPBACK,
		SQ_SPI_FWCR);
			
	/* Enable SPI interrupt */
	sq_spi_write(
		//SQ_SPI_IER_RXFIFO_OVR_INT_EN |
    //SQ_SPI_IER_TXFIFO_INT_EN |
		SQ_SPI_IER_RXFIFO_INT_EN |
		SQ_SPI_IER_RX_COMPLETE_INT_EN,
		SQ_SPI_IER);

	/* Configure FIFO and clear Tx & Rx FIFO */
	sq_spi_write(
		SQ_SPI_RXFIFO_INT_TRIGGER_LEVEL_4 |
		SQ_SPI_TXFIFO_INT_TRIGGER_LEVEL_4 |
		SQ_SPI_RXFIFO_CLR |
		SQ_SPI_TXFIFO_CLR,
		SQ_SPI_FCR);
     
	/* Set the SPI slaves select and characteristic control register */
	sq_spi_write(
		SQ_SPI_CHAR_LEN_8 |
		SQ_SPI_SLAVE_SEL_0 |
		SQ_SPI_CLK_DIV(LOOKBACK_DIV),
		SQ_SPI_SSCR);

	/* Config SPI clock delay */
	sq_spi_write(
		SQ_SPI_PBTXRX_DELAY_NONE |
		SQ_SPI_PBCT_DELAY_NONE |
		SQ_SPI_PBCA_DELAY_1_2,
		SQ_SPI_DLYCR);


	/* Set per char length */
	sq_spi_set_current_mode(MODE_CHAR_LEN_8);
	/* Clear pattern buffer and compare buffer */
	memset(sq_spi_pattern_buf, 0x0, PATTERN_BUF_SIZE);
	memset(sq_spi_cmpr_buf, 0x0, PATTERN_BUF_SIZE);

	/* Make test pattern */
	sq_spi_make_test_pattern(sq_spi_pattern_buf, PATTERN_BUF_SIZE);

	if (sq_spi_transfer(sq_spi_pattern_buf, sq_spi_cmpr_buf, SET_TX_RX_LEN(PATTERN_BUF_SIZE, PATTERN_BUF_SIZE)))
		return -1;
	return sq_spi_compare_memory(sq_spi_pattern_buf, sq_spi_cmpr_buf, PATTERN_BUF_SIZE, autotest);

}