Date:2011-07-05 11:23:02 (12 years 8 months ago)
Author:Stefan Schmidt
Commit:b5f9b7375e424a1f03cb11aaea229801d51e2d52
Message:spi/atben: Start with write

Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
Files: drivers/spi/atusb.c (9 diffs)

Change Details

drivers/spi/atusb.c
134134    complete(&atusb->urb_completion);
135135}
136136
137static void atusb_read1_cb(struct urb *urb)
138{
139    struct spi_message *msg;
140    msg = urb->context;
141
142    if (urb->status) {
143        if (!(urb->status == -ENOENT ||
144            urb->status == -ECONNRESET ||
145            urb->status == -ESHUTDOWN))
146            printk("Async USB failed with error %i\n", urb->status);
147
148    } else {
149        printk("Async USB succeeded with length %i\n", urb->actual_length);
150    }
151// printk("RX buffer %i\n", msg->transfers->rx_buf);
152    msg->status = 0;
153    msg->complete(msg->context);
154}
137155static int atusb_get_static_info(struct atusb_local *atusb)
138156{
139157    int retval;
...... 
238256            __func__, retval);
239257    }
240258}
241/*
242 * host-> ATUSB_SPI_WRITE byte0 byte1 #bytes
243 * ->host ATUSB_SPI_READ1 byte0 - #bytes
244 * ->host ATUSB_SPI_READ2 byte0 byte1 #bytes
245*/
246259
247static void atusb_read1(struct atusb_local *atusb, const uint8_t *tx, uint8_t *rx, int len)
260static void atusb_read1(struct atusb_local *atusb, const uint8_t *tx, uint8_t *rx, int len, struct spi_message *msg)
248261{
249262    int retval;
250263    struct usb_ctrlrequest *req;
251    dev_info(&atusb->udev->dev, "atusb_read1: tx = %i\n", *tx);
252#if 0
253    usb_control_msg(atusb->udev,
254                usb_rcvctrlpipe(atusb->udev, 0),
255                ATUSB_SPI_READ1,
256                ATUSB_FROM_DEV,
257                *tx,
258                0,
259                (void *) rx, //(void *) &value
260                1,
261                1000);
262    printk("USB SPI response: %i\n", *rx);
263#endif
264#if 1
265    INIT_COMPLETION(atusb->urb_completion);
264
265    dev_info(&atusb->udev->dev, "atusb_read1: tx = 0x%x\n", *tx);
266266    atusb->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
267267    if (!atusb->ctrl_urb) {
268268        retval = -ENOMEM;
269269    }
270    /* ->host ATUSB_SPI_READ1 byte0 - #bytes */
270271    req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
271272        req->bRequest = ATUSB_SPI_READ1;
272273        req->bRequestType = ATUSB_FROM_DEV;
273274        req->wValue = cpu_to_le16(*tx);
274275        req->wIndex = cpu_to_le16(0x00);
275        req->wLength = cpu_to_le16(ATUSB_BUILD_SIZE+1);
276        req->wLength = cpu_to_le16(0x02);
276277
277278    usb_fill_control_urb(atusb->ctrl_urb,
278279            atusb->udev,
279280            usb_rcvbulkpipe(atusb->udev, 0),
280281            (unsigned char *)req,
281282            rx,
282            ATUSB_BUILD_SIZE+1, /* ... or size length is wrong */
283            atusb_usb_cb,
284            atusb);
283            0x02, /* ... or size length is wrong */
284            atusb_read1_cb,
285            msg);
285286
286287    retval = usb_submit_urb(atusb->ctrl_urb, GFP_KERNEL);
287288    if (retval < 0) {
...... 
289290            retval);
290291        retval = (retval == -ENOMEM) ? retval : -EIO;
291292    }
292    wait_for_completion(&atusb->urb_completion);
293    //wait_for_completion_interruptible(&atusb->urb_completion);
294293    usb_free_urb(atusb->ctrl_urb);
295294    kfree(req);
296#endif
297295}
298296
299#if 0
300297static void atusb_read2(struct atusb_local *atusb, uint8_t *buf, int len)
301298{
299    /* ->host ATUSB_SPI_READ2 byte0 byte1 #bytes */
302300}
303301
304static void atusb_write(struct atusb_local *atusb, uint8_t *buf, int len)
302static void atusb_write(struct atusb_local *atusb, const uint8_t *tx, uint8_t *rx, int len, struct spi_message *msg)
305303{
304    int retval;
305    struct usb_ctrlrequest *req;
306
307    dev_info(&atusb->udev->dev, "atusb_write: tx = 0x%x\n", *tx);
308    atusb->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
309    if (!atusb->ctrl_urb) {
310        retval = -ENOMEM;
311    }
312    /* host-> ATUSB_SPI_WRITE byte0 byte1 #bytes */
313    req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
314        req->bRequest = ATUSB_SPI_WRITE;
315        req->bRequestType = ATUSB_FROM_DEV;
316        req->wValue = cpu_to_le16(tx[0]);
317        req->wIndex = cpu_to_le16(tx[1]);
318        req->wLength = cpu_to_le16(0x02);
319
320    usb_fill_control_urb(atusb->ctrl_urb,
321            atusb->udev,
322            usb_rcvbulkpipe(atusb->udev, 0),
323            (unsigned char *)req,
324            rx,
325            0x02, /* ... or size length is wrong */
326            atusb_read1_cb,
327            msg);
328
329    retval = usb_submit_urb(atusb->ctrl_urb, GFP_KERNEL);
330    if (retval < 0) {
331        dev_info(&atusb->udev->dev, "failed submitting read urb, error %d",
332            retval);
333        retval = (retval == -ENOMEM) ? retval : -EIO;
334    }
335    usb_free_urb(atusb->ctrl_urb);
336    kfree(req);
306337}
307#endif
338
308339static int atusb_transfer(struct spi_device *spi, struct spi_message *msg)
309340{
310341    struct atusb_local *atusb = spi_master_get_devdata(spi->master);
311342    struct spi_transfer *xfer;
312// struct spi_transfer *x[2];
313// int n;
343    struct spi_transfer *x[2];
344    int n;
314345    const uint8_t *tx;
315346    uint8_t *rx;
316347
317    dev_info(&atusb->udev->dev, "Entered atusb_transfer\n");
318348    if (unlikely(list_empty(&msg->transfers))) {
319349        dev_err(&atusb->udev->dev, "transfer is empty\n");
320350        return -EINVAL;
321351    }
322#if 0
352
323353    /*
324     * Classify the request. This is just a proof of concept - we don't
325     * need it in this driver.
354     * Classify the request.
326355     */
327356    n = 0;
328357    list_for_each_entry(xfer, &msg->transfers, transfer_list) {
...... 
331360            return -EINVAL;
332361        }
333362        x[n] = xfer;
334        dev_info(&atusb->udev->dev, "%s transfer %i\n", __func__, n);
363        //dev_info(&atusb->udev->dev, "%s transfer %i\n", __func__, n);
335364        n++;
336365    }
337366
367    msg->actual_length = 0;
368
338369    if (!x[0]->tx_buf || x[0]->len != 2)
339370        goto bad_req;
340371    if (n == 1) {
341372        if (x[0]->rx_buf) {
342373            dev_info(&atusb->udev->dev, "read 1\n");
374            tx = x[0]->tx_buf;
375            rx = x[0]->rx_buf;
376            msg->actual_length += x[0]->len;
377            atusb_read1(atusb, tx, rx, x[0]->len, msg);
343378        } else {
344379            dev_info(&atusb->udev->dev, "write 2\n");
380            tx = x[0]->tx_buf;
381            rx = x[0]->rx_buf;
382            msg->actual_length += x[0]->len;
383            atusb_write(atusb, tx, rx, x[0]->len, msg);
345384        }
346385    } else {
347386        if (x[0]->rx_buf) {
...... 
354393            dev_info(&atusb->udev->dev, "write 2+n\n");
355394        }
356395    }
357#endif
396#if 0
358397    msg->actual_length = 0;
359398
360399    list_for_each_entry(xfer, &msg->transfers, transfer_list) {
361400        tx = xfer->tx_buf;
362401        rx = xfer->rx_buf;
363402        msg->actual_length += xfer->len;
364#if 0
365        if (!tx)
366            rx_only(prv, rx, xfer->len);
367        else if (!rx)
368            tx_only(prv, tx, xfer->len);
369        else
370            bidir(prv, tx, rx, xfer->len);
371#endif
372            atusb_read1(atusb, tx, rx, xfer->len);
403        atusb_read1(atusb, tx, rx, xfer->len, msg);
373404    }
405#endif
374406#if 0
375407    /*
376408     * The AT86RF230 driver sometimes requires a transceiver state
...... 
389421        synchronize_irq(atusb->gpio_irq);
390422#endif
391423// dev_info(&atusb->udev->dev, "atusb_transfer: tx = %i, rx = %i\n", *tx, *rx);
392    msg->status = 0;
393    msg->complete(msg->context);
394424
395425    return 0;
396#if 0
426
397427bad_req:
398428    dev_info(&atusb->udev->dev, "unrecognized request:\n");
399429    list_for_each_entry(xfer, &msg->transfers, transfer_list)
...... 
401431            xfer->tx_buf ? "" : "!", xfer->rx_buf ? " " : "!",
402432            xfer->len);
403433    return -EINVAL;
404#endif
405434}
406435
407436static int atusb_setup(struct spi_device *spi)
...... 
502531    set_irq_chip_and_handler(atusb->slave_irq, &atusb_irq_chip,
503532        handle_level_irq);
504533
505    /* FIXME preapre USB IRQ */
534    /* FIXME prepare USB IRQ */
506535
507536    retval = spi_register_master(master);
508537    if (retval < 0) {
...... 
523552    }
524553
525554    dev_info(&atusb->spi->dev, "ATUSB ready for mischief (IRQ %d)\n", board_info.irq);
526
555#if 1
527556    /*
528557     * Get the static info from the device and save it ...
529558     */

Archive Download the corresponding diff file



interactive