I finished the first pass through all the platforms last night. Over 100 ports are converted, and ~30 have been tested.
Thanks to everyone for testing. While I'm sure a few ports will end up broken in this process, the low number of failures so far gives me hope that it won't be too many. I've also fixed a few bugs in the process, so it may be a net gain
There are ~20 cams I skipped over because they were "weird" in some way that I will revisit next.
The majority of these use a canon firmware function (_GetKbdState equivalent) to read directly into physw_status rather than reading into kbd_new_state and setting the modified values in physw_status later. I think most of these can be converted to use the normal code, but I need to look at the disassembly to be sure. It would be helpful to have some examples tested, so please let me know if you have one of these.
A490 (also has inverted key logic)
A800 (also has inverted key logic)
IXUS60_SD600 (also has feather code, but manual + google suggests it doesn't have hardware)
IXUS65_SD630 (also has "touch dial" per manual)
IXUS900_SD900 (also has "touch dial" per manual)
IXUSIZOOM_SD30 (has other weirdness)
S2IS (has other weirdness)
S5IS (has comments about regular key input code not being found)
There are also some old vxworks cams like which operate differently from both modern cams and the ixus30/ixus40
There are also some with a "feather" or "touch control dial", as well as some that have this code, but (by looking the manual) do not appear to have the hardware. I don't have any of these cameras and I'm not entirely sure how the related CHDK code is supposed to work. The cameras with CAM_FEATURE_FEATHER defined are
IXUS60_SD600 (but as noted above, I don't think it really has the hardware)
I also skipped over G9 since nafraf is has been working on other areas of the port.