Changeset 1604 for branches/release-1_0


Ignore:
Timestamp:
01/23/12 08:19:21 (16 months ago)
Author:
philmoz
Message:

Fix for inverted key logic and initialisation for A495 (thx srsa_4c).
Also applied to A490 which has the same key logic.
http://chdk.setepontos.com/index.php?topic=650.msg80363#msg80363

Location:
branches/release-1_0/platform
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/release-1_0/platform/a490/kbd.c

    r1344 r1604  
    1212 
    1313 
    14 static long kbd_new_state[3]; 
    15 static long kbd_prev_state[3]; 
    16 static long kbd_mod_state[3]; 
     14static long kbd_new_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; 
     15static long kbd_prev_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; 
     16static long kbd_mod_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; 
    1717 
    1818static long last_kbd_key = 0; 
     
    2727#define KEYS_MASK1 (0x00000000) 
    2828#define KEYS_MASK2 (0x017001f4) 
     29#define KEYS_INV2 (0x01700000) 
     30/* 
     31the 4 button states residing in the upper half of physw_status[2] seem to be inverted 
     32to handle these correctly, their value needs to be inverted: 
     33- when reading from physw_status[2] to the state variables 
     34- when writing to physw_status[2] from the state variables 
     35KEYS_INV2 should be used for that 
     36SD_READONLY_FLAG and USB_MASK are not affected by this 
     37 
     38when idle, physw_status[2] looks like: "000001000000000xxxxx000111110100" 
     39                         KEYS_MASK2 is "00000001011100000000000111110100" 
     40*/ 
    2941 
    3042#define SD_READONLY_FLAG (0x40000) 
     
    161173static void __attribute__((noinline)) mykbd_task_proceed() 
    162174{ 
     175        /* Initialize our own kbd_new_state[] array with the 
     176           current physical status. (inspired by the S90 port) 
     177           */ 
     178        kbd_new_state[0] = physw_status[0]; 
     179        kbd_new_state[1] = physw_status[1]; 
     180        kbd_new_state[2] = physw_status[2] ^ KEYS_INV2; 
    163181        while (physw_run){ 
    164182                _SleepTask(10); 
     
    223241        kbd_new_state[0] = physw_status[0]; 
    224242        kbd_new_state[1] = physw_status[1]; 
    225         kbd_new_state[2] = physw_status[2]; 
     243        kbd_new_state[2] = physw_status[2] ^ KEYS_INV2; 
    226244         
    227245        if (kbd_process() == 0){ 
     
    231249        physw_status[0] = (kbd_new_state[0] | KEYS_MASK0) & (~KEYS_MASK0 | kbd_mod_state[0]); 
    232250        //physw_status[1] = (kbd_new_state[1] | KEYS_MASK1) & (~KEYS_MASK1 | kbd_mod_state[1]); 
    233         physw_status[2] = (kbd_new_state[2] | KEYS_MASK2) & (~KEYS_MASK2 | kbd_mod_state[2]); 
     251        physw_status[2] = ((kbd_new_state[2] | KEYS_MASK2) & (~KEYS_MASK2 | kbd_mod_state[2])) ^ KEYS_INV2; 
    234252        } 
    235253         
     
    281299        kbd_mod_state[0] |= KEYS_MASK0; 
    282300        kbd_mod_state[1] |= KEYS_MASK1; 
    283         kbd_mod_state[2] |= KEYS_MASK2 & ~0x01700000; 
     301        kbd_mod_state[2] |= KEYS_MASK2; 
    284302} 
    285303 
     
    289307        for (i=0;keymap[i].hackkey;i++){ 
    290308                if (keymap[i].hackkey == key){ 
    291                         switch (keymap[i].hackkey) { 
    292                         case KEY_UP: case KEY_DOWN: case KEY_LEFT: case KEY_MENU: 
    293                                 return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 0:1; 
    294                         default: 
    295                                 return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 1:0; 
    296                         } 
     309                        return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 1:0; 
    297310                } 
    298311        } 
  • branches/release-1_0/platform/a495/kbd.c

    r1376 r1604  
    1212 
    1313 
    14 static long kbd_new_state[3]; 
    15 static long kbd_prev_state[3]; 
    16 static long kbd_mod_state[3]; 
     14static long kbd_new_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; 
     15static long kbd_prev_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; 
     16static long kbd_mod_state[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; 
    1717 
    1818static long last_kbd_key = 0; 
     
    2727#define KEYS_MASK1 (0x00000000) 
    2828#define KEYS_MASK2 (0x017001f4) 
     29#define KEYS_INV2 (0x01700000) 
     30/* 
     31the 4 button states residing in the upper half of physw_status[2] seem to be inverted 
     32to handle these correctly, their value needs to be inverted: 
     33- when reading from physw_status[2] to the state variables 
     34- when writing to physw_status[2] from the state variables 
     35KEYS_INV2 should be used for that 
     36SD_READONLY_FLAG and USB_MASK are not affected by this 
     37 
     38when idle, physw_status[2] looks like: "000001000000000xxxxx000111110100" 
     39                         KEYS_MASK2 is "00000001011100000000000111110100" 
     40*/ 
    2941 
    3042#define SD_READONLY_FLAG (0x40000) 
     
    4153    { 0, KEY_PRINT      , 0x00020000 }, // Playback 
    4254 
    43     { 2, KEY_SHOOT_FULL , 0x00000030 }, // 0x00000010 (KEY_SHOOT_HALF) + 0x00000030 (KEY_SHOOT_FULL_ONLY) 
     55    { 2, KEY_SHOOT_FULL , 0x00000030 }, // 0x00000010 (KEY_SHOOT_HALF) + 0x00000020 (KEY_SHOOT_FULL_ONLY) 
    4456    { 2, KEY_SHOOT_FULL_ONLY, 0x00000020 }, 
    4557    { 2, KEY_SHOOT_HALF , 0x00000010 }, 
     
    161173static void __attribute__((noinline)) mykbd_task_proceed() 
    162174{ 
     175        /* Initialize our own kbd_new_state[] array with the 
     176           current physical status. (inspired by the S90 port) 
     177           */ 
     178        kbd_new_state[0] = physw_status[0]; 
     179        kbd_new_state[1] = physw_status[1]; 
     180        kbd_new_state[2] = physw_status[2] ^ KEYS_INV2; 
    163181        while (physw_run){ 
    164182                _SleepTask(10); 
     
    223241        kbd_new_state[0] = physw_status[0]; 
    224242        kbd_new_state[1] = physw_status[1]; 
    225         kbd_new_state[2] = physw_status[2]; 
     243        kbd_new_state[2] = physw_status[2] ^ KEYS_INV2; 
    226244         
    227245        if (kbd_process() == 0){ 
     
    231249        physw_status[0] = (kbd_new_state[0] | KEYS_MASK0) & (~KEYS_MASK0 | kbd_mod_state[0]); 
    232250        //physw_status[1] = (kbd_new_state[1] | KEYS_MASK1) & (~KEYS_MASK1 | kbd_mod_state[1]); 
    233         physw_status[2] = (kbd_new_state[2] | KEYS_MASK2) & (~KEYS_MASK2 | kbd_mod_state[2]); 
     251        physw_status[2] = ((kbd_new_state[2] | KEYS_MASK2) & (~KEYS_MASK2 | kbd_mod_state[2])) ^ KEYS_INV2; 
    234252        } 
    235253         
     
    281299        kbd_mod_state[0] |= KEYS_MASK0; 
    282300        kbd_mod_state[1] |= KEYS_MASK1; 
    283         kbd_mod_state[2] |= KEYS_MASK2 & ~0x01700000; 
     301        kbd_mod_state[2] |= KEYS_MASK2; 
    284302} 
    285303 
     
    289307        for (i=0;keymap[i].hackkey;i++){ 
    290308                if (keymap[i].hackkey == key){ 
    291                         switch (keymap[i].hackkey) { 
    292                         case KEY_UP: case KEY_DOWN: case KEY_LEFT: case KEY_MENU: 
    293                                 return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 0:1; 
    294                         default: 
    295                                 return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 1:0; 
    296                         } 
     309                        return ((kbd_new_state[keymap[i].grp] & keymap[i].canonkey) == 0) ? 1:0; 
    297310                } 
    298311        } 
Note: See TracChangeset for help on using the changeset viewer.