53#include <sys/stdint.h>
54#include <sys/stddef.h>
59#include <sys/kernel.h>
61#include <sys/module.h>
64#include <sys/condvar.h>
65#include <sys/sysctl.h>
67#include <sys/unistd.h>
68#include <sys/callout.h>
69#include <sys/malloc.h>
79#define USB_DEBUG_VAR uftdi_debug
87static SYSCTL_NODE(_hw_usb, OID_AUTO, uftdi, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
91static int uftdi_debug = 0;
93 &uftdi_debug, 0,
"Debug level");
96#define UFTDI_CONFIG_INDEX 0
122#define UFTDI_IBUFSIZE 2048
123#define UFTDI_IHDRSIZE 2
124#define UFTDI_OBUFSIZE 2048
125#define UFTDI_OPKTSIZE 64
145#define DEVF_BAUDBITS_HINDEX 0x01
146#define DEVF_BAUDCLK_12M 0X02
222 .flags = {.pipe_bof = 1,},
231 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
271#define UFTDI_DEV(v, p, i) \
272 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
280 UFTDI_DEV(BBELECTRONICS, 485USB9F_2W, 0),
281 UFTDI_DEV(BBELECTRONICS, 485USB9F_4W, 0),
282 UFTDI_DEV(BBELECTRONICS, 485USBTB_2W, 0),
283 UFTDI_DEV(BBELECTRONICS, 485USBTB_4W, 0),
288 UFTDI_DEV(BBELECTRONICS, USO9ML2DR_2, 0),
295 UFTDI_DEV(BBELECTRONICS, ZZ_PROG1_USB, 0),
299 UFTDI_DEV(DRESDENELEKTRONIK, SENSORTERMINALBOARD, 0),
300 UFTDI_DEV(DRESDENELEKTRONIK, WIRELESSHANDHELDTERMINAL, 0),
301 UFTDI_DEV(DRESDENELEKTRONIK, DE_RFNODE, 0),
302 UFTDI_DEV(DRESDENELEKTRONIK, LEVELSHIFTERSTICKLOWCOST, 0),
344 UFTDI_DEV(FTDI, CHAMSYS_24_MASTER_WING, 0),
347 UFTDI_DEV(FTDI, CHAMSYS_MIDI_TIMECODE, 0),
488 UFTDI_DEV(FTDI, RRCIRKITS_LOCOBUFFER, 0),
489 UFTDI_DEV(FTDI, SCIENCESCOPE_HS_LOGBOOK, 0),
490 UFTDI_DEV(FTDI, SCIENCESCOPE_LOGBOOKML, 0),
491 UFTDI_DEV(FTDI, SCIENCESCOPE_LS_LOGBOOK, 0),
521 UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13M, 0),
522 UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13S, 0),
523 UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13U, 0),
564 UFTDI_DEV(INTERBIOMETRICS, MINI_IOBOARD, 0),
571 UFTDI_DEV(LARSENBRUSGAARD, ALTITRACK, 0),
573 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0100, 0),
574 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0101, 0),
575 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0102, 0),
576 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0103, 0),
577 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0104, 0),
578 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0105, 0),
579 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0106, 0),
580 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0107, 0),
581 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0108, 0),
582 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0109, 0),
583 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010A, 0),
584 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010B, 0),
585 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010C, 0),
586 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010D, 0),
587 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010E, 0),
588 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010F, 0),
589 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0110, 0),
590 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0111, 0),
591 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0112, 0),
592 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0113, 0),
593 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0114, 0),
594 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0115, 0),
595 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0116, 0),
596 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0117, 0),
597 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0118, 0),
598 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0119, 0),
599 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011A, 0),
600 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011B, 0),
601 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011C, 0),
602 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011D, 0),
603 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011E, 0),
604 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011F, 0),
605 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0120, 0),
606 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0121, 0),
607 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0122, 0),
608 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0123, 0),
609 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0124, 0),
610 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0125, 0),
611 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0126, 0),
612 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0128, 0),
613 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0129, 0),
614 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012A, 0),
615 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012B, 0),
616 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012D, 0),
617 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012E, 0),
618 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012F, 0),
619 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0130, 0),
620 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0131, 0),
621 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0132, 0),
622 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0133, 0),
623 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0134, 0),
624 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0135, 0),
625 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0136, 0),
626 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0137, 0),
627 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0138, 0),
628 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0139, 0),
629 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013A, 0),
630 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013B, 0),
631 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013C, 0),
632 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013D, 0),
633 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013E, 0),
634 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013F, 0),
635 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0140, 0),
636 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0141, 0),
637 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0142, 0),
638 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0143, 0),
639 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0144, 0),
640 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0145, 0),
641 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0146, 0),
642 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0147, 0),
643 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0148, 0),
644 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0149, 0),
645 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014A, 0),
646 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014B, 0),
647 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014C, 0),
648 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014D, 0),
649 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014E, 0),
650 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014F, 0),
651 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0150, 0),
652 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0151, 0),
653 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0152, 0),
654 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0159, 0),
655 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015A, 0),
656 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015B, 0),
657 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015C, 0),
658 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015D, 0),
659 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015E, 0),
660 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015F, 0),
661 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0160, 0),
662 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0161, 0),
663 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0162, 0),
664 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0163, 0),
665 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0164, 0),
666 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0165, 0),
667 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0166, 0),
668 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0167, 0),
669 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0168, 0),
670 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0169, 0),
671 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016A, 0),
672 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016B, 0),
673 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016C, 0),
674 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016D, 0),
675 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016E, 0),
676 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016F, 0),
677 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0170, 0),
678 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0171, 0),
679 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0172, 0),
680 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0173, 0),
681 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0174, 0),
682 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0175, 0),
683 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0176, 0),
684 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0177, 0),
685 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0178, 0),
686 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0179, 0),
687 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017A, 0),
688 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017B, 0),
689 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017C, 0),
690 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017D, 0),
691 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017E, 0),
692 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017F, 0),
693 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0180, 0),
694 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0181, 0),
695 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0182, 0),
696 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0183, 0),
697 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0184, 0),
698 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0185, 0),
699 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0186, 0),
700 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0187, 0),
701 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0188, 0),
702 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0189, 0),
703 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018A, 0),
704 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018B, 0),
705 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018C, 0),
706 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018D, 0),
707 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018E, 0),
708 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018F, 0),
709 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0190, 0),
710 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0191, 0),
711 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0192, 0),
712 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0193, 0),
713 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0194, 0),
714 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0195, 0),
715 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0196, 0),
716 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0197, 0),
717 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0198, 0),
718 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0199, 0),
719 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019A, 0),
720 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019B, 0),
721 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019C, 0),
722 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019D, 0),
723 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019E, 0),
724 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019F, 0),
725 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A0, 0),
726 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A1, 0),
727 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A2, 0),
728 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A3, 0),
729 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A4, 0),
730 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A5, 0),
731 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A6, 0),
732 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A7, 0),
733 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A8, 0),
734 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A9, 0),
735 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AA, 0),
736 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AB, 0),
737 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AC, 0),
738 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AD, 0),
739 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AE, 0),
740 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AF, 0),
741 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B0, 0),
742 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B1, 0),
743 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B2, 0),
744 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B3, 0),
745 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B4, 0),
746 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B5, 0),
747 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B6, 0),
748 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B7, 0),
749 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B8, 0),
750 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B9, 0),
751 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BA, 0),
752 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BB, 0),
753 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BC, 0),
754 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BD, 0),
755 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BE, 0),
756 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BF, 0),
757 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C0, 0),
758 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C1, 0),
759 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C2, 0),
760 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C3, 0),
761 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C4, 0),
762 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C5, 0),
763 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C6, 0),
764 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C7, 0),
765 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C8, 0),
766 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C9, 0),
767 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CA, 0),
768 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CB, 0),
769 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CC, 0),
770 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CD, 0),
771 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CE, 0),
772 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CF, 0),
773 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D0, 0),
774 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D1, 0),
775 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D2, 0),
776 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D3, 0),
777 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D4, 0),
778 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D5, 0),
779 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D6, 0),
780 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D7, 0),
781 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D8, 0),
782 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D9, 0),
783 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DA, 0),
784 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DB, 0),
785 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DC, 0),
786 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DD, 0),
787 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DE, 0),
788 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DF, 0),
789 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E0, 0),
790 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E1, 0),
791 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E2, 0),
792 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E3, 0),
793 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E4, 0),
794 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E5, 0),
795 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E6, 0),
796 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E7, 0),
797 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E8, 0),
798 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E9, 0),
799 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EA, 0),
800 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EB, 0),
801 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EC, 0),
802 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01ED, 0),
803 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EE, 0),
804 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EF, 0),
805 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F0, 0),
806 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F1, 0),
807 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F2, 0),
808 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F3, 0),
809 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F4, 0),
810 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F5, 0),
811 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F6, 0),
812 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F7, 0),
813 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F8, 0),
814 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F9, 0),
815 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FA, 0),
816 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FB, 0),
817 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FC, 0),
818 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FD, 0),
819 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FE, 0),
820 UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FF, 0),
952 const char * product_name;
973 }
else if ((
id->driver_info & iface_bit) != 0)
1046 device_printf(sc->
sc_dev,
"Warning: unknown FTDI "
1047 "device type, bcdDevice=0x%04x, assuming 232R\n",
1077 printf(
"%s: skipping JTAG interface #%d for '%s' at %u.%u\n",
1078 device_get_name(
dev),
1086 return (BUS_PROBE_SPECIFIC);
1104 mtx_init(&sc->
sc_mtx,
"uftdi", NULL, MTX_DEF);
1114 device_printf(
dev,
"allocating USB "
1115 "transfers failed\n");
1156 device_claim_softc(
dev);
1169 mtx_destroy(&sc->
sc_mtx);
1170 device_free_softc(sc);
1238 while (buflen < UFTDI_OBUFSIZE - sc->sc_hdrlen - 1 &&
1309 pktlen = min(buflen, pktmax);
1329 DPRINTF(
"status change msr=0x%02x (0x%02x) "
1330 "lsr=0x%02x (0x%02x)\n", msr, sc->
sc_msr,
1363 DPRINTFN(2,
"DTR=%u\n", onoff);
1373 &
req, NULL, 0, 1000);
1384 DPRINTFN(2,
"RTS=%u\n", onoff);
1394 &
req, NULL, 0, 1000);
1405 DPRINTFN(2,
"BREAK=%u\n", onoff);
1421 &
req, NULL, 0, 1000);
1428static inline boolean_t
1431 return ((speed >= (target * 100) / 103) &&
1432 (speed <= (target * 100) / 97));
1440 const speed_t sio_speeds[] = {
1441 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
1448 for (i = 0; i < nitems(sio_speeds); ++i) {
1449 if (speed == sio_speeds[i]) {
1462 static const uint8_t encoded_fraction[8] = {0, 3, 2, 4, 1, 5, 6, 7};
1463 static const uint8_t roundoff_232a[16] = {
1464 0, 1, 0, 1, 0, -1, 2, 1,
1465 0, -1, -2, -3, 4, 3, 2, 1,
1467 uint32_t clk, divisor, fastclk_flag, frac, hwspeed;
1475 fastclk_flag = (1 << 17);
1485 if (speed < (clk >> 14) || speed > clk)
1510 divisor = (clk << 4) / speed;
1511 if ((divisor & 0xf) == 1)
1512 divisor &= 0xfffffff8;
1514 divisor += roundoff_232a[divisor & 0x0f];
1523 hwspeed = (clk << 3) / divisor;
1540 frac = divisor & 0x07;
1548 divisor |= (encoded_fraction[frac] << 14) | fastclk_flag;
1571 memset(cfg, 0,
sizeof(*cfg));
1580 if (t->c_cflag & CSTOPB)
1585 if (t->c_cflag & PARENB) {
1586 if (t->c_cflag & PARODD) {
1595 switch (t->c_cflag & CSIZE) {
1613 if (t->c_cflag & CRTSCTS) {
1615 }
else if (t->c_iflag & (IXON | IXOFF)) {
1617 cfg->
v_start = t->c_cc[VSTART];
1618 cfg->
v_stop = t->c_cc[VSTOP];
1658 &
req, NULL, 0, 1000);
1666 &
req, NULL, 0, 1000);
1674 &
req, NULL, 0, 1000);
1682 DPRINTFN(3,
"msr=0x%02x lsr=0x%02x\n", sc->
sc_msr, sc->
sc_lsr);
1724 USETW2(
req.wValue, (1 << bitmode), iomask);
1760 if (latency < 0 || latency > 255)
1805 enable = (echar == -1) ? 0 : 1;
1812 USETW2(
req.wValue, enable, echar & 0xff);
1826 enable = (echar == -1) ? 0 : 1;
1833 USETW2(
req.wValue, enable, echar & 0xff);
1844 uint16_t widx, wlength, woffset;
1852 woffset = eeio->
offset / 2U;
1853 wlength = eeio->
length / 2U;
1854 for (widx = 0; widx < wlength; widx++) {
1874 uint16_t widx, wlength, woffset;
1882 woffset = eeio->
offset / 2U;
1883 wlength = eeio->
length / 2U;
1884 for (widx = 0; widx < wlength; widx++) {
1922 int flag,
struct thread *td)
const char * product_name
void(* ucom_cfg_get_status)(struct ucom_softc *, uint8_t *plsr, uint8_t *pmsr)
struct ucom_super_softc sc_super_ucom
struct ucom_softc sc_ucom
struct usb_xfer * sc_xfer[UFTDI_N_TRANSFER]
struct usb_device * sc_udev
enum usb_hc_mode usb_mode
unsigned long driver_info
struct usbd_lookup_info info
struct usb_device * device
static int uftdi_erase_eeprom(struct ucom_softc *ucom, int confirmation)
static int uftdi_get_bitmode(struct ucom_softc *, uint8_t *, uint8_t *)
static driver_t uftdi_driver
static int uftdi_set_event_char(struct ucom_softc *, int)
static int uftdi_pre_param(struct ucom_softc *, struct termios *)
static int skip_jtag_interfaces
USB_PNP_HOST_INFO(uftdi_devs)
static SYSCTL_NODE(_hw_usb, OID_AUTO, uftdi, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB uftdi")
static device_detach_t uftdi_detach
static const struct jtag_by_name jtag_products_by_name[]
static const struct usb_config uftdi_config[UFTDI_N_TRANSFER]
static int uftdi_encode_baudrate(struct uftdi_softc *sc, speed_t speed, struct uftdi_param_config *cfg)
static void uftdi_cfg_param(struct ucom_softc *, struct termios *)
static int uftdi_read_eeprom(struct ucom_softc *ucom, struct uftdi_eeio *eeio)
static boolean_t uftdi_baud_within_tolerance(uint64_t speed, uint64_t target)
static int uftdi_sio_encode_baudrate(struct uftdi_softc *sc, speed_t speed, struct uftdi_param_config *cfg)
static int uftdi_set_error_char(struct ucom_softc *, int)
MODULE_DEPEND(uftdi, ucom, 1, 1, 1)
static void uftdi_devtype_setup(struct uftdi_softc *sc, struct usb_attach_arg *uaa)
static int uftdi_ioctl(struct ucom_softc *, uint32_t, caddr_t, int, struct thread *)
DRIVER_MODULE(uftdi, uhub, uftdi_driver, uftdi_devclass, NULL, NULL)
static int uftdi_set_bitmode(struct ucom_softc *, uint8_t, uint8_t)
static const STRUCT_USB_HOST_ID uftdi_devs[]
static void uftdi_free_softc(struct uftdi_softc *)
#define UFTDI_DEV(v, p, i)
static void uftdi_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *)
static void uftdi_start_write(struct ucom_softc *)
#define DEVF_BAUDBITS_HINDEX
static void uftdi_cfg_open(struct ucom_softc *)
static void uftdi_cfg_close(struct ucom_softc *)
static int uftdi_set_latency(struct ucom_softc *, int)
static int uftdi_write_eeprom(struct ucom_softc *ucom, struct uftdi_eeio *eeio)
static device_attach_t uftdi_attach
static void uftdi_poll(struct ucom_softc *ucom)
static device_method_t uftdi_methods[]
SYSCTL_INT(_hw_usb_uftdi, OID_AUTO, skip_jtag_interfaces, CTLFLAG_RWTUN, &skip_jtag_interfaces, 1, "Skip creating tty devices for jtag interfaces")
static int uftdi_reset(struct ucom_softc *, int)
static devclass_t uftdi_devclass
static usb_callback_t uftdi_read_callback
static const struct ucom_callback uftdi_callback
static device_probe_t uftdi_probe
static void uftdi_start_read(struct ucom_softc *)
static int uftdi_get_latency(struct ucom_softc *, int *)
static void uftdi_cfg_set_rts(struct ucom_softc *, uint8_t)
#define UFTDI_CONFIG_INDEX
static void uftdi_cfg_set_break(struct ucom_softc *, uint8_t)
static void uftdi_cfg_set_dtr(struct ucom_softc *, uint8_t)
static void uftdi_stop_read(struct ucom_softc *)
static void uftdi_free(struct ucom_softc *)
static usb_callback_t uftdi_write_callback
static int uftdi_set_parm_soft(struct ucom_softc *, struct termios *, struct uftdi_param_config *)
static void uftdi_stop_write(struct ucom_softc *)
static boolean_t is_jtag_interface(struct usb_attach_arg *uaa, const struct usb_device_id *id)
#define FTDI_SIO_SET_BREAK
#define FTDI_SIO_XON_XOFF_HS
#define FTDI_SIO_MODEM_CTRL
#define FTDI_SIO_READ_EEPROM
#define FTDI_SIO_GET_LATENCY
#define FTDI_SIO_RESET_SIO
#define FTDI_SIO_SET_DATA_PARITY_NONE
#define FTDI_SIO_SET_DATA_PARITY_ODD
#define FTDI_SIO_DSR_MASK
#define FTDI_SIO_SET_RTS_LOW
#define FTDI_SIO_GET_BITMODE
#define FTDI_SIO_SET_RTS_HIGH
#define FTDI_SIO_WRITE_EEPROM
#define UFTDI_JTAG_IFACE(i)
#define FTDI_SIO_SET_DTR_HIGH
#define FTDI_SIO_ERASE_EEPROM
#define FTDI_SIO_DISABLE_FLOW_CTRL
#define FTDI_SIO_SET_LATENCY
#define FTDI_SIO_RESET_PURGE_RX
#define FTDI_SIO_CTS_MASK
#define FTDI_SIO_SET_DATA_BITS(n)
#define FTDI_SIO_SET_BITMODE
#define FTDI_OUT_TAG(len, port)
#define UFTDI_JTAG_CHECK_STRING
#define FTDI_SIO_SET_DTR_LOW
#define FTDI_SIO_SET_FLOW_CTRL
#define FTDI_SIO_SET_DATA_PARITY_EVEN
#define UFTDI_JTAG_IFACES_MAX
#define FTDI_SIO_SET_DATA
#define FTDI_SIO_SET_DATA_STOP_BITS_2
#define FTDI_SIO_SET_ERROR_CHAR
#define FTDI_SIO_SET_DATA_STOP_BITS_1
#define FTDI_SIO_RLSD_MASK
#define FTDI_SIO_SET_BAUD_RATE
#define FTDI_SIO_RESET_PURGE_TX
#define FTDI_SIO_RTS_CTS_HS
#define FTDI_SIO_SET_EVENT_CHAR
#define UFTDIIOC_ERASE_EEPROM
#define UFTDIIOC_SET_BITMODE
#define UFTDIIOC_GET_LATENCY
#define UFTDI_CONFIRM_ERASE
#define UFTDIIOC_RESET_TX
#define UFTDIIOC_RESET_RX
#define UFTDIIOC_GET_BITMODE
#define UFTDIIOC_READ_EEPROM
#define UFTDIIOC_SET_LATENCY
#define UFTDIIOC_SET_EVENT_CHAR
#define UFTDIIOC_WRITE_EEPROM
#define UFTDIIOC_GET_HWREV
#define UFTDIIOC_SET_ERROR_CHAR
#define UFTDIIOC_RESET_IO
#define UT_WRITE_VENDOR_DEVICE
#define UT_READ_VENDOR_DEVICE
void usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset, const void *ptr, usb_frlength_t len)
void usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset, void *ptr, usb_frlength_t len)
uint8_t usbd_get_bus_index(struct usb_device *udev)
const char * usb_get_product(struct usb_device *udev)
struct usb_device_descriptor * usbd_get_device_descriptor(struct usb_device *udev)
uint8_t usbd_get_device_index(struct usb_device *udev)
#define USETW2(w, b1, b0)
const struct usb_device_id * usbd_lookup_id_by_info(const struct usb_device_id *id, usb_size_t sizeof_id, const struct usbd_lookup_info *info)
uint8_t ucom_get_data(struct ucom_softc *sc, struct usb_page_cache *pc, uint32_t offset, uint32_t len, uint32_t *actlen)
void ucom_status_change(struct ucom_softc *sc)
int ucom_attach(struct ucom_super_softc *ssc, struct ucom_softc *sc, int subunits, void *parent, const struct ucom_callback *callback, struct mtx *mtx)
int ucom_unref(struct ucom_super_softc *ssc)
void ucom_ref(struct ucom_super_softc *ssc)
void ucom_set_pnpinfo_usb(struct ucom_super_softc *ssc, device_t dev)
void ucom_detach(struct ucom_super_softc *ssc, struct ucom_softc *sc)
void ucom_put_data(struct ucom_softc *sc, struct usb_page_cache *pc, uint32_t offset, uint32_t len)
static void ucom_use_lsr_txbits(struct ucom_softc *sc)
#define ucom_cfg_do_request(udev, com, req, ptr, flags, timo)
void usbd_transfer_submit(struct usb_xfer *xfer)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_xfer_set_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex, usb_frlength_t len)
struct usb_page_cache * usbd_xfer_get_frame(struct usb_xfer *xfer, usb_frcount_t frindex)
usb_error_t usbd_transfer_setup(struct usb_device *udev, const uint8_t *ifaces, struct usb_xfer **ppxfer, const struct usb_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *xfer_mtx)
void usbd_transfer_start(struct usb_xfer *xfer)
void usbd_transfer_poll(struct usb_xfer **ppxfer, uint16_t max)
void * usbd_xfer_softc(struct usb_xfer *xfer)
void usbd_xfer_set_stall(struct usb_xfer *xfer)
void usbd_transfer_stop(struct usb_xfer *xfer)
void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes)
usb_frlength_t usbd_xfer_max_len(struct usb_xfer *xfer)
void device_set_usb_desc(device_t dev)
@ USB_ERR_NORMAL_COMPLETION
#define USB_ST_TRANSFERRED
void() usb_callback_t(struct usb_xfer *, usb_error_t)
#define STRUCT_USB_HOST_ID
#define USB_GET_STATE(xfer)
#define usbd_do_request(u, m, r, d)