CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

USB Keyboard : how to find scancode for specific functions ?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
spilz



Joined: 30 Jan 2012
Posts: 218

View user's profile Send private message

USB Keyboard : how to find scancode for specific functions ?
PostPosted: Sun Jul 28, 2024 5:37 pm     Reply with quote

Hello everyone

i'm working on a project with a PIC18F2550 to use it as an USB keyboard.

I'm able to send ASCII properly, I'm able to send scancode from this list properly :

Code:
typedef enum
{
   USB_KBD_SCANCODE_ESC = 0x29,
   USB_KBD_SCANCODE_CAPS_LOC = 0x39,
   USB_KBD_SCANCODE_F1 = 0x3A, //F2 is 0x3B, F3 is 0x3C, etc.  this is valid up to F12
   USB_KBD_SCANCODE_PRTSC = 0x46,
   USB_KBD_SCANCODE_SCROLL_LOCK = 0x47,
   USB_KBD_SCANCODE_PAUSE = 0x48,
   USB_KBD_SCANCODE_INS = 0x49,
   USB_KBD_SCANCODE_HOME = 0x4A,
   USB_KBD_SCANCODE_PG_UP = 0x4B,
   USB_KBD_SCANCODE_DEL = 0x4C,
   USB_KBD_SCANCODE_END = 0x4D,
   USB_KBD_SCANCODE_PG_DN = 0x4E,
   USB_KBD_SCANCODE_RIGHT = 0x4F,
   USB_KBD_SCANCODE_LEFT = 0x50,
   USB_KBD_SCANCODE_DOWN = 0x51,
   USB_KBD_SCANCODE_UP = 0x52,
   USB_KBD_SCANCODE_NUM_LOCK = 0x53,
   USB_KBD_SCANCODE_WIN_MENU = 0x65,
   USB_KBD_SCANCODE_F13 = 0x68,   //F14 is 0x69, F15 is 0x6A, etc.  this is valid up to F24
   USB_KBD_SCANCODE_HELP = 0x75,
   USB_KBD_SCANCODE_UNDO = 0x7A,
   USB_KBD_SCANCODE_CUT = 0x7B,
   USB_KBD_SCANCODE_COPY = 0x7C,
   USB_KBD_SCANCODE_PASTE = 0x7D,
   USB_KBD_SCANCODE_MUTE = 0x7F,
   USB_KBD_SCANCODE_VOL_UP = 0x80,
   USB_KBD_SCANCODE_VOL_DOWN = 0x81
} kb_scancode_t;


but I need to use more "special" keys as the ones which are on the F1 F2 ... keys (back, musique, next, previous, play, etc.)

but I don't find how to use them.

more global, I don't understand where come from this kb_scancode_t values.

I tried to compare with this :
https://www.plantation-productions.com/Webster/www.artofasm.com/DOS/pdf/apndxc.pdf
but for example ESC = 0x01 and USB_KBD_SCANCODE_ESC = 0x29

thanks in advance for your help
Ttelmah



Joined: 11 Mar 2010
Posts: 19358

View user's profile Send private message

PostPosted: Mon Jul 29, 2024 1:06 am     Reply with quote

This is one of those lovely complicated things.
Now start with the table you have found. This gives PS/2 scancodes. These
were the codes a keyboard device actually sent when connected to the old
PS/2 connector. Now these were interpreted internally inside the PC, so
pressing the ESC key gave a 1, and releasing it gave an 0x81. The internal
code in the PC, then translated this into the ESC being pressed and released
operations.
When USB launched, they decided to implement loads more possibilities than
the basic codes, so the handling moved away from these codes. Instead
you have a huge list of codes for the keys, and the operations on these
(some of which are latched, and some happen only when the corresponding
key is pressed), and the scancodes remain the same for the key involved.
So (for example), '?', returns the same key number as '/', but with
the shift set.
Now to make things worse, different keyboard manufacturers change where
things actually are on the keyboard.

Key list to pull is:
[url]
https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf&ved=2ahUKEwiv9o6UzsuHAxWWX0EAHQa5NQIQFnoECCYQAQ&usg=AOvVaw0qYepWO28gAp8NbbWWs5EY
[/url]

This lists every key Microsoft admit to, and their USB scancodes, together
with the PS/2press and release codes.

Now, some of the ones you are asking about are complex, since they are
not actually standard HID keyboard codes. They use usage pages other
than 7. This is because they are not actually functions originally assigned
to the 'keyboard'. 0xC is actually a 'consumer page' ID. So a character
coming from a special controller, not a keyboard. If you really need to
send these, you are actually going to have to implement another device
using this usage page, with it's own USB descriptor for this page. You
can potentially do this with a combined USB descriptor (look at the
example for kbmouse), so the driver effectively generates two USB
devices, one a keyboard, and the second (for your case), a consumer
controller.
Look at this thread about this:
[url]
https://stackoverflow.com/questions/55166120/combine-keyboard-consumer-control-in-descriptor
[/url]
In particular the last post here.
Do a search on 'USB composite device', for a lot about this.
spilz



Joined: 30 Jan 2012
Posts: 218

View user's profile Send private message

PostPosted: Mon Jul 29, 2024 2:22 am     Reply with quote

Thanks a lot for you explanations

I’m going to try to do it the way you suggest

Have a good day
vtrx



Joined: 11 Oct 2017
Posts: 142

View user's profile Send private message

PostPosted: Tue Jul 30, 2024 4:53 pm     Reply with quote

Read these tips here.

https://www.ccsinfo.com/forum/viewtopic.php?t=59253&highlight=vtrx
Ttelmah



Joined: 11 Mar 2010
Posts: 19358

View user's profile Send private message

PostPosted: Wed Jul 31, 2024 1:29 am     Reply with quote

Good stuff.
Key point here is that he still needs to handle the composite device part,
since he wants both a keyboard and a multimedia controller, but this gives
most of the stuff for the latter. Very Happy
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group