On Sun, Jul 23, 2023 at 11:37:38AM +0000, [email protected] wrote:
> Hello all. Thank you very much for your input. I have taken heed of
> your suggestions in the diff below
>
> On Sat, 22 Jul 2023 20:59:04 -0400 George Koehler <[email protected]>
> wrote:
>
> > We should check if (wskbd_get_backlight != NULL), like we do for
> > WSKBDIO_GETBACKLIGHT. Same for wskbd_set_backlight.
>
> Fixed. I am returning 0 if they are NULL, is that acceptable?
> Index: arch/macppc/dev/adb.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/dev/adb.c,v
> retrieving revision 1.50
> diff -u -p -r1.50 adb.c
> --- arch/macppc/dev/adb.c 11 Apr 2023 00:45:07 -0000 1.50
> +++ arch/macppc/dev/adb.c 23 Jul 2023 11:10:27 -0000
> @@ -96,6 +96,7 @@
> #include <machine/autoconf.h>
> #include <machine/cpu.h>
> #include <dev/ofw/openfirm.h>
> +#include <dev/wscons/wsconsio.h>
>
> #include <dev/adb/adb.h>
> #include <macppc/dev/adbvar.h>
> @@ -242,6 +243,12 @@ void setsoftadb(void);
> int adb_intr(void *arg);
> void adb_cuda_autopoll(void);
> void adb_cuda_fileserver_mode(void);
> +uint8_t pmu_backlight; /* keyboard backlight value */
> +int pmu_get_backlight(struct wskbd_backlight *);
> +int pmu_set_backlight(struct wskbd_backlight *);
> +extern int (*wskbd_get_backlight)(struct wskbd_backlight *);
> +extern int (*wskbd_set_backlight)(struct wskbd_backlight *);
> +
>
> #ifndef SMALL_KERNEL
> void adb_shutdown(void *);
> @@ -1730,8 +1737,11 @@ adbattach(struct device *parent, struct
>
> if (adbHardware == ADB_HW_CUDA)
> adb_cuda_fileserver_mode();
> - if (adbHardware == ADB_HW_PMU)
> + if (adbHardware == ADB_HW_PMU) {
> + wskbd_get_backlight = pmu_get_backlight;
> + wskbd_set_backlight = pmu_set_backlight;
> pmu_fileserver_mode(1);
> + }
>
> /*
> * XXX If the machine doesn't have an ADB bus (PowerBook5,6+)
> @@ -1757,4 +1767,20 @@ adbattach(struct device *parent, struct
> if (adbHardware == ADB_HW_CUDA)
> adb_cuda_autopoll();
> adb_polling = 0;
> +}
> +
> +int
> +pmu_get_backlight(struct wskbd_backlight *kbl)
> +{
> + kbl->min = 0;
> + kbl->max = 0xff;
> + kbl->curval = pmu_backlight;
> + return 0;
> +}
> +
> +int
> +pmu_set_backlight(struct wskbd_backlight *kbl)
> +{
> + pmu_backlight = kbl->curval;
> + return pmu_set_kbl(pmu_backlight);
> }
> Index: arch/macppc/dev/pm_direct.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/dev/pm_direct.c,v
> retrieving revision 1.34
> diff -u -p -r1.34 pm_direct.c
> --- arch/macppc/dev/pm_direct.c 28 Dec 2022 07:40:23 -0000 1.34
> +++ arch/macppc/dev/pm_direct.c 23 Jul 2023 11:10:29 -0000
> @@ -853,3 +853,22 @@ pmu_fileserver_mode(int on)
> }
> pmgrop(&p);
> }
> +
> +int
> +pmu_set_kbl(unsigned int level)
> +{
> + if (level > 0xff)
> + return (EINVAL);
> +
> + PMData p;
> +
> + p.command = 0x4F;
> + p.num_data = 3;
> + p.s_buf = p.r_buf = p.data;
> + p.data[0] = 0;
> + p.data[1] = 0;
> + p.data[2] = level;
> + pmgrop(&p);
> + return (0);
> +}
> +
> Index: arch/macppc/dev/pm_direct.h
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/dev/pm_direct.h,v
> retrieving revision 1.15
> diff -u -p -r1.15 pm_direct.h
> --- arch/macppc/dev/pm_direct.h 21 Oct 2022 22:42:36 -0000 1.15
> +++ arch/macppc/dev/pm_direct.h 23 Jul 2023 11:10:29 -0000
> @@ -67,6 +67,7 @@ struct pmu_battery_info
> };
>
> int pm_battery_info(int, struct pmu_battery_info *);
> +int pmu_set_kbl(unsigned int);
>
> void pm_eject_pcmcia(int);
> void pmu_fileserver_mode(int);
> Index: dev/hid/hidkbd.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/hid/hidkbd.c,v
> retrieving revision 1.9
> diff -u -p -r1.9 hidkbd.c
> --- dev/hid/hidkbd.c 9 Jul 2023 08:02:13 -0000 1.9
> +++ dev/hid/hidkbd.c 23 Jul 2023 11:10:34 -0000
> @@ -143,6 +143,9 @@ static const struct hidkbd_translation a
> { 60, 127 }, /* F3 -> audio mute */
> { 61, 129 }, /* F4 -> audio lower */
> { 62, 128 }, /* F5 -> audio raise */
> + { 65, 234 }, /* F8 -> backlight toggle*/
> + { 66, 236 }, /* F9 -> backlight lower */
> + { 67, 235 }, /* F10 -> backlight raise*/
> #else
> { 63, 102 }, /* F6 -> sleep */
> { 67, 127 }, /* F10 -> audio mute */
> @@ -569,6 +572,9 @@ hidkbd_decode(struct hidkbd *kbd, struct
> case 129:
> case 232:
> case 233:
> + case 234:
> + case 235:
> + case 236:
> wskbd_input(kbd->sc_wskbddev,
> key & RELEASE ? WSCONS_EVENT_KEY_UP :
> WSCONS_EVENT_KEY_DOWN, key & CODEMASK);
> Index: dev/usb/makemap.awk
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/makemap.awk,v
> retrieving revision 1.16
> diff -u -p -r1.16 makemap.awk
> --- dev/usb/makemap.awk 9 Jul 2023 08:02:13 -0000 1.16
> +++ dev/usb/makemap.awk 23 Jul 2023 11:10:44 -0000
> @@ -343,6 +343,9 @@ $1 == "#define" || $1 == "#undef" {
> lines[126] = " KC(126),\tKS_Find,"
> lines[232] = " KC(232),\tKS_Cmd_BrightnessUp,"
> lines[233] = " KC(233),\tKS_Cmd_BrightnessDown,"
> + lines[234] = " KC(234),\tKS_Cmd_KbdBacklightToggle,"
> + lines[235] = " KC(235),\tKS_Cmd_KbdBacklightUp,"
> + lines[236] = " KC(236),\tKS_Cmd_KbdBacklightDown,"
> }
>
> for (i = 0; i < 256; i++)
> Index: dev/usb/ukbdmap.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/ukbdmap.c,v
> retrieving revision 1.48
> diff -u -p -r1.48 ukbdmap.c
> --- dev/usb/ukbdmap.c 9 Jul 2023 08:04:09 -0000 1.48
> +++ dev/usb/ukbdmap.c 23 Jul 2023 11:10:48 -0000
> @@ -187,6 +187,9 @@ static const keysym_t ukbd_keydesc_us[]
> KC(231), KS_Meta_R,
> KC(232), KS_Cmd_BrightnessUp,
> KC(233), KS_Cmd_BrightnessDown,
> + KC(234), KS_Cmd_KbdBacklightToggle,
> + KC(235), KS_Cmd_KbdBacklightUp,
> + KC(236), KS_Cmd_KbdBacklightDown,
> };
>
> #if !defined(WSKBD_NO_INTL_LAYOUTS)
> Index: dev/wscons/wskbd.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/wscons/wskbd.c,v
> retrieving revision 1.115
> diff -u -p -r1.115 wskbd.c
> --- dev/wscons/wskbd.c 9 Jul 2023 08:02:14 -0000 1.115
> +++ dev/wscons/wskbd.c 23 Jul 2023 11:11:03 -0000
> @@ -1544,6 +1544,24 @@ internal_command(struct wskbd_softc *sc,
> #endif
> #endif
>
> + switch (ksym) {
> + case KS_Cmd_KbdBacklightToggle:
> + case KS_Cmd_KbdBacklightDown:
> + case KS_Cmd_KbdBacklightUp:{
> + struct wskbd_backlight data;
> + if (wskbd_get_backlight == NULL || wskbd_set_backlight == NULL)
> + return (0);
> + (*wskbd_get_backlight)(&data);
> + int step = (data.max - data.min + 1) / 8;
> + int val = (ksym == KS_Cmd_KbdBacklightUp) ? data.curval + step
> + : (ksym == KS_Cmd_KbdBacklightDown) ? data.curval - step
> + : (data.curval) ? 0 : (data.max - data.min + 1) / 2;
> + data.curval = (val > 0xff) ? 0xff : (val < 0) ? 0 : val;
> + (*wskbd_set_backlight)(&data);
Are all wskbd_{get,set}_backlight callbacks safe to call from interrupt
context?