�m�g�b�v�y�[�W�֖߂�n

V-USB�𗘗p����HID�f�o�C�X�����


(C) Objective Development Software

2012�N4��
AVR���g�������앨��V-USB��g�ݍ������Ǝv���܂������A�f�o�C�X�����z�X�g�����\�t�g���ǂ̂悤�ɍ��΂悢�̂��悭������Ȃ������̂ŁA���ׂȂ��璧�킵�܂����B
�{�L���͂��̂Ƃ��̃������܂Ƃ߂����̂ł��B���e���΂��Ă�����A�������I�ɓǂ݂ɂ����Ƃ��������Ǝv���܂����A���������������B
��HID�f�o�C�X�c�q���[�}���E�C���^�[�t�F�C�X�E�f�o�C�X�E�f�o�C�X�B�C�ɂ��Ȃ��ł��������B

�y�ڎ��z
  • V-USB�Ƃ�
  • V-USB��HID�f�o�C�X�����
  • V-USB�t�@�C���̔z�u��AVR Studio�̐ݒ�
  • usbconfig.h������������
  • �f�o�C�X�̓�����m�F����
  • �]�������^���|�[�g�^�C�v�^�T�|�[�g�c�[��
  • �f�[�^�]���̗���ƃf�[�^�̃Q�b�g�^�Z�b�g�ꏊ�ɂ‚���
  • �f�[�^����M�̃T�C�Y�Ɩ߂�l�ɂ‚���
  • GetIdol/SetIdol���N�G�X�g�ɂ‚���
  • �f�[�^�]���̎�ނƏ����Ԋu�ɂ‚���
  • �傫�ȃT�C�Y�̃f�[�^��]������ɂ�(1)
  • �傫�ȃT�C�Y�̃f�[�^��]������ɂ�(2)
  • ���|�[�g�^�C�v�̊��蓖�ė�
  • �T���v���v���O����
  • �����ɗp������H
�y�����Ӂz
�{�L����V-USB�̓��e���ڍׂɉ��������̂ł͂Ȃ��A���������߂�V-USB���g���i��荞�ށj�ɂ�����A���ׂ����ƁA��|����ɂ������Ƃ��Љ����̂ł��B���ꂩ��V-USB���g�����Ƃ���l�̃q���g�ɂȂ�΂Ǝv���܂��B�����āA�{�L����ǂ߂�V-USB���g�����Ȃ���悤�ɂȂ�A�Ƃ������̂ł͂���܂���B


V-USB�Ƃ�
PC�ɂ͗l�X�ȃf�o�C�X�i���Ӌ@��j��USB(Universal Serial Bus)�Őڑ����邱�Ƃ��ł��܂��B
���̂悤�ȃf�o�C�X�ɂ́AUSB�@�\���i���pIC��USB�����}�C�R�����g���Ă��܂��B
��̓d�q�H��ł��AUSB������PIC��AVR���g����USB�f�o�C�X����邱�Ƃ��ł��܂��BUSB������PIC�͔�r�I�悭�o����Ă��܂��B����ɔ�ׁAAVR�̕��͂��܂�o����Ă��܂���B�������AUSB��������Ă��Ȃ�AVR�}�C�R���ł�USB�f�o�C�X����邱�Ƃ��ł��܂��BV-USB�Z�p��������”\�ɂ��܂��B
V-USB��AVR��Ńt�@�[���E�F�A�i�}�C�R���ɏ������ރ\�t�g�E�F�A�j�ɂ����USB�@�\����������Z�p�ł��B
Universal Serial Bus�@http://www.usb.org
Objective Development Software GmbH / V-USB�@http://www.obdev.at/products/vusb/index.html

V-USB�̓����m�邽�߂Ƀ\�[�X(usbdrv.c)��ǂ�ŏ������e��ǂ����Ƃ�����܂��BUSB�Ɋւ����b�m���i�N���X�A�C���^�[�t�F�C�X�A�p�P�b�g�A�g�����U�N�V�����A�]�������A�Ƃ��������Ɓj������ƁA�\�[�X���������₷���Ȃ�܂��B
USB�Ɋւ���ڍׂ͎Q�l����ǂ�ł��������B�T�v�����Ȃ�AUSB�R���g���[������IC�̐�������������₷���Ă����߂ł��B���[�J�[�̃T�C�g�Ō��J����Ă��܂��B���uUSB HID �R���g���[������ pdf�v�Ȃǂ̗p��Ō����B
���̍ہAIC�ŗL�̋@�\�Ɋւ���������AUSB�K�i�̐������Ɗ��Ⴂ���Ȃ��悤���ӂ��Ă��������B

V-USB��HID�f�o�C�X�����
AVR�ō�������̂�PC�ɐڑ����邽�߂ɁAAVR-CDC�𗘗p���邱�Ƃ��悭����܂��BAVR-CDC�V���[�Y��V-USB�����p����CDC(Communication Device Class)�f�o�C�X�ŁAPC�ɉ��zCOM�|�[�g�𑝐݂��Ă���܂��B
Recursion Co., Ltd. / AVR-CDC�@http://www.recursion.jp/avrcdc/indexj.html

AVR-CDC���g���ɂ́AINF�t�@�C���Œ񋟂����h���C�o��PC�ɃC���X�g�[������K�v������܂��BAVR-CDC�Ɍ��炸�AV-USB�𗘗p�����J�X�^���ȃf�o�C�X�͊�{�I�Ƀh���C�o��K�v�Ƃ��܂��B�f�o�C�X�J���҂̓h���C�o�����Ȃ���΂Ȃ�܂���B
����ɑ΂��AHID(Human Interface Device)�Ƃ��ċK�i������Ă���f�o�C�X�c�L�[�{�[�h��}�E�X�A�W���C�X�e�B�b�N�Ȃǂ́APC(OS)�����Ƃ��ƃh���C�o�������Ă���̂ŗ��p�҂��ʓr�C���X�g�[������K�v�͂���܂���B
����HID�ɏ��������f�o�C�X�ł���΁A���e�����ł���OS�W���̃h���C�o�œ��삳���邱�Ƃ��ł��܂��B����f�o�C�X�ł��h���C�o�̊J���E�C���X�g�[���Ȃ��ɁAPC�ɐڑ����邱�Ƃ��ł���̂ł��B

�{�L���ł�V-USB�𗘗p����HID�f�o�C�X�����܂��B��̓I�ɂ̓z�X�g(PC)�Ƃ̊ԂŔC�ӂ̃f�[�^�ibyte�z��j�����Ƃ肷��HID�f�o�C�X�����܂��B����ɁAAVR-CDC/IO�̂悤�ȔėpI/O����f�o�C�X������΂Ǝv���܂��B
���NjL�F AVR-HID/IO�A�������܂����B����A�\�t�g�E�F�A�҂̋L���Ō��J����\��ł��B

V-USB�t�@�C���̔z�u��AVR Studio�̐ݒ�
Objective Development�̃T�C�g����V-USB�̃��W���[�����_�E�����[�h���܂��B
�{�L�����J���_�ł̍ŐV�ł�vusb-20120109.zip�ł����B
Download V-USB�@http://www.obdev.at/products/vusb/download.html

�t�@�C���z�u�Ɛݒ�
  1. AVR Studio�ŖړI�̃v���W�F�N�g���쐬���܂��B���ȉ��AAVR Studio 5.1�̂��ƂƂ���B
  2. V-USB��usbdrv�t�H���_���A�t�H���_����AVR Studio�̃v���W�F�N�g�փR�s�[���܂��B
  3. usbdrv�t�H���_��usbconfig-prototype.h���R�s�[���Ausbconfig.h�Ƀ��l�[�����܂��B
    �����l�[������usbconfig.h��usbdrv�t�H���_����v���W�F�N�g�̃t�H���_�Ɉړ����Ă��悢�B
    ���̏ꍇ�Ausbdrv.h�ɂ���include�L�q��usbconfig.h�̈ʒu�𐳂����w���悤����������B
  4. AVR Studio�̃\�����[�V�����G�N�X�v���[���[�Ńv���W�F�N�g�����E�N���b�N���lj��������̍��ځB
    usbdrv.c��usbdrvasm.S��lj����܂��B���f�o�b�O�p�}�N�����g���Ȃ�oddebug.c���B
  5. AVR Studio�̃\�����[�V�����G�N�X�v���[���[�Ńv���W�F�N�g�����E�N���b�N���v���p�e�B�B
    ���L�̂悤�ɐݒ肵�܂��B
C�̃��W���[���ɑ΂���ݒ� [AVR/GNU C Compiler]
[Symbols]
F_CPU=12000000UL�@��12MHz�̗�B���ۂ͐��삷��f�o�C�X�ɍ��킹���l�ŁB
[Directories]
�v���W�F�N�g����usbdrv�f�B���N�g�����w�肷��B�u../usbdrv�v�̂悤�ɐݒ肳���B
[Optimization]�i�w��͔C�Ӂj
-Os

�A�Z���u���̃��W���[���ɑ΂���ݒ� [AVR/GNU Assembler]
[General]
�v���W�F�N�g����usbdrv�f�B���N�g�����w�肷��B�u../usbdrv�v�̂悤�ɐݒ肳���B
[Symbols]
F_CPU=12000000UL�@��12MHz�̗�B���ۂ͐��삷��f�o�C�X�ɍ��킹���l�ŁB

usbconfig.h������������
�_�E�����[�h����V-USB�̃��W���[����vusb-20120109/examples�t�H���_�ɃT���v���f�o�C�X�������‚������Ă��܂��B���̂����A�ړI�̂��̂ɋ߂��uhid-data�v����������`�Ői�߂邱�Ƃɂ��܂��B�f(��)��usbconfig.h�������������蕪����₷������ł��B�Ȃ��AV-USB��g�ݍ���AVR��ATmega88P�Ƃ��܂����B

���삷��f�o�C�X�ɍ��킹�Ahid-data��usbconfig.h�̐ݒ���e��ύX���܂��B

/* ---------------------------- Hardware Config ---------------------------- */
#define USB_CFG_IOPORTNAME D
#define USB_CFG_DMINUS_BIT 3
#define USB_CFG_DPLUS_BIT 2
V-USB�̕W����H�ɏ]���AUSB��D-����PD3�ɁAD+����PD2�ɐڑ����܂����B
���������ۂɑg�ݗ��Ă��f�o�C�X�����̒ʂ�̔z���ł��B

/* --------------------------- Functional Range ---------------------------- */
#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
�C���^���v�g�]���𗘗p����ꍇ�́u1�v�ɂ��܂��B�R���g���[���]�������𗘗p����ꍇ�́u0�v�ɂ��܂��B

/* --------------------------- Functional Range ---------------------------- */
#define USB_CFG_LONG_TRANSFERS 1
�R���g���[���]���ň�x��254byte���傫�ȃT�C�Y�̃f�[�^��]������ꍇ�́u1�v�ɂ��܂��B
�f�t�H���g�́u0�v�A254byte�܂ł̓]���ƂȂ��Ă��܂��B

/* -------------------------- Device Description --------------------------- */
//#define USB_CFG_VENDOR_NAME 'o', 'b', 'd', 'e', 'v', '.', 'a', 't'
//#define USB_CFG_VENDOR_NAME_LEN 8

#define USB_CFG_VENDOR_NAME 'm', 'y', 's', 'i', 't', 'e', '.', 'c', 'o', 'm'
#define USB_CFG_VENDOR_NAME_LEN 10
* ALWAYS define a vendor name containing your Internet domain name if you use
* obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
* details.
���[���ɑ�����VenderID/ProductID�y�A���g�p����Ȃ�΁A�x���_�[���i�f�o�C�X�̐����ҁj�����T�C�g�̃h���C�����ɕύX���邱�Ƃ��ł��܂��B�x���_�[���̓z�X�g���̃A�v���Ńf�o�C�X�����擾����ƌ��邱�Ƃ��ł��܂��B
�����^���T�C�g�ł���΃T�u�h���C�����܂ŕK�v�ł��傤�BURL���uhttp://�v����t���ɏ����ΊԈႢ����܂���B�T�C�g��u���O���Ȃ��l��e-mail�A�h���X�������܂��B�ڍׂ�usbdrv�t�H���_�ɂ���USB-IDs-for-free.txt��ǂ�ł��������B

/* -------------------------- Device Description --------------------------- */
/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */

#define USB_CFG_SERIAL_NUMBER 'A', 'B', '1', '2', '3', '4', '5'
#define USB_CFG_SERIAL_NUMBER_LEN 7
�����‚̓���f�o�C�X��PC�ɐڑ�����Ƃ��܂��B�Ⴆ�΂���hid-data��3�����PC�ɐڑ����܂��B���̂Ƃ�VenderID/ProductID�͂ǂ�������Ȃ̂ŁA�•ʂɔF�����邱�Ƃ��ł��܂���B�����Ńf�o�C�X���ƂɈقȂ�V���A���ԍ��𖄂ߍ��݂܂��B�uAB001�v�uAB002�v�uAB003�v�̂悤�ɂł��B
�z�X�g���̃A�v���̓x���_�[ID�^�v���_�N�gID�ɉ����A�V���A���ԍ��܂Ō��ȁX�̃f�o�C�X�𔻕ʂ��܂��B
�V���A���ԍ��͐��������łȂ��A���t�@�x�b�g���g���܂��B

/* -------------------------- Device Description --------------------------- */
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 22
�f�o�C�X��main.c�ɋL�q����Ă��郌�|�[�g�f�X�N���v�^usbHidReportDescriptor[]�̔z�񒷂��L�q���܂��B
�f�o�C�X�̊J�����A���o�͎d�l�̕ύX�ɔ����A�p�ɂɏ��������邱�ƂɂȂ�Ǝv���܂��B����������Y���ƃf�o�C�X�ɃA�N�Z�X�ł��܂���B���ӂ��Ă��������B

�f�o�C�X�̓�����m�F����
AVR Studio�Ńv���W�F�N�g���r���h���AAVR�i�����ł�ATmega88P�j�ɏ������݂܂��B�q���[�Y�r�b�g�̐ݒ�̓T���v���f�o�C�Xhid-data��Makefile�t�@�C���ɋL�q����Ă��܂��B

�T���v���f�o�C�X�̃t�H���_�ɂ́A�R�}���h���C���œ��삷��uhidtool�v�Ƃ����z�X�g���A�v���������Ă��܂��B���̃A�v���̎��s�ɂ́ulibusb�v���K�v�ł��B�����������̓��P������libusb�𓱓������A���l�̃��C�u�����A����сAhidtool�̑���ƂȂ�z�X�g���A�v����C#�ō쐬���܂����B��libusb�cUSB�f�o�C�X�ɃA�N�Z�X���邽�߂́A�z�X�g���A�v���̃��C�u�����B

hid-data��128byte�܂ł̔C�ӂ̃f�[�^�i�o�C�g�z��j���z�X�g(PC)�ƃf�o�C�X(hid-data)�Ԃł��Ƃ�ł��܂��B
�z�X�g����f�[�^�𑗂�ƃf�o�C�X�͂����EEPROM�ɕۑ����܂��B�z�X�g���ǂݏo����v������ƁA�f�o�C�X��EEPROM����f�[�^��ǂݏo���A�Ԃ��܂��B
��L����c�[����p���āA�����̓��삪����ɍs���邱�Ƃ��m�F���܂����B

�]�������^���|�[�g�^�C�v�^�T�|�[�g�c�[��
�r���h�A���s�A����m�F���ł����Ƃ���ŁAV-USB�̓�����e�����Ă݂܂��B
V-USB�̃\�[�Xusbdrv.c/.h��ǂނɂ�����A�C��t���Ȃ���΂Ȃ�Ȃ��d�v�ȃ|�C���g������܂��B

USB�f�o�C�X�ɂ�����f�[�^�]���̕�����\�����tINPUT/OUTPUT�́A��Ƀz�X�g(PC)���猩�������ł��B
USB�f�o�C�X�͎����I�ɍs�����N�������Ƃ͂ł����A���‚ł��z�X�g����̖��߂��󂯂čs�����N�������́A�Ƃ������܂肪����܂��B
  • INPUT�̓z�X�g(PC)�ɓ�������@�c�@�z�X�g���f�o�C�X
  • OUTPUT�� �z�X�g(PC)����o������@�c�@�z�X�g���f�o�C�X
�z�X�g�ƃf�o�C�X�Ԃł��Ƃ肷��f�[�^�̂��Ƃ����|�[�g�ƌĂт܂��B���|�[�g�ɂ͎���3�^�C�v����܂��B
  • Feature Reports �c�f�o�C�X�̃R���t�B�M�����[�V���������w�肷�郌�|�[�g�B�G���h�|�C���g0���g�p����B
  • Input Reports �c�z�X�g�֓��͂��郌�|�[�g�BV-USB�͓��͕����̃C���^���v�g�]���ɃG���h�|�C���g1���g�p����B
  • Output Reports �c�z�X�g����o�͂��郌�|�[�g�B
HID�f�o�C�X�ł́u���|�[�g�f�X�N���v�^�v���L�q���ăf�[�^�]���̎�ނ�ݒ肵�܂��B
USB�K�i�Ńr�b�g���ƂɈӖ��Â���ꂽ�l���A�l�X�ȍ��ڂ��Ƃɐݒ肷��̂ł����A���Ƃł͂���Ă��܂���BUSB�̃T�C�g�Ō��J���Ă���T�|�[�g�c�[���𗘗p���܂��B�{�L�����J���_�ł̃t�@�C������dt2_4.zip�ł����B
HID Descriptor Tool�@http://www.usb.org/developers/hidpage/

�f�[�^�]���̗���ƃf�[�^�̃Q�b�g�^�Z�b�g�ꏊ�ɂ‚���
�f�o�C�X�́A�z�X�g�����M����f�[�^�ƃz�X�g�֑��M����f�[�^���A���ꂼ��ǂ̊֐��ŃQ�b�g�^�Z�b�g����̂��B
�z�X�g����f�o�C�X�փ��|�[�g�����N�G�X�g�����ƁA��M�����̊֐�����usbFunctionSetup()���Ăяo����܂��B
�����Ŗ߂�l��USB_NO_MSG��Ԃ��ƁA������usbFunctionRead(), usbFunctionWrite()���Ăяo����܂��B
�ȍ~�A�z�X�g����v�����ꂽ�f�[�^���ɒB����܂Łi���x��usbFunctionSetup()���o�R�����ɁjusbFunctionRead(), usbFunctionWrite()���Ăяo����܂��B
����āA�f�[�^�̃Q�b�g�^�Z�b�g��usbFunctionRead(), usbFunctionWrite()�ōs���܂��B�����͂��̂��߂̊֐��ł��B
usbFunctionRead(), usbFunctionWrite()�Ŏg���ϐ��̏�������usbFunctionSetup()�ōs���܂��B
[usbdrv.h]
USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]);
* If the SETUP indicates a control-in transfer, you should provide the
* requested data to the driver. There are two ways to transfer this data:
* (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data
* block and return the length of the data in 'usbFunctionSetup()'. The driver
* will handle the rest. Or (2) return USB_NO_MSG in 'usbFunctionSetup()'. The
* driver will then call 'usbFunctionRead()' when data is needed. See the
* documentation for usbFunctionRead() for details.

usbFunctionSetup()�ł̓��|�[�g�^�C�v(feature/input/output)�ƃ��|�[�gID�����ʂł���̂ŁA�f�[�^�̃Q�b�g��̃o�b�t�@�^�Z�b�g���̃o�b�t�@��U�蕪���邱�Ƃ��ł��܂��B
[main.c] usbFunctionSetup()�̋L�q��
usbMsgLen_t usbFunctionSetup(uchar data[8])
{
�@usbRequest_t *rq = (void *)data; /* wValue: ReportType (highbyte:[1]), ReportID (lowbyte:[0]) */
�@�i���j
�@uint8_t reportType = rq->wValue.bytes[1]; //ReportType: input(1),output(2),feature(3)
�@uint8_t reportID = rq->wValue.bytes[0]; //ReportID: 0,1,2,..
�@�i���j
}

�f�[�^����M�̃T�C�Y�Ɩ߂�l�ɂ‚���
�z�X�g(PC)��V-USB�f�o�C�X�Ԃł��Ƃ肷��f�[�^�����|�[�g�ƌĂт܂��B
�f�[�^�̍ŏ��P�ʂ�byte�ł͂Ȃ�bit�ł��B�Ⴆ�΃{�^���f�o�C�X��on/off��1�r�b�g����Α���܂��B
1byte�P�ʂŃf�[�^�����������ꍇ�A8bit��1�‚̃f�[�^�Ƃ��Ē�`����΂悢�ł��B
�f�[�^�i���|�[�g�j�̏ڍׂ̓��|�[�g�f�X�N���v�^�Œ�`���܂��B
�Ⴆ�΃T���v���f�o�C�Xhid-data�́Amain.c����usbHidReportDescriptor[]�Ŏ��̂悤�ɒ�`���Ă��܂��B
  • ���� REPORT_SIZE (8) �c1�‚̃f�[�^��8�r�b�g
  • ���� REPORT_COUNT (128) �c�S�̃T�C�Y�̓f�[�^128�•�
����āA���|�[�g�i�f�[�^�z��j�̑傫���� 8bit * 128�� = 128byte

usbdrv.c�����̑���M�o�b�t�@��8byte�ł��B��usbTxBuf[]��usbRxBuf[]�B��M�g��2�{�T�C�Y�Ŋm�ۂ��Ă���B
�f�o�C�X�̃v���O�������i��L��ł�hid-data/main.c���j��usbFunctionRead(),usbFunctionWrite()��8byte���ƒf�[�^���������邱�ƂɂȂ�܂��B���f�[�^�S����8byte�̔{���łȂ��Ȃ�A�J��Ԃ��̍Ō��8byte�����B
��byte����M���������O�ŃJ�E���g���A�f�[�^�S�����������������ǂ��������O�Ŕ��f���܂��B

uchar usbFunctionRead(uchar *data, uchar len) �̖߂�l
����'len'�̓o�b�t�@'data[]'�֊i�[�ł���byte���ŁA�߂�l�͎��ۂ�data[]�֊i�[����byte���ł��Btrue/false�I�Ȓl�ł͂Ȃ���������byte����Ԃ��̂ł��B�]���Ė߂�l��len�ȉ��̒l�ƂȂ�܂��B
len�̒l��ݐς��A����܂łɉ��o�C�g�����������c�����A�f�[�^�̑S�̃T�C�Y�𒴂��ď������Ȃ��悤�ɂ��܂��B

uchar usbFunctionWrite(uchar *data, uchar len) �̖߂�l
����'len'�̓o�b�t�@'data[]'������o����byte���ł��B���O�ŗp�ӂ���SRAM��̃o�b�t�@�Ɋi�[����ȂǏ������܂��B������len�̒l��ݐς��A�f�[�^�̑S�̃T�C�Y�ɒB�������i�f�[�^��S�Ď󂯎�������j���f���܂��B
�S�Ẵf�[�^���󂯎�����Ƃ��A��0�̒l(true)��Ԃ��܂��B�܂������̃f�[�^������Ƃ��A0(false)��Ԃ��܂��B

�z�X�g���́A�f�o�C�X���Ńf�[�^��8byte���‹�؂��Ă��邱�Ƃ��ӎ�����K�v�͂���܂���B
HidD_SetFeature(),HidD_GetFeature()�Ńf�[�^�S�̂�1��ő���M����΂悢�ł��B
HidD_GetInputReport(),HidD_SetOutputReport()�����l�ł��B�������4�‚�Windows�W����hid.dll�Ɋ܂܂�Ă���֐��B

GetIdol/SetIdol���N�G�X�g�ɂ‚���
�C���^���v�g�]���̎��ԊԊu��usbconfig.h�Ŏ��̂悤�ɒ�`���܂��B
��F�@#define USB_CFG_INTR_POLL_INTERVAL 100 //100ms

��{�I�ɂ��̎��ԊԊu�ŁA�z�X�g���f�o�C�X�Ɂu�f�[�^������Ȃ瑗�M����v�Ɩ��߂𑗂�܂��B
���������̒l�Ƃ͕ʂɁA�z�X�g�����w�肵�����ԊԊu�ŃC���^���v�g�]�����s���ꍇ������܂��B�f�o�C�X��USB_CFG_INTR_POLL_INTERVAL�̒l�Ƃ͊֌W�Ȃ��A�]������莞�ԑ҂‚��ƂɂȂ�܂��B
���̎d�g�݂̓L�[�{�[�h�f�o�C�X�ł̓T�|�[�g�K�{�ł��B�ʏ�A�L�[�{�[�h�f�o�C�X�ł̓z�X�g�iPC��OS�j���l���w�肵�Ă��܂��B���̒l���擾�^�ݒ肷��̂�GetIdol/SetIdol���N�G�X�g�ł��B

[main.c] usbFunctionSetup()�̋L�q��
�i�O���ȗ��j
}else if (rq->bRequest == USBRQ_HID_GET_IDLE){
�@usbMsgPtr = &idleRate;
�@return 1;
}else if (rq->bRequest == USBRQ_HID_SET_IDLE){
�@idleRate = rq->wValue.bytes[1];
}

�L�[�{�[�h�f�o�C�X�̏ꍇ�A�u�Ԃ��ƂɃL�[�̉�����Ԃ��ς��킯�ł͂Ȃ��̂ŁA�z�X�g���̔��f�ɂ���ăA�C�h�����Ԃ𒷂����邱�Ƃ�����܂��B
�}�E�X�f�o�C�X�̏ꍇ�A�J�[�\���̏r�q�ȓ�����ߑ����邽�߁AUSBRQ_HID_SET/GET_IDLE�����͕K�v����܂���B
USB_CFG_INTR_POLL_INTERVAL�Ŏw�肵���C���^�[�o���Ԋu�Ńf�[�^���]������܂��B
���̑��Ahid-data�̂悤�ȃf�o�C�X�ł�USBRQ_HID_SET/GET_IDLE�����͕K�v����܂���B

�f�[�^�]���̎�ނƏ����Ԋu�ɂ‚���
V-USB�̓R���g���[���]���ƃC���^���v�g�]�����T�|�[�g���܂��B
USB���[�X�s�[�h�f�o�C�X�ł̃o���N�]���͋֎~����Ă��܂��BV-USB�I�ɂ����ׂ��傫���悤�ł��B
[usbdrv.h]
Please note that the USB standard forbids bulk endpoints for low speed devices!
Most operating systems allow them anyway, but the AVR will spend 90% of the CPU
time in the USB interrupt polling for bulk data.

�T���v���f�o�C�Xhid-data�̓R���g���[���]���𗘗p����128byte�̃f�[�^�𑗎�M���܂��B
USB�������̂悤�ȃf�o�C�X���C���[�W���ăf�[�^��EEPROM�ɕۑ����Ă��܂��B
EEPROM�ւ̃A�N�Z�X�̂悤�Ɏ��Ԃ������鏈��������Ƃ��͒��ӂ��K�v�ł��B
�f�o�C�X���łǂ̂悤�ȏ��������悤�Ƃ�usbPoll()��50ms��ȓ��̊Ԋu�ŌĂяo���K�v������܂��B
[usbdrv.h]
USB_PUBLIC void usbPoll(void);
/* This function must be called at regular intervals from the main loop.
* Maximum delay between calls is somewhat less than 50ms (USB timeout for
* accepting a Setup message). Otherwise the device will not be recognized.
* Please note that debug outputs through the UART take ~ 0.5ms per byte
* at 19200 bps.
*/

�傫�ȃT�C�Y�̃f�[�^��]������ɂ�(1)
�ʏ��SRAM��Ƀo�b�t�@���m�ۂ��ăf�[�^���������邱�ƂɂȂ�܂��B
ATmega88P��SRAM�T�C�Y��1KB(1024byte)�ł��BATmega328P����2KB(2048byte)����܂��B
�����ŁAATmega328P���g���ASRAM�Ƀo�b�t�@���m�ۂ���Ƃ��āA�z�X�g(PC)��V-USB�f�o�C�X�Ԃ�1KB(1024byte)�̃f�[�^�𑗎�M���邱�Ƃ��l���Ă݂܂��B

�R���g���[���]���𗘗p����ꍇ
V-USB�̃f�t�H���g�ł́A�R���g���[���]���ɂ��f�[�^�T�C�Y��254byte�܂łł��B
255byte�ȏ���w�肵�Ă͂����܂���B255��USB_NO_MSG�̒�`�l�Ƃ��Ďg�p����Ă��܂��B
[usbdrv.h]
USB_PUBLIC void usbPoll(void);
[usbdrv.h]
Maximum data payload:
Data payload of control in and out transfers may be up to 254 bytes. In order
to accept payload data of out transfers, you need to implement
'usbFunctionWrite()'.

hid-data�̃��|�[�g�f�X�N���v�^�����������Ď��������Ƃ���A254byte����ɓ]���ł��܂����B
��hid-data��usbFunctionSetup()��'128'�ƃn�[�h�R�[�f�B���O���Ă���̂Œ��ӁB������'254'�ɏC������B

254byte���傫�����邱�Ƃ��ł��܂��B������16384byte�܂łł��B
���̏ꍇ�AUSB_NO_MSG��'sizeof(unsigned)-1'�Ƃ��Ē�`����Ă��܂��B
[usbconfig.h]
#define USB_CFG_LONG_TRANSFERS 0
/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
* in a single control-in or control-out transfer. Note that the capability
* for long transfers increases the driver size.
*/
[usbconfig.h]
#if USB_CFG_LONG_TRANSFERS /* if more than 254 bytes transfer size required */
# define usbMsgLen_t unsigned
#else
# define usbMsgLen_t uchar
#endif
/* usbMsgLen_t is the data type used for transfer lengths. By default, it is
* defined to uchar, allowing a maximum of 254 bytes (255 is reserved for
* USB_NO_MSG below). If the usbconfig.h defines USB_CFG_LONG_TRANSFERS to 1,
* a 16 bit data type is used, allowing up to 16384 bytes (the rest is used
* for flags in the descriptor configuration).
*/

�ȏ���A1024byt�̃f�[�^��]������ɂ͎��̂悤�ɂ��܂��B
  • usbconfig.h �� USB_CFG_LONG_TRANSFERS �� 1 �ɂ���B
  • ���|�[�g�f�X�N���v�^�̒�` usbHidReportDescriptor[] �� REPORT_COUNT �� 0x0400 (1024) �ɂ���B
hid-data�ł͂��̂悤�ɂȂ�܂��B
0x95, 0x80, //REPORT_COUNT (128)
��
0x96, 0x00, 0x04, //REPORT_COUNT (1024) ��2byte��Lo-Hi�̏��B���擪�̒l���ς��B
usbHidReportDescriptor[22]
��
usbHidReportDescriptor[23] �����|�[�g�f�X�N���v�^�̃T�C�Y��1byte������B

�傫�ȃT�C�Y�̃f�[�^��]������ɂ�(2)
�C���^���v�g�]���𗘗p����ꍇ
���|�[�g�f�X�N���v�^�ɍ���[INPUT]�֌W���L�q���܂��B
��F
0x09, 0x00, //USAGE (Undefined)
0x75, 0x08, //REPORT_SIZE (8) �c�f�[�^1�‚�8�r�b�g�i1�o�C�g�j
0x95, 0x08, //REPORT_COUNT (8) �c�f�[�^����8�i�v8�o�C�g�j
0x81, 0x02, //INPUT (Data,Var,Abs) �c�Ӗ��I�ɂ�Buf������t���������悢��������Ȃ�

�C���^���v�g�]������ɂ̓f�o�C�X��main.c�̃��C�����[�v���ŁAusbPoll()�̌��usbSetInterrupt()���R�[������K�v������܂��B�C���^���v�g�]���ɂ���x�̓]����8byte�܂łł��B������傫�ȃf�[�^��]���������Ȃ�R���g���[���]�����g���Ƃ̂��ƁB
[usbdrv.h]
USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len);
/* This function sets the message which will be sent during the next interrupt
* IN transfer. The message is copied to an internal buffer and must not exceed
* a length of 8 bytes. The message may be 0 bytes long just to indicate the
* interrupt status to the host.
* If you need to transfer more bytes, use a control read after the interrupt.
*/

�ȏ���A�C���^���v�g�]���ő傫�ȃT�C�Y�̃f�[�^��]������ɂ́H �� �����Ă��Ȃ��B

���|�[�g�^�C�v�̊��蓖�ė�
���|�[�g�f�X�N���v�^���L�q���邱�Ƃɂ��A�l�X�ȃf�[�^�]���̃p�^�[���i���o�͂̕�����f�[�^�T�C�Y�j��g�ݍ��ނ��Ƃ��ł��܂��B�ȉ��ɁA���ۂɂ�肻���ȗ�������܂��B��������������ē���m�F�ł��Ă��܂��B

(A) �C���^���v�g�]��(IN)���g�p����
feature: 128byte
input: 4byte
�O�o�̃R�����g�ʂ�A�C���^���v�g�]����8byte�ȓ��Ƃ��܂��B�����ł͉���4byte�B
8byte�𒴂���T�C�Y���C���^���v�g�]�����邱�Ƃ��ł��܂����i�����ς݁j�A�����ɏ]�����Ƃɂ��܂��B

(B) �T�C�Y�ʁ^�ړI�ʂɕ�������
�R�}���h�i���T�C�Y:16byte�j�ƃf�[�^�i��T�C�Y:512byte�j�̂悤�Ɏg����B
feature reportID=1: 16byte
feature reportID=2: 512byte
��ԑ傫�ȃT�C�Y1�‚��`���đS�Ă̖����ŋ��p���Ă��悢�ł����A���o�C�g�]�������������̂Ƃ��ɉ��S�o�C�g���̃f�[�^��]������͖̂��ʂł��B���|�[�gID��t�^����ƃT�C�Y�Ⴂ�̓��탌�|�[�g��ݒ肷�邱�Ƃ��ł��܂��B

(C) ���G�ȑg�ݍ��킹
���o�͕����Ɗe�T�C�Y���ׂ����ݒ肷���B
�R�}���h�i���T�C�Y:16byte�j���z�X�g����f�o�C�X�֏o�́B
�f�[�^�i��T�C�Y:256byte�j���z�X�g-�f�o�C�X�Ԃœ��o�́B
�X�e�[�^�X�i8byte�j���f�o�C�X����z�X�g�֐����ʒm�B
���L�̂悤�Ɋ��蓖�Ă��Ƃ���A�ړI�̓�������܂���ł����B�C���^���v�g�]�����������܂���ł����i�z�X�g��ReadFile()�ɒl�����Ȃ��j�B�����|�[�g�f�X�N���v�^�̏����������������̂�������Ȃ����A�������l���Ⴂ�����Ă���̂�������Ȃ��B
feature reportID=1: 16byte
feature reportID=2: 256byte
input: 8byte
��input�ɓK���ȃ��|�[�gID��t�^���Ă�����͕ς�炸�B

���L�̂悤�Ɋ��蓖�Ă��Ƃ���A�ړI�̓�������܂����B
input: 8byte �c�z�X�g�ւ̓��͐�p
output: 16byte �c�z�X�g����̏o�͐�p
feature: 256byte �c�z�X�g-�f�o�C�X�Ԃőo����

V-USB�͍��ݓ��������|�[�gID�̎g�p�ɂ͑Ή�������Ȃ��̂�������܂���i�H�j�@���̃R�����g��hid-data�ɂ‚��Ă̘b�Ȃ̂��AV-USB�Ƃ��Ă��������‚���ŊJ�����Ă����Ƃ������ƂȂ̂��A�s���ł��B
[hid-data/main.c/usbHidReportDescriptor[]]
/* Since we define only one feature report, we don't use report-IDs (which
* would be the first byte of the report).



���|�[�g�f�X�N���v�^�̋L�q���i�ԍ��͏�L�p�^�[���ɑΉ��j
(A)
PROGMEM char usbHidReportDescriptor[14+6+6+1] = {
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)bit

0x95, 0x80, // REPORT_COUNT (128)
0x09, 0x00, // USAGE (Undefined)
0xb1, 0x02, // FEATURE (Data,Var,Abs)

0x95, 0x04, // REPORT_COUNT (4)
0x09, 0x00, // USAGE (Undefined)
0x81, 0x02, // INPUT (Data,Var,Abs)

0xc0 // END_COLLECTION
};

(B)
PROGMEM char usbHidReportDescriptor[14+8+9+1] = {
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)bit

0x85, 0x01, // REPORT_ID (1)
0x95, 0x10, // REPORT_COUNT (16)
0x09, 0x00, // USAGE (Undefined)
0xb1, 0x02, // FEATURE (Data,Var,Abs)

0x85, 0x02, // REPORT_ID (2)
0x96, 0x00, 0x02, // REPORT_COUNT (512)
0x09, 0x00, // USAGE (Undefined)
0xb1, 0x02, // FEATURE (Data,Var,Abs)

0xc0 // END_COLLECTION
};

(C)
PROGMEM char usbHidReportDescriptor[14+6+6+7+1] = {
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)bit

0x09, 0x00, // USAGE (Undefined)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)

0x09, 0x00, // USAGE (Undefined)
0x95, 0x10, // REPORT_COUNT (16)
0x91, 0x02, // OUTPUT (Data,Var,Abs)

0x09, 0x00, // USAGE (Undefined)
0x96, 0x00, 0x01, // REPORT_COUNT (256)
0xb1, 0x02, // FEATURE (Data,Var,Abs)

0xc0 // END_COLLECTION
};

�T���v���v���O����
�u���|�[�g�^�C�v�̊��蓖�ė� (C) ���G�ȑg�ݍ��킹�v�̃\�[�X�������܂��B
hiddev1.c usbconfig.h ���g���q��.txt�ɕύX���Ă���܂��B
��Shift-JIS, [TAB]=4

�S�̃_�E�����[�h�͂�����B
hiddev1.zip �E��L�\�[�X��Makefile
�E�����ATmega88P�p�Ƀr���h����hiddev1.hex
�E����m�F�p�z�X�g���A�v���i���L�R���\�[���A�v���j�@��.NET Framework3.5���K�v�B
2012/08 ��Lzip�t�@�C���X�V ����m�F�‹��F WindowsXP(32bit)/SP3, Windows7(64bit)/SP1

������e
  • feature���|�[�g��256byte����M����B
  • output���|�[�g�Ńz�X�g����f�o�C�X��16byte���M����B
  • PC0�`PC5���X�C�b�`�E�I������ƁiGND�ƃV���[�g�j�APORTC�̏�Ԃ��C���^���v�g�]���Ńz�X�g�֒ʒm�����B
�e�X�g�����@�i�z�X�g�� C#����A�v���œ���e�X�g�������ʂ�\���j


�܂��Afeature���|�[�g��256byte����M�e�X�g���Ă��܂��B0x00�`0xFF�𑗐M���A��M�ł������Ƃ�\���Ă��܂��B
���ɁAoutput���|�[�g��16byte���M�e�X�g���Ă��܂��B
������feature���|�[�g�Ńf�[�^����M���A16byte���������M�ł��Ă������Ƃ��m�F���Ă��܂��B
�Ō�ɁA�C���^���v�g�]��(IN)�̎�M�e�X�g�����Ă��܂��B
PC2��GND�ƃV���[�g�����u�ԁA�u00 3B 22 ... 88�v����M���܂����B0x3B��0b00111011�iPC2��0�ɂȂ��Ă���j
PC2���I�[�v���ɂ����u�ԁA�u00 3F 22 ... 88�v����M���܂����B0x3F��0b00111111�iPC2��1�ɖ߂��Ă���j

�����ɗp������H
ATmega88P
Xtal: 12MHz + 22pF
ZD: 3.6V
RD+,RD-: 68��
Rpull-up: 1.5k��



���@���@��
V-USB�̎g�����̓T���v���f�o�C�X���Q�l�ɂȂ�܂��B����������E�g������`��
���̂��͍̂�ꂻ���ł��B���g�����Ȃ��ɂ�USB�̒m�����K�v�ł��B
�ƌ����Ă��uV-USB���g������x�Ɂv�ƍi��΁A�����𗝉����Ȃ��Ă����v�ł��B
V-USB��USB�̃R���g���[�����قƂ�ǂ���Ă���܂��B
HID�f�o�C�X�����ɂ̓��|�[�g�f�X�N���v�^�̏������𗝉�����K�v������܂��B
�ł��������f�o�C�X�̂悤�ɕ��G�Ȃ��̂����Ȃ���΁A�K���ł����Ƃ��Ȃ�܂��B


(C) �w����t�]�x�H�쎺 �m�g�b�v�y�[�W�֖߂�n
inserted by FC2 system