uvscom.c (193045) | uvscom.c (194228) |
---|---|
1/* $NetBSD: usb/uvscom.c,v 1.1 2002/03/19 15:08:42 augustss Exp $ */ 2 3#include <sys/cdefs.h> | 1/* $NetBSD: usb/uvscom.c,v 1.1 2002/03/19 15:08:42 augustss Exp $ */ 2 3#include <sys/cdefs.h> |
4__FBSDID("$FreeBSD: head/sys/dev/usb/serial/uvscom.c 193045 2009-05-29 18:46:57Z thompsa $"); | 4__FBSDID("$FreeBSD: head/sys/dev/usb/serial/uvscom.c 194228 2009-06-15 01:02:43Z thompsa $"); |
5 6/*- 7 * Copyright (c) 2001-2003, 2005 Shunsuke Akiyama <akiyama@jp.FreeBSD.org>. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: --- 186 unchanged lines hidden (view full) --- 199 .direction = UE_DIR_IN, 200 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,}, 201 .bufsize = 0, /* use wMaxPacketSize */ 202 .callback = &uvscom_intr_callback, 203 }, 204}; 205 206static const struct ucom_callback uvscom_callback = { | 5 6/*- 7 * Copyright (c) 2001-2003, 2005 Shunsuke Akiyama <akiyama@jp.FreeBSD.org>. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: --- 186 unchanged lines hidden (view full) --- 199 .direction = UE_DIR_IN, 200 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,}, 201 .bufsize = 0, /* use wMaxPacketSize */ 202 .callback = &uvscom_intr_callback, 203 }, 204}; 205 206static const struct ucom_callback uvscom_callback = { |
207 .usb2_com_cfg_get_status = &uvscom_cfg_get_status, 208 .usb2_com_cfg_set_dtr = &uvscom_cfg_set_dtr, 209 .usb2_com_cfg_set_rts = &uvscom_cfg_set_rts, 210 .usb2_com_cfg_set_break = &uvscom_cfg_set_break, 211 .usb2_com_cfg_param = &uvscom_cfg_param, 212 .usb2_com_cfg_open = &uvscom_cfg_open, 213 .usb2_com_cfg_close = &uvscom_cfg_close, 214 .usb2_com_pre_open = &uvscom_pre_open, 215 .usb2_com_pre_param = &uvscom_pre_param, 216 .usb2_com_start_read = &uvscom_start_read, 217 .usb2_com_stop_read = &uvscom_stop_read, 218 .usb2_com_start_write = &uvscom_start_write, 219 .usb2_com_stop_write = &uvscom_stop_write, | 207 .ucom_cfg_get_status = &uvscom_cfg_get_status, 208 .ucom_cfg_set_dtr = &uvscom_cfg_set_dtr, 209 .ucom_cfg_set_rts = &uvscom_cfg_set_rts, 210 .ucom_cfg_set_break = &uvscom_cfg_set_break, 211 .ucom_cfg_param = &uvscom_cfg_param, 212 .ucom_cfg_open = &uvscom_cfg_open, 213 .ucom_cfg_close = &uvscom_cfg_close, 214 .ucom_pre_open = &uvscom_pre_open, 215 .ucom_pre_param = &uvscom_pre_param, 216 .ucom_start_read = &uvscom_start_read, 217 .ucom_stop_read = &uvscom_stop_read, 218 .ucom_start_write = &uvscom_start_write, 219 .ucom_stop_write = &uvscom_stop_write, |
220}; 221 222static const struct usb_device_id uvscom_devs[] = { 223 /* SUNTAC U-Cable type A4 */ 224 {USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS144L4, 0)}, 225 /* SUNTAC U-Cable type D2 */ 226 {USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_DS96L, 0)}, 227 /* SUNTAC Ir-Trinity */ --- 33 unchanged lines hidden (view full) --- 261 return (ENXIO); 262 } 263 if (uaa->info.bConfigIndex != UVSCOM_CONFIG_INDEX) { 264 return (ENXIO); 265 } 266 if (uaa->info.bIfaceIndex != UVSCOM_IFACE_INDEX) { 267 return (ENXIO); 268 } | 220}; 221 222static const struct usb_device_id uvscom_devs[] = { 223 /* SUNTAC U-Cable type A4 */ 224 {USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS144L4, 0)}, 225 /* SUNTAC U-Cable type D2 */ 226 {USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_DS96L, 0)}, 227 /* SUNTAC Ir-Trinity */ --- 33 unchanged lines hidden (view full) --- 261 return (ENXIO); 262 } 263 if (uaa->info.bConfigIndex != UVSCOM_CONFIG_INDEX) { 264 return (ENXIO); 265 } 266 if (uaa->info.bIfaceIndex != UVSCOM_IFACE_INDEX) { 267 return (ENXIO); 268 } |
269 return (usb2_lookup_id_by_uaa(uvscom_devs, sizeof(uvscom_devs), uaa)); | 269 return (usbd_lookup_id_by_uaa(uvscom_devs, sizeof(uvscom_devs), uaa)); |
270} 271 272static int 273uvscom_attach(device_t dev) 274{ 275 struct usb_attach_arg *uaa = device_get_ivars(dev); 276 struct uvscom_softc *sc = device_get_softc(dev); 277 int error; 278 | 270} 271 272static int 273uvscom_attach(device_t dev) 274{ 275 struct usb_attach_arg *uaa = device_get_ivars(dev); 276 struct uvscom_softc *sc = device_get_softc(dev); 277 int error; 278 |
279 device_set_usb2_desc(dev); | 279 device_set_usb_desc(dev); |
280 mtx_init(&sc->sc_mtx, "uvscom", NULL, MTX_DEF); 281 282 sc->sc_udev = uaa->device; 283 284 DPRINTF("sc=%p\n", sc); 285 286 sc->sc_iface_no = uaa->info.bIfaceNum; 287 sc->sc_iface_index = UVSCOM_IFACE_INDEX; 288 | 280 mtx_init(&sc->sc_mtx, "uvscom", NULL, MTX_DEF); 281 282 sc->sc_udev = uaa->device; 283 284 DPRINTF("sc=%p\n", sc); 285 286 sc->sc_iface_no = uaa->info.bIfaceNum; 287 sc->sc_iface_index = UVSCOM_IFACE_INDEX; 288 |
289 error = usb2_transfer_setup(uaa->device, &sc->sc_iface_index, | 289 error = usbd_transfer_setup(uaa->device, &sc->sc_iface_index, |
290 sc->sc_xfer, uvscom_config, UVSCOM_N_TRANSFER, sc, &sc->sc_mtx); 291 292 if (error) { 293 DPRINTF("could not allocate all USB transfers!\n"); 294 goto detach; 295 } 296 sc->sc_line = UVSCOM_LINE_INIT; 297 298 /* clear stall at first run */ 299 mtx_lock(&sc->sc_mtx); | 290 sc->sc_xfer, uvscom_config, UVSCOM_N_TRANSFER, sc, &sc->sc_mtx); 291 292 if (error) { 293 DPRINTF("could not allocate all USB transfers!\n"); 294 goto detach; 295 } 296 sc->sc_line = UVSCOM_LINE_INIT; 297 298 /* clear stall at first run */ 299 mtx_lock(&sc->sc_mtx); |
300 usb2_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_WR]); 301 usb2_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_RD]); | 300 usbd_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_WR]); 301 usbd_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_RD]); |
302 mtx_unlock(&sc->sc_mtx); 303 | 302 mtx_unlock(&sc->sc_mtx); 303 |
304 error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc, | 304 error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc, |
305 &uvscom_callback, &sc->sc_mtx); 306 if (error) { 307 goto detach; 308 } 309 /* start interrupt pipe */ 310 mtx_lock(&sc->sc_mtx); | 305 &uvscom_callback, &sc->sc_mtx); 306 if (error) { 307 goto detach; 308 } 309 /* start interrupt pipe */ 310 mtx_lock(&sc->sc_mtx); |
311 usb2_transfer_start(sc->sc_xfer[UVSCOM_INTR_DT_RD]); | 311 usbd_transfer_start(sc->sc_xfer[UVSCOM_INTR_DT_RD]); |
312 mtx_unlock(&sc->sc_mtx); 313 314 return (0); 315 316detach: 317 uvscom_detach(dev); 318 return (ENXIO); 319} 320 321static int 322uvscom_detach(device_t dev) 323{ 324 struct uvscom_softc *sc = device_get_softc(dev); 325 326 DPRINTF("sc=%p\n", sc); 327 328 /* stop interrupt pipe */ 329 330 if (sc->sc_xfer[UVSCOM_INTR_DT_RD]) | 312 mtx_unlock(&sc->sc_mtx); 313 314 return (0); 315 316detach: 317 uvscom_detach(dev); 318 return (ENXIO); 319} 320 321static int 322uvscom_detach(device_t dev) 323{ 324 struct uvscom_softc *sc = device_get_softc(dev); 325 326 DPRINTF("sc=%p\n", sc); 327 328 /* stop interrupt pipe */ 329 330 if (sc->sc_xfer[UVSCOM_INTR_DT_RD]) |
331 usb2_transfer_stop(sc->sc_xfer[UVSCOM_INTR_DT_RD]); | 331 usbd_transfer_stop(sc->sc_xfer[UVSCOM_INTR_DT_RD]); |
332 | 332 |
333 usb2_com_detach(&sc->sc_super_ucom, &sc->sc_ucom, 1); 334 usb2_transfer_unsetup(sc->sc_xfer, UVSCOM_N_TRANSFER); | 333 ucom_detach(&sc->sc_super_ucom, &sc->sc_ucom, 1); 334 usbd_transfer_unsetup(sc->sc_xfer, UVSCOM_N_TRANSFER); |
335 mtx_destroy(&sc->sc_mtx); 336 337 return (0); 338} 339 340static void 341uvscom_write_callback(struct usb_xfer *xfer) 342{ 343 struct uvscom_softc *sc = xfer->priv_sc; 344 uint32_t actlen; 345 346 switch (USB_GET_STATE(xfer)) { 347 case USB_ST_SETUP: 348 case USB_ST_TRANSFERRED: 349tr_setup: | 335 mtx_destroy(&sc->sc_mtx); 336 337 return (0); 338} 339 340static void 341uvscom_write_callback(struct usb_xfer *xfer) 342{ 343 struct uvscom_softc *sc = xfer->priv_sc; 344 uint32_t actlen; 345 346 switch (USB_GET_STATE(xfer)) { 347 case USB_ST_SETUP: 348 case USB_ST_TRANSFERRED: 349tr_setup: |
350 if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0, | 350 if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0, |
351 UVSCOM_BULK_BUF_SIZE, &actlen)) { 352 353 xfer->frlengths[0] = actlen; | 351 UVSCOM_BULK_BUF_SIZE, &actlen)) { 352 353 xfer->frlengths[0] = actlen; |
354 usb2_start_hardware(xfer); | 354 usbd_transfer_submit(xfer); |
355 } 356 return; 357 358 default: /* Error */ 359 if (xfer->error != USB_ERR_CANCELLED) { 360 /* try to clear stall first */ 361 xfer->flags.stall_pipe = 1; 362 goto tr_setup; --- 4 unchanged lines hidden (view full) --- 367 368static void 369uvscom_read_callback(struct usb_xfer *xfer) 370{ 371 struct uvscom_softc *sc = xfer->priv_sc; 372 373 switch (USB_GET_STATE(xfer)) { 374 case USB_ST_TRANSFERRED: | 355 } 356 return; 357 358 default: /* Error */ 359 if (xfer->error != USB_ERR_CANCELLED) { 360 /* try to clear stall first */ 361 xfer->flags.stall_pipe = 1; 362 goto tr_setup; --- 4 unchanged lines hidden (view full) --- 367 368static void 369uvscom_read_callback(struct usb_xfer *xfer) 370{ 371 struct uvscom_softc *sc = xfer->priv_sc; 372 373 switch (USB_GET_STATE(xfer)) { 374 case USB_ST_TRANSFERRED: |
375 usb2_com_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen); | 375 ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen); |
376 377 case USB_ST_SETUP: 378tr_setup: 379 xfer->frlengths[0] = xfer->max_data_length; | 376 377 case USB_ST_SETUP: 378tr_setup: 379 xfer->frlengths[0] = xfer->max_data_length; |
380 usb2_start_hardware(xfer); | 380 usbd_transfer_submit(xfer); |
381 return; 382 383 default: /* Error */ 384 if (xfer->error != USB_ERR_CANCELLED) { 385 /* try to clear stall first */ 386 xfer->flags.stall_pipe = 1; 387 goto tr_setup; 388 } --- 6 unchanged lines hidden (view full) --- 395{ 396 struct uvscom_softc *sc = xfer->priv_sc; 397 uint8_t buf[2]; 398 399 switch (USB_GET_STATE(xfer)) { 400 case USB_ST_TRANSFERRED: 401 if (xfer->actlen >= 2) { 402 | 381 return; 382 383 default: /* Error */ 384 if (xfer->error != USB_ERR_CANCELLED) { 385 /* try to clear stall first */ 386 xfer->flags.stall_pipe = 1; 387 goto tr_setup; 388 } --- 6 unchanged lines hidden (view full) --- 395{ 396 struct uvscom_softc *sc = xfer->priv_sc; 397 uint8_t buf[2]; 398 399 switch (USB_GET_STATE(xfer)) { 400 case USB_ST_TRANSFERRED: 401 if (xfer->actlen >= 2) { 402 |
403 usb2_copy_out(xfer->frbuffers, 0, buf, sizeof(buf)); | 403 usbd_copy_out(xfer->frbuffers, 0, buf, sizeof(buf)); |
404 405 sc->sc_lsr = 0; 406 sc->sc_msr = 0; 407 sc->sc_unit_status = buf[1]; 408 409 if (buf[0] & UVSCOM_TXRDY) { 410 sc->sc_lsr |= ULSR_TXRDY; 411 } --- 8 unchanged lines hidden (view full) --- 420 } 421 if (buf[1] & UVSCOM_DCD) { 422 sc->sc_msr |= SER_DCD; 423 } 424 /* 425 * the UCOM layer will ignore this call if the TTY 426 * device is closed! 427 */ | 404 405 sc->sc_lsr = 0; 406 sc->sc_msr = 0; 407 sc->sc_unit_status = buf[1]; 408 409 if (buf[0] & UVSCOM_TXRDY) { 410 sc->sc_lsr |= ULSR_TXRDY; 411 } --- 8 unchanged lines hidden (view full) --- 420 } 421 if (buf[1] & UVSCOM_DCD) { 422 sc->sc_msr |= SER_DCD; 423 } 424 /* 425 * the UCOM layer will ignore this call if the TTY 426 * device is closed! 427 */ |
428 usb2_com_status_change(&sc->sc_ucom); | 428 ucom_status_change(&sc->sc_ucom); |
429 } 430 case USB_ST_SETUP: 431tr_setup: 432 xfer->frlengths[0] = xfer->max_data_length; | 429 } 430 case USB_ST_SETUP: 431tr_setup: 432 xfer->frlengths[0] = xfer->max_data_length; |
433 usb2_start_hardware(xfer); | 433 usbd_transfer_submit(xfer); |
434 return; 435 436 default: /* Error */ 437 if (xfer->error != USB_ERR_CANCELLED) { 438 /* try to clear stall first */ 439 xfer->flags.stall_pipe = 1; 440 goto tr_setup; 441 } --- 185 unchanged lines hidden (view full) --- 627 uvscom_cfg_write(sc, UVSCOM_SHUTDOWN, 0); 628} 629 630static void 631uvscom_start_read(struct ucom_softc *ucom) 632{ 633 struct uvscom_softc *sc = ucom->sc_parent; 634 | 434 return; 435 436 default: /* Error */ 437 if (xfer->error != USB_ERR_CANCELLED) { 438 /* try to clear stall first */ 439 xfer->flags.stall_pipe = 1; 440 goto tr_setup; 441 } --- 185 unchanged lines hidden (view full) --- 627 uvscom_cfg_write(sc, UVSCOM_SHUTDOWN, 0); 628} 629 630static void 631uvscom_start_read(struct ucom_softc *ucom) 632{ 633 struct uvscom_softc *sc = ucom->sc_parent; 634 |
635 usb2_transfer_start(sc->sc_xfer[UVSCOM_BULK_DT_RD]); | 635 usbd_transfer_start(sc->sc_xfer[UVSCOM_BULK_DT_RD]); |
636} 637 638static void 639uvscom_stop_read(struct ucom_softc *ucom) 640{ 641 struct uvscom_softc *sc = ucom->sc_parent; 642 | 636} 637 638static void 639uvscom_stop_read(struct ucom_softc *ucom) 640{ 641 struct uvscom_softc *sc = ucom->sc_parent; 642 |
643 usb2_transfer_stop(sc->sc_xfer[UVSCOM_BULK_DT_RD]); | 643 usbd_transfer_stop(sc->sc_xfer[UVSCOM_BULK_DT_RD]); |
644} 645 646static void 647uvscom_start_write(struct ucom_softc *ucom) 648{ 649 struct uvscom_softc *sc = ucom->sc_parent; 650 | 644} 645 646static void 647uvscom_start_write(struct ucom_softc *ucom) 648{ 649 struct uvscom_softc *sc = ucom->sc_parent; 650 |
651 usb2_transfer_start(sc->sc_xfer[UVSCOM_BULK_DT_WR]); | 651 usbd_transfer_start(sc->sc_xfer[UVSCOM_BULK_DT_WR]); |
652} 653 654static void 655uvscom_stop_write(struct ucom_softc *ucom) 656{ 657 struct uvscom_softc *sc = ucom->sc_parent; 658 | 652} 653 654static void 655uvscom_stop_write(struct ucom_softc *ucom) 656{ 657 struct uvscom_softc *sc = ucom->sc_parent; 658 |
659 usb2_transfer_stop(sc->sc_xfer[UVSCOM_BULK_DT_WR]); | 659 usbd_transfer_stop(sc->sc_xfer[UVSCOM_BULK_DT_WR]); |
660} 661 662static void 663uvscom_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr) 664{ 665 struct uvscom_softc *sc = ucom->sc_parent; 666 667 *lsr = sc->sc_lsr; --- 7 unchanged lines hidden (view full) --- 675 usb_error_t err; 676 677 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 678 req.bRequest = index; 679 USETW(req.wValue, value); 680 USETW(req.wIndex, 0); 681 USETW(req.wLength, 0); 682 | 660} 661 662static void 663uvscom_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr) 664{ 665 struct uvscom_softc *sc = ucom->sc_parent; 666 667 *lsr = sc->sc_lsr; --- 7 unchanged lines hidden (view full) --- 675 usb_error_t err; 676 677 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 678 req.bRequest = index; 679 USETW(req.wValue, value); 680 USETW(req.wIndex, 0); 681 USETW(req.wLength, 0); 682 |
683 err = usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom, | 683 err = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom, |
684 &req, NULL, 0, 1000); 685 if (err) { 686 DPRINTFN(0, "device request failed, err=%s " | 684 &req, NULL, 0, 1000); 685 if (err) { 686 DPRINTFN(0, "device request failed, err=%s " |
687 "(ignored)\n", usb2_errstr(err)); | 687 "(ignored)\n", usbd_errstr(err)); |
688 } 689} 690 691static uint16_t 692uvscom_cfg_read_status(struct uvscom_softc *sc) 693{ 694 struct usb_device_request req; 695 usb_error_t err; 696 uint8_t data[2]; 697 698 req.bmRequestType = UT_READ_VENDOR_DEVICE; 699 req.bRequest = UVSCOM_READ_STATUS; 700 USETW(req.wValue, 0); 701 USETW(req.wIndex, 0); 702 USETW(req.wLength, 2); 703 | 688 } 689} 690 691static uint16_t 692uvscom_cfg_read_status(struct uvscom_softc *sc) 693{ 694 struct usb_device_request req; 695 usb_error_t err; 696 uint8_t data[2]; 697 698 req.bmRequestType = UT_READ_VENDOR_DEVICE; 699 req.bRequest = UVSCOM_READ_STATUS; 700 USETW(req.wValue, 0); 701 USETW(req.wIndex, 0); 702 USETW(req.wLength, 2); 703 |
704 err = usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom, | 704 err = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom, |
705 &req, data, 0, 1000); 706 if (err) { 707 DPRINTFN(0, "device request failed, err=%s " | 705 &req, data, 0, 1000); 706 if (err) { 707 DPRINTFN(0, "device request failed, err=%s " |
708 "(ignored)\n", usb2_errstr(err)); | 708 "(ignored)\n", usbd_errstr(err)); |
709 } 710 return (data[0] | (data[1] << 8)); 711} | 709 } 710 return (data[0] | (data[1] << 8)); 711} |