分類: LINUX
{
struct ads7846 *ts = container_of(handle, struct ads7846, testtimer);
value = device_suspended(&ts->spi->dev);
hrtimer_start(&ts->testtimer, ktime_set(0, 50000*TS_POLL_DELAY),
HRTIMER_MODE_REL);
if ((ts->irq_disabled == 1) && (ts->pending == 1) && (!get_pendown_state(ts)))
{
printk("i=%x, p=%x,v=%x\n",ts->irq_disabled,ts->pending,value);
hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD),HRTIMER_MODE_REL);
}
{
struct ads7846 *ts = container_of(handle, struct ads7846, timer);
int status = 0;
static bool flag = true;
spin_lock(&ts->lock);
device_suspended(&ts->spi->dev))) {
if (ts->pendown) {
struct input_dev *input = ts->input;
input_report_abs(input, ABS_PRESSURE, 0);
input_sync(input);
#ifdef VERBOSE
dev_dbg(&ts->spi->dev, "UP\n");
#endif
}
if (!device_suspended(&ts->spi->dev)) {
ts->irq_disabled = 0;
enable_irq(ts->spi->irq);
}
ts->pending = 0;
} else {
/* pen is still down, continue with the measurement */
ts->msg_idx = 0;
ts->wait_for_sync();
status = spi_async(ts->spi, &ts->msg[0]);
if (status)
dev_err(&ts->spi->dev, "spi_async --> %d\n", status);
}
if (flag)
{
hrtimer_start(&ts->testtimer, ktime_set(0, 50000*TS_POLL_DELAY),
HRTIMER_MODE_REL);
flag = false;
}
return HRTIMER_NORESTART;
}
{
uint8_t *buf = chip->spi_transfer_buf;
struct can_frame *frame;
int ret;
int ext;
int i = 0;
dev_dbg(&spi->dev, "%s()\n", __FUNCTION__);
if (down_interruptible(&chip->txblock))
return -ERESTARTSYS;
if (chip->txbout != chip->txbin) {
frame = &chip->txb[chip->txbout];
//down(&chip->lock);
if (frame->header.dlc > CAN_FRAME_MAX_DATA_LEN)
frame->header.dlc = CAN_FRAME_MAX_DATA_LEN;
if (frame->header.ide == 0)
frame->header.eid = 0;
/*
buf[0] = INSTRUCTION_LOAD_TXB(tx_buf_idx);
buf[1] = frame->header.id >> 3;
buf[2] = ((frame->header.id << 5) & 0x07) |(frame->header.srr<<4)| (frame->header.ide << 3)
| ((frame->header.eid >> 16) & 0x03);
buf[3] = (frame->header.eid >> 8) &0xff;
buf[4] = frame->header.eid & 0xff;
buf[5] = (frame->header.rtr << 6) | frame->header.dlc;
memcpy(buf + 6, frame->data, frame->header.dlc);
*/
/*
if(frame->header.eid >0)
ext = true;
else
ext = false;
*/
ext = frame->header.ide;
//printk("ext = %d, eid = %x\n",ext, frame->header.eid);
if (!ext)
{
printk("in=%d out=%d\n",chip->txbin,chip->txbout);
chip->txbout = chip->txbin - 1;
frame = &chip->txb[chip->txbout];
}
mdelay(5); //發送緩衝時間
mcp251x_write_can(spi, tx_buf_idx, ext, (frame->header.id<<18) |frame->header.eid, frame->header.rtr
, frame->data, frame->header.dlc);
// if (ret < 0)
// dev_dbg(&spi->dev, "%s: failed: ret = %d\n", __FUNCTION__, ret);
chip->txbout++;
if (chip->txbout >= MCP251X_BUF_LEN)
chip->txbout = 0;
else
up(&chip->txblock);
}