USB Learning


Closed Thread
Results 1 to 20 of 20

Thread: USB Learning

Hybrid View

  1. #1

    Default USB Learning

    Hi guys,

    I'm trying to write a program that could send a keystroke to the PC when a button is pressed.
    I have the main program figured out...the problem is the descriptor files...
    These last few days i've been reading alot of posts and examples but i always end up without a way out.

    Some examples i tried do not compile ( errors ), the example tutorials created by Squibcakes use software that is not avaliable anymore...the only piece of code that worked ( also tested with hardware ) is the CDC_DEMO from the PBP folder.
    I tried to modify the descriptor to act as a keyboard but i cannot understand ( not the same format as the tutorials ).

    Is there anyone that could help me point to the right direction with tips or examples?

    I thank in advance

    Best Regards
    Rui

  2. #2
    Join Date
    Jan 2012
    Location
    Grid EN19MV
    Posts
    159

    Default Re: USB Learning

    If you find out, please share it - I started something along the same lines, and kind of got scared off by the USB part. I just want something to send one character when a button is pressed.
    "I have noticed that even those who assert that everything is predestined and that
    we can change nothing about it still look both ways before they cross the street"


    -Stephen Hawking

  3. #3

    Default Re: USB Learning

    These are the files i'm working with ( main code and descriptor )
    The descriptor is from a different thread ( http://www.picbasic.co.uk/forum/showthread.php?t=2872 )

    Main:

    Code:
    buffer	Var	Byte[8]
    loopcnt	Var	Byte
    state	Var	Byte
    
    DEFINE OSC 48
    @ __CONFIG   _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
    @ __CONFIG   _CONFIG1H, _FOSC_HSPLL_HS_1H
    @ __CONFIG    _CONFIG2H, _WDT_OFF_2H & _WDTPS_512_2H
    @ __CONFIG    _CONFIG3H, _PBADEN_OFF_3H & _MCLRE_OFF_3H 
    @ __CONFIG    _CONFIG4L, _LVP_OFF_4L & _ICPRT_OFF_4L &_XINST_OFF_4L
    
    TRISB=%11111111
    
    B1	     VAR	PORTB.0	'
    B2	     VAR	PORTB.1	'
    B3	     VAR	PORTB.2	'
    B4	     VAR	PORTB.3	'
    B5	     VAR	PORTB.4	'
    B6	     VAR	PORTB.5	'
    B7	     VAR	PORTB.6	'
    B8	     VAR	PORTB.7	'
    
    
    '	Include	"DESCKB.ASM"	' Include the HID descriptors
    '	INCLUDE "USB_ASM_Service.pbp"  ; USB Init and Service interrupt routines
    	Pause 10
    
    	USBInit
    	
    	buffer[0] = 0
    	buffer[1] = 0
    	buffer[2] = 0
        buffer[3] = 0
        buffer[4] = 0
    	buffer[5] = 0
    	buffer[6] = 0
        buffer[7] = 0
    
    MAIN:
    
    IF B1=1 THEN   
      
        buffer[0] = 0   '1st byte = modifier keys (i.e. ctrl, alt, shift)
    	buffer[1] = 0   '2nd byte
    	buffer[2] = $14 '3rd byte = q character  
        buffer[3] = 0
        
    ENDIF
    
    IF B2=1 THEN
    
        buffer[0] = $2  '1st byte = modifier keys (i.e. ctrl, alt, shift)
    	buffer[1] = 0   '2nd byte
    	buffer[2] = $14 '3rd byte = Q character  
        buffer[3] = 0
    
    ENDIF
    
    IF (B1=0) AND (B2=0) THEN
    
        buffer[0] = 0  
    	buffer[1] = 0  
    	buffer[2] = 0  
        buffer[3] = 0
    
    ENDIF
    
    endgame:
    	USBService	' Must service USB regularly
    	USBOut 1, buffer, 8, endgame  ' Send buffer to endpoint 1
    	while(1)
    	wend
    Goto MAIN	' Do it forever
    Descriptor:

    Code:
    ; KBDDESC.ASM
    ;
    ; This file contains a set of descriptors for a standard keyboard.
    
    #define	EP0_BUFF_SIZE		8	; 8, 16, 32, or 64
    #define	MAX_NUM_INT		1	; For tracking Alternate Setting
    #define	MAX_EP_NUMBER		1	; UEP1
    #define	NUM_CONFIGURATIONS	1
    #define	NUM_INTERFACES		1
    
    #define	MODE_PP			_PPBM0
    #define	UCFG_VAL		_PUEN|_TRINT|_FS|MODE_PP	; Full-speed
    ;#define	UCFG_VAL		_PUEN|_TRINT|MODE_PP	; Low-speed
    
    ;#define USE_SELF_POWER_SENSE_IO
    ;#define USE_USB_BUS_SENSE_IO
    
    ; DEVICE CLASS USAGE
    #define USB_USE_HID
    
    ; HID
    ; Endpoints Allocation
    #define	HID_INTF_ID		0x00
    #define	HID_UEP			UEP1
    #define	HID_BD_OUT		ep1Bo
    #define	HID_INT_OUT_EP_SIZE	8
    #define	HID_BD_IN		ep1Bi
    #define	HID_INT_IN_EP_SIZE	8
    #define	HID_NUM_OF_DSC		1
    
    ; ******************************************************************
    ; This table is polled by the host immediately after USB Reset has been released.
    ; This table defines the maximum packet size EP0 can take.
    ; See section 9.6.1 of the Rev 1.0 USB specification.
    ; These fields are application DEPENDENT. Modify these to meet
    ; your specifications.
    ; ******************************************************************
    DeviceDescriptor
    	retlw	(EndDeviceDescriptor-DeviceDescriptor)/2	; bLength Length of this descriptor
    	retlw	DSC_DEV		; bDescType This is a DEVICE descriptor
    	retlw	0x10		; bcdUSBUSB Revision 1.10 (low byte)
    	retlw	0x01		; high byte
    	retlw	0x00		; bDeviceClass
    	retlw	0x00		; bDeviceSubClass
    	retlw	0x00		; bDeviceProtocol
    	retlw	EP0_BUFF_SIZE	; bMaxPacketSize for EP0
    	retlw	0xD8		; idVendor - 0x04D8 is Microchip Vendor ID (low byte)
    	retlw	0x04		; (high byte)
    	retlw	0x02		; idProduct (low byte)
    	retlw	0x00		; (high byte)
    	retlw	0x01		; bcdDevice (low byte)
    	retlw	0x00		; (high byte)
    	retlw	0x01		; iManufacturer
    	retlw	0x02		; iProduct
    	retlw	0x03		; iSerialNumber
    	retlw	NUM_CONFIGURATIONS	; bNumConfigurations
    EndDeviceDescriptor
    
    ; ******************************************************************
    ; This table is retrieved by the host after the address has been set.
    ; This table defines the configurations available for the device.
    ; See section 9.6.2 of the Rev 1.0 USB specification (page 184).
    ; These fields are application DEPENDENT. 
    ; Modify these to meet your specifications.
    ; ******************************************************************
    ; Configuration pointer table
    USB_CD_Ptr
    Configs
    	db	low Config1, high Config1
    	db	low Config1, high Config1
    
    ; Configuration Descriptor
    Config1
    	retlw	(Interface1-Config1)/2	; bLength Length of this descriptor
    	retlw	DSC_CFG		; bDescType2 = CONFIGURATION
    Config1Len
    	retlw	low ((EndConfig1-Config1)/2)	; Length of this configuration
    	retlw	high ((EndConfig1-Config1)/2)
    	retlw	0x01		; bNumInterfaces Number of interfaces
    	retlw	0x01		; bConfigValue Configuration Value
    	retlw	0x04		; iConfigString Index for this config = #01
    	retlw	0xA0		; bmAttributes attributes - bus powered
    	retlw	0x50		; Max power consumption (2X mA)
    Interface1
    	retlw	(HIDDescriptor1-Interface1)/2	; length of descriptor
    	retlw	DSC_INTF
    	retlw	0x00		; number of interface, 0 based array
    	retlw	0x00		; alternate setting
    	retlw	0x01		; number of endpoints used in this interface
    	retlw	0x03		; interface class - assigned by the USB
    	retlw	0x01		; boot device
    	retlw	0x01		; interface protocol - keyboard
    	retlw	0x05		; index to string descriptor that describes this interface
    HIDDescriptor1
    	retlw	(Endpoint1-HIDDescriptor1)/2	; descriptor size (9 bytes)
    	retlw	0x21		; descriptor type (HID)
    	retlw	0x01		; HID class release number (1.00)
    	retlw	0x01
    	retlw	0x00		; Localized country code (none)
    	retlw	0x01		; # of HID class descriptor to follow (1)
    	retlw	0x22		; Report descriptor type (HID)
    ReportDescriptor1Len
    	retlw	low ((EndReportDescriptor1-ReportDescriptor1)/2)
    	retlw	high ((EndReportDescriptor1-ReportDescriptor1)/2)
    Endpoint1
    	retlw	(EndConfig1-Endpoint1)/2	; length of descriptor
    	retlw	DSC_EP
    	retlw	0x81		; EP1, In
    	retlw	0x03		; Interrupt
    	retlw	0x08		; This should be the size of the endpoint buffer
    	retlw	0x00
    	retlw	0x0A		; polling interval (10ms)
    EndConfig1
    
    ReportDescriptor1
    	retlw   0x05
    	retlw   0x01    ; usage page (generic desktop)
    	retlw   0x09
    	retlw   0x06    ; usage (keyboard)
    	retlw   0xA1
    	retlw   0x01    ; collection (application)
    	retlw   0x05
    	retlw   0x07    ;   usage (Key codes)
    	retlw   0x19
    	retlw   0xE0    ;   usage minimum (224)
    	retlw   0x29
    	retlw   0xE7    ;   usage minimum (231)
    	retlw   0x15
    	retlw   0x00    ;     logical minimum (0)
    	retlw   0x25
    	retlw   0x01    ;     logical maximum (1)
    	retlw   0x75
    	retlw   0x01    ;     report size (1)
    	retlw   0x95
    	retlw   0x08    ;     report count (8)
    	retlw   0x81
    	retlw   0x02    ;     Input (data,variable,absolute)
    	retlw   0x95
    	retlw   0x01    ;     report count (1)
    	retlw   0x75
    	retlw   0x08    ;     report size (8)
    	retlw   0x81
    	retlw   0x01    ;     Input (constant)
    	retlw   0x95
    	retlw   0x05    ;     report count (5)
    	retlw   0x75
    	retlw   0x01    ;     report size (1)
    	retlw   0x05
    	retlw   0x08    ;     usage page (page# for leds)
    	retlw   0x19
    	retlw   0x01    ;     Usage minimum (1)
    	retlw   0x29
    	retlw   0x05    ;     Usage maximum (5)
    	retlw   0x91
    	retlw   0x02    ;     output (data,variable,absolute)
    	retlw   0x95
    	retlw   0x01    ;     report count (1)
    	retlw   0x75
    	retlw   0x03    ;     report size (3)
    	retlw   0x91
    	retlw   0x01    ;     output (constant)
    	retlw   0x95
    	retlw   0x06    ;     report count (6)
    	retlw   0x75
    	retlw   0x08    ;     report size (8)
    	retlw   0x15
    	retlw   0x00    ;     logical minimum (0)
    	retlw   0x25
    	retlw   0x65    ;     logical maximum (101)
    	retlw   0x05
    	retlw   0x07    ;     usage page (keycodes)
    	retlw   0x19
    	retlw   0x00    ;     usage minimum (0)
    	retlw   0x29
    	retlw   0x65    ;     usage maximum (101)
    	retlw   0x81
    	retlw   0x00    ;     input (data, array)	
    	retlw   0xC0    ;   end collection
    EndReportDescriptor1
    
    
    langids
    	retlw   low lang_1
    	retlw   high lang_1
    	retlw   low lang_2      ; String indexes of different languages
    	retlw   high lang_2
    
    lang_1				; English
    	retlw   low  String0    ; LangIDs
    	retlw   high String0
    	retlw   low  String1_l1    
    	retlw   high String1_l1
    	retlw   low  String2_l1
    	retlw   high String2_l1
    	retlw   low  String3_l1
    	retlw   high String3_l1
    	retlw   low  String4_l1
    	retlw   high String4_l1
    	retlw   low  String5_l1
    	retlw   high String5_l1
    
    lang_2
    	retlw   low  String0    ; Also point to LangID
    	retlw   high String0
    	retlw   low  String1_l2
    	retlw   high String1_l2
    	retlw   low  String2_l2
    	retlw   high String2_l2
    	retlw   low  String3_l2
    	retlw   high String3_l2
    	retlw   low  String4_l2
    	retlw   high String4_l2
    	retlw   low  String5_l2
    	retlw   high String5_l2
    
    ; String pointer table
    USB_SD_Ptr
    Strings
    	db	low String0, high String0
    	db	low String1_l1, high String1_l1
    	db	low String2_l1, high String2_l1
    	db	low String3_l1, high String3_l1
    	db	low String4_l1, high String4_l1
    	db	low String5_l1, high String5_l1
    
    String0
    	retlw   (String1_l1-String0)/2	; Length of string 
    	retlw   DSC_STR		; Descriptor type 3
    	retlw   0x09		; Language ID (as defined by MS 0x0409)
    	retlw   0x04
    	retlw   0x04		; Some other language ID for testing
    	retlw   0x08
    
    String1_l1
    	retlw   (String2_l1-String1_l1)/2	; Length of string
    	retlw   DSC_STR		; Descriptor type 3
    	retlw   'L'
    	retlw   0x00
    	retlw   'o'
    	retlw   0x00
    	retlw   'r'
    	retlw   0x00
    	retlw   'd'
    	retlw   0x00
    	retlw   ' '
    	retlw   0x00
    	retlw   'N'
    	retlw   0x00
    	retlw   'i'
    	retlw   0x00
    	retlw   'k'
    	retlw   0x00
    	retlw   'o'
    	retlw   0x00
    	retlw   'n'
    	retlw   0x00
    String2_l1
    	retlw   (String3_l1-String2_l1)/2
    	retlw   DSC_STR
    	retlw   'K'
    	retlw   0x00
    	retlw   'B'
    	retlw   0x00
    	retlw   'DX'
    	retlw   0x00
    	retlw   ' '
    	retlw   0x00
    	retlw   'E'
    	retlw   0x00
    	retlw   'N'
    	retlw   0x00
    	retlw   'C'
    	retlw   0x00
    	retlw   'O'
    	retlw   0x00
    	retlw   'D'
    	retlw   0x00
    	retlw   'E'
    	retlw   0x00
    	retlw   'R'
    	retlw   0x00
    String3_l1
    	retlw   (String4_l1-String3_l1)/2
    	retlw   DSC_STR
    	retlw   'V'
    	retlw   0x00
    	retlw   '1'
    	retlw   0x00
    	retlw   '.'
    	retlw   0x00
    	retlw   '1'
    	retlw   0x00
    	retlw   '0'
    	retlw   0x00
    	retlw	'F'
    	retlw	0x00
    	retlw	'S'
    	retlw	0x00
    String4_l1
    	retlw   (String5_l1-String4_l1)/2
    	retlw   DSC_STR
    	retlw   'C'
    	retlw   0x00
    	retlw   'f'
    	retlw   0x00
    	retlw	'g'
    	retlw   0x00
    	retlw	'1'
    	retlw   0x00
    String5_l1
    	retlw   (String6_l1-String5_l1)/2
    	retlw   DSC_STR
    	retlw   'E'
    	retlw   0x00
    	retlw   'P'
    	retlw   0x00
    	retlw   '1'
    	retlw   0x00
    	retlw   'I'
    	retlw   0x00
    	retlw   'n'
    	retlw   0x00
    String6_l1
    
    String1_l2			; Language 2, Chinese. Strings can be totally different than english
    	retlw   (String2_l2-String1_l2)/2	; Length of string
    	retlw   DSC_STR		; Descriptor type 3
    	retlw   'L'
    	retlw   0x00
    	retlw   'o'
    	retlw   0x00
    	retlw   'r'
    	retlw   0x00
    	retlw   'd'
    	retlw   0x00
    	retlw   ' '
    	retlw   0x00
    	retlw   'N'
    	retlw   0x00
    	retlw   'i'
    	retlw   0x00
    	retlw   'k'
    	retlw   0x00
    	retlw   'o'
    	retlw   0x00
    	retlw   'n'
    	retlw   0x00
    String2_l2
    	retlw   (String3_l2-String2_l2)/2
    	retlw   DSC_STR
    	retlw   'K'
    	retlw   0x00
    	retlw   'B'
    	retlw   0x00
    	retlw   'D'
    	retlw   0x00
    	retlw   ' '
    	retlw   0x00
    	retlw   'E'
    	retlw   0x00
    	retlw   'N'
    	retlw   0x00
    	retlw   'C'
    	retlw   0x00
    	retlw   'O'
    	retlw   0x00
    	retlw   'D'
    	retlw   0x00
    	retlw   'E'
    	retlw   0x00
    	retlw   'R'
    	retlw   0x00
    String3_l2
    	retlw   (String4_l2-String3_l2)/2
    	retlw   DSC_STR
    	retlw   'V'
    	retlw   0x00
    	retlw   '1'
    	retlw   0x00
    	retlw   '.'
    	retlw   0x00
    	retlw   '1'
    	retlw   0x00
    	retlw	'F'
    	retlw	0x00
    	retlw	'S'
    	retlw	0x00
    String4_l2
    	retlw   (String5_l2-String4_l2)/2
    	retlw   DSC_STR
    	retlw   'C'
    	retlw   0x00
    	retlw   'f'
    	retlw   0x00
    	retlw   'g'
    	retlw   0x00
    	retlw   '1'
    	retlw   0x00
    String5_l2
    	retlw   (String6_l2-String5_l2)/2
    	retlw   DSC_STR
    	retlw   'E'
    	retlw   0x00
    	retlw   'P'
    	retlw   0x00
    	retlw   '1'
    	retlw   0x00
    	retlw   'I'
    	retlw   0x00
    	retlw   'n'
    	retlw   0x00
    String6_l2
    The mcu is a 18F2550.
    When trying to compile i get alot of errors and i dont undestand why

  4. #4

    Default Re: USB Learning

    This NOT PicBasic nor does it use a Pic but it does do what you want and since source is available, you should be able to extract the
    descriptors - http://blog.flipwork.nl/?x=entry:entry081009-142605.

    One common piece of advise when dealing with descriptors, is to take a working example and make incrementally changes, testing with
    each iteration.

    George

  5. #5

    Default Re: USB Learning

    Hello George,

    Thank you so much for your help .

    You are right when you say to get a working example and do some changes.
    That is what i'm trying to get...a working example.

    All the examples i get here do not compile and i dont know why.
    The one i posted ( descriptor ) is from this forum and it was suposed to be working but it does not compile

    If someone would explain me why this does not compile maybe i would be able to fix it and move to the next stage.

    Regards
    Rui

  6. #6
    Join Date
    Sep 2010
    Location
    Las Vegas, NV
    Posts
    305

    Default Re: USB Learning

    Any chance you could post the errors? Some of the people around here can often narrow the issue when seeing those.

  7. #7

    Default Re: USB Learning

    Greetings,

    Thanks...you are right...

    If i compile with the descriptors commented i get these:

    Code:
    	' Include	"DESCKB.ASM"	' Include the HID descriptors
    Name:  Errors1.jpg
Views: 1118
Size:  322.7 KB

    If i add the descriptor include it will open the desckb.asm file and outline in red lines in it.

    Regards
    Rui
    Last edited by ruijc; - 22nd July 2014 at 19:53.

Similar Threads

  1. remote code learning
    By Bruce in forum Code Examples
    Replies: 20
    Last Post: - 21st February 2021, 15:38
  2. 18F2431 Learning Curve
    By Aussie Barry in forum mel PIC BASIC Pro
    Replies: 20
    Last Post: - 25th June 2012, 15:41
  3. Learning Stepper motor
    By azmax100 in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 20th April 2009, 06:23
  4. Learning Basic
    By bartman in forum General
    Replies: 14
    Last Post: - 19th November 2004, 00:45

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts