Port-hpcsh archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Jornada680 brightness control



Hi.  First, sorry for my broken English.

I made sure that the value of DADR0, SH3 D/Aconverter data register,
equals brightness of Jornada680's backlight.

The value is from 99 to 255, 99 lightest and 255 darkest.

Following patch is to dim backlight and make LCD standby.
I don't test this on PERSONA.

I'll be glad if this is somewhat useful for you.

Some comments are favarably received.
best regards.

-- Shoichi Tomii

Index: syssrc/sys/arch/hpcsh/dev/hd64461/hd64461video.c
===================================================================
RCS file: /usr/sup/syssrc/sys/arch/hpcsh/dev/hd64461/hd64461video.c,v
retrieving revision 1.11
diff -u -r1.11 hd64461video.c
--- syssrc/sys/arch/hpcsh/dev/hd64461/hd64461video.c    2002/05/03 07:31:25     
1.11
+++ syssrc/sys/arch/hpcsh/dev/hd64461/hd64461video.c    2002/07/24 10:45:08
@@ -54,6 +54,7 @@
 
 #include <machine/bus.h>
 #include <machine/intr.h>
+#include <machine/config_hook.h>
 
 #include <hpcsh/dev/hd64461/hd64461var.h>
 #include <hpcsh/dev/hd64461/hd64461reg.h>
@@ -75,6 +76,9 @@
 #endif
 #include <machine/debug.h>
 
+#include <sh3/devreg.h>
+#include <sh3/dareg.h>
+
 struct hd64461video_chip;
 struct hd64461video_font {
        struct wsdisplay_font wsfont;   
@@ -87,6 +91,8 @@
        enum hd64461_module_id sc_module_id;
        struct hd64461video_chip *sc_vc;
 
+       void *sc_powerhook;
+
        struct hd64461video_font sc_font;
 };
 
@@ -116,6 +122,7 @@
 
 STATIC int hd64461video_match(struct device *, struct cfdata *, void *);
 STATIC void hd64461video_attach(struct device *, struct device *, void *);
+STATIC int hd64461video_power(void *, int, long, void *);
 
 STATIC void hd64461video_setup_hpcfbif(struct hd64461video_chip *);
 STATIC void hd64461video_update_videochip_status(struct hd64461video_chip *);
@@ -197,6 +204,14 @@
        sc->sc_vc = &hd64461video_chip;
        printf(": ");
 
+       /* Add a hard power hook to power saving */
+       sc->sc_powerhook = config_hook(CONFIG_HOOK_BUTTONEVENT,
+                       CONFIG_HOOK_BUTTONEVENT_LIGHT,
+                       CONFIG_HOOK_SHARE,
+                       hd64461video_power, sc);
+       if (sc->sc_powerhook == 0)
+               printf("WARNING unable to establish hard power hook");
+
        /* detect frame buffer size */
        fbsize = hd64461video_frame_buffer_size(&hd64461video_chip);
        format_bytes(pbuf, sizeof(pbuf), fbsize);
@@ -1245,3 +1260,59 @@
 }
 
 #endif /* HD64461VIDEO_DEBUG */
+
+int
+hd64461video_power(void *ctx, int type, long id, void *msg)
+{
+       u_int16_t r16;
+       u_int8_t r8;
+       static u_int8_t brightness;
+       int why = (int)msg;
+
+       switch (why) {
+       case PWR_SUSPEND:
+               /* FALL THROUGH */
+       case PWR_STANDBY:
+               brightness = _reg_read_1(SHREG_DADR0);
+               r8 = 0xff;
+               _reg_write_1(SHREG_DADR0, r8);
+
+               r16 = hd64461_reg_read_2(HD64461_LCDLDR1_REG16);
+               r16 &= ~HD64461_LCDLDR1_DON;
+               hd64461_reg_write_2(HD64461_LCDLDR1_REG16, r16);
+
+               r16 = hd64461_reg_read_2(HD64461_LCDCCR_REG16);
+               r16 |= HD64461_LCDCCR_MOFF;
+               hd64461_reg_write_2(HD64461_LCDCCR_REG16, r16);
+
+               r16 = hd64461_reg_read_2(HD64461_SYSSTBCR_REG16);
+               r16 |= HD64461_SYSSTBCR_SLCDST;
+               hd64461_reg_write_2(HD64461_SYSSTBCR_REG16, r16);
+
+               break;
+       case PWR_RESUME:
+               _reg_write_1(SHREG_DADR0, brightness);
+
+               r16 = hd64461_reg_read_2(HD64461_SYSSTBCR_REG16);
+               r16 &= ~HD64461_SYSSTBCR_SLCDST;
+               hd64461_reg_write_2(HD64461_SYSSTBCR_REG16, r16);
+
+               r16 = hd64461_reg_read_2(HD64461_LCDCCR_REG16);
+               r16 &= ~HD64461_LCDCCR_MOFF;
+               hd64461_reg_write_2(HD64461_LCDCCR_REG16, r16);
+
+               r16 &= ~HD64461_LCDCCR_STREQ;
+               hd64461_reg_write_2(HD64461_LCDCCR_REG16, r16);
+               while ((hd64461_reg_read_2(HD64461_LCDCCR_REG16) &
+                               HD64461_LCDCCR_STBAK) != 0)
+                       ;
+
+               r16 = hd64461_reg_read_2(HD64461_LCDLDR1_REG16);
+               r16 |= HD64461_LCDLDR1_DON;
+               hd64461_reg_write_2(HD64461_LCDLDR1_REG16, r16);
+
+               break;
+       }
+
+       return (0);
+}
Index: syssrc/sys/dev/hpc/hpckbdkeymap.h
===================================================================
RCS file: /usr/sup/syssrc/sys/dev/hpc/hpckbdkeymap.h,v
retrieving revision 1.15
diff -u -r1.15 hpckbdkeymap.h
--- syssrc/sys/dev/hpc/hpckbdkeymap.h   2002/05/11 04:57:43     1.15
+++ syssrc/sys/dev/hpc/hpckbdkeymap.h   2002/07/01 21:52:18
@@ -567,8 +567,8 @@
 };
 
 const int jornada6x0_special_keymap[] = {
-       [KEY_SPECIAL_OFF]       = 88,
-       [KEY_SPECIAL_LIGHT]     = -1
+       [KEY_SPECIAL_OFF]       = -1,
+       [KEY_SPECIAL_LIGHT]     = 88
 };
 
 /* 
--- syssrc/sys/arch/sh3/include/dareg.h Sun Jul 21 01:29:29 2002
+++ syssrc/sys/arch/sh3/include/dareg.h Sat Jul 20 05:38:26 2002
@@ -0,0 +1,18 @@
+#ifndef _SH3_DAREG_H_
+#define        _SH3_DAREG_H_
+
+#if !defined(SH4)
+
+/* SH3 definitions */
+
+#define SHREG_DADR0    0xa40000a0
+#define SHREG_DADR1    0xa40000a2
+#define SHREG_DACR     0xa40000a4
+
+#define SHREG_DACR_DAOE1       0x80
+#define SHREG_DACR_DAOE0       0x40
+#define SHREG_DACR_DAE         0x20
+
+#endif
+
+#endif /* !_SH3_DAREG_H_ */



Home | Main Index | Thread Index | Old Index