Okay, try this one (zImage attached).

Code:
--- hijack/arch/arm/special/empeg_display.c.orig        2008-06-04 13:17:32.000000000 -0400
+++ hijack/arch/arm/special/empeg_display.c     2014-02-02 14:56:11.467315647 -0500
@@ -879,11 +879,13 @@
 static int           sendcontrol_busy = 0;
 static unsigned long sendcontrol_timestamp = 0;
 extern unsigned long jiffies_since(unsigned long);
+extern int hijack_hispeed_button_pic;
 
-int display_sendcontrol_part2(int b)
+int display_sendcontrol_part2(unsigned char b)
 {
-       int bit;
+       unsigned char bit;
        unsigned long flags;
+       unsigned int inter_bit_delay = hijack_hispeed_button_pic ? 7 : 15;
 
        /* Send a byte to the display serially via control line (mk2 only) */
        if (empeg_hardwarerevision()<6) return 0;
@@ -896,30 +898,33 @@
        save_flags_clif(flags);
 
        /* Send 8 bits */
-       for(bit=7;bit>=0;bit--) {
+       for (bit = 0x80; bit; bit >>= 1) {
                /* Set line low */
                GPCR=EMPEG_DISPLAYCONTROL;
 
                /* Check the bit */
-               if (b&(1<<bit)) {
+               if (b & bit) {
                        /* High - 15us of low */
-                       udelay(15);
+                       udelay (inter_bit_delay);
                } else {
                        /* Low - 2us of low */
-                       //udelay(1);
-                       { int a; for(a=0;a<50;a++); }
+                       int a, delay = hijack_hispeed_button_pic ? 22 : 50;
+                       for (a = 0; a < delay; a++);
                }
 
                /* Set line high */
                GPSR=EMPEG_DISPLAYCONTROL;
 
                /* Inter-bit delay */
-               udelay(15);
+               udelay(inter_bit_delay);
        }
 
        /* End of transmission, line low */
        GPCR=EMPEG_DISPLAYCONTROL;
-       udelay( (sendcontrol_busy == 1) ? 5 : 40 );
+       if (hijack_hispeed_button_pic)
+               udelay( (sendcontrol_busy == 1) ? 2 : 20 );
+       else
+               udelay( (sendcontrol_busy == 1) ? 5 : 40 );
 
        /* Reenable IRQs */
        sendcontrol_busy = 0;
--- hijack/arch/arm/special/hijack.c.orig       2011-07-20 06:22:58.000000000 -0700
+++ hijack/arch/arm/special/hijack.c    2014-02-01 08:12:48.163697927 -0800
@@ -548,6 +548,7 @@
 //
 static int hijack_buttonled_off_level;         // button brightness when player is "off"
 static int hijack_buttonled_dim_level;         // when non-zero, button brightness when headlights are on
+       int hijack_hispeed_button_pic;          // 1 == change timing to work with a 40 MHz button PIC
 static int hijack_dc_servers;                  // 1 == allow kftpd/khttpd when on DC power
 static int hijack_decimal_fidentry;            // 1 == fidentry uses base10 instead of hex
        int hijack_disable_emplode;             // 1 == block TCP port 8300 (Emplode/Emptool)
@@ -665,6 +666,7 @@
 //===========================  ==========================      =========               ======= ===     ================
 {"buttonled_off",              &hijack_buttonled_off_level,    1,                      1,      0,      7},
 {"buttonled_dim",              &hijack_buttonled_dim_level,    0,                      1,      0,      7},
+{"hispeed_button_pic",         &hijack_hispeed_button_pic,     0,                      1,      0,      1},
 {"dc_servers",                 &hijack_dc_servers,             0,                      1,      0,      1},
 {"decimal_fidentry",           &hijack_decimal_fidentry,       0,                      1,      0,      1},
 {"disable_emplode",            &hijack_disable_emplode,        0,                      1,      0,      1},


Attachments
zImage.pic (398 downloads)
Description: faster PIC v4.

hijack_hispeed_button_pic_v4.patch (273 downloads)
Description: v4 of the patch.