PERFORCE change 123168 for review
Rui Paulo
rpaulo at FreeBSD.org
Mon Jul 9 02:12:49 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123168
Change 123168 by rpaulo at rpaulo_epsilon on 2007/07/09 02:12:16
Add support for keyboard backlight control (found on MacBook
Pros).
dev.asmc.N.light.{left,right} sysctl tree is now created.
Setting a value on the "right" or "left" nodes sets the
keyboard backlight level. Reading those sysctl nodes, gives
the each sensor raw data.
While there fix the first parameter of DRIVER_MODULE() and
change a label so that asmc_sms_calibrate() is not called on
Mac Minis.
Affected files ...
.. //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#24 edit
.. //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmcvar.h#11 edit
Differences ...
==== //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#24 (text+ko) ====
@@ -23,7 +23,7 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#23 $
+ * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#24 $
*
*/
@@ -100,6 +100,8 @@
static int asmc_mb_sysctl_sms_x(SYSCTL_HANDLER_ARGS);
static int asmc_mb_sysctl_sms_y(SYSCTL_HANDLER_ARGS);
static int asmc_mb_sysctl_sms_z(SYSCTL_HANDLER_ARGS);
+static int asmc_mbp_sysctl_light_left(SYSCTL_HANDLER_ARGS);
+static int asmc_mbp_sysctl_light_right(SYSCTL_HANDLER_ARGS);
static struct asmc_model *asmc_match(device_t dev);
@@ -110,53 +112,55 @@
asmc_mb_sysctl_fanminspeed, \
asmc_mb_sysctl_fanmaxspeed, \
asmc_mb_sysctl_fantargetspeed
+#define ASMC_LIGHT_FUNCS asmc_mbp_sysctl_light_left, \
+ asmc_mbp_sysctl_light_right
struct asmc_model asmc_models[] = {
{
"MacBook1,1", "Apple SMC MacBook Core Duo",
- ASMC_SMS_FUNCS, ASMC_FAN_FUNCS,
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, NULL, NULL,
ASMC_MB_TEMPS, ASMC_MB_TEMPNAMES, ASMC_MB_TEMPDESCS
},
{
"MacBook2,1", "Apple SMC MacBook Core 2 Duo",
- ASMC_SMS_FUNCS, ASMC_FAN_FUNCS,
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, NULL, NULL,
ASMC_MB_TEMPS, ASMC_MB_TEMPNAMES, ASMC_MB_TEMPDESCS
},
{
"MacBookPro1,1", "Apple SMC MacBook Pro Core Duo (15-inch)",
- ASMC_SMS_FUNCS, ASMC_FAN_FUNCS,
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, ASMC_LIGHT_FUNCS,
ASMC_MBP_TEMPS, ASMC_MBP_TEMPNAMES, ASMC_MBP_TEMPDESCS
},
{
"MacBookPro1,2", "Apple SMC MacBook Pro Core Duo (17-inch)",
- ASMC_SMS_FUNCS, ASMC_FAN_FUNCS,
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, ASMC_LIGHT_FUNCS,
ASMC_MBP_TEMPS, ASMC_MBP_TEMPNAMES, ASMC_MBP_TEMPDESCS
},
{
"MacBookPro2,1", "Apple SMC MacBook Pro Core 2 Duo (17-inch)",
- ASMC_SMS_FUNCS, ASMC_FAN_FUNCS,
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, ASMC_LIGHT_FUNCS,
ASMC_MBP_TEMPS, ASMC_MBP_TEMPNAMES, ASMC_MBP_TEMPDESCS
},
{
"MacBookPro2,2", "Apple SMC MacBook Pro Core 2 Duo (15-inch)",
- ASMC_SMS_FUNCS, ASMC_FAN_FUNCS,
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, ASMC_LIGHT_FUNCS,
ASMC_MBP_TEMPS, ASMC_MBP_TEMPNAMES, ASMC_MBP_TEMPDESCS
},
{
"MacBookPro3,1", "Apple SMC MacBook Pro Core 2 Duo (15-inch LED)",
- ASMC_SMS_FUNCS, ASMC_FAN_FUNCS,
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, ASMC_LIGHT_FUNCS,
ASMC_MBP_TEMPS, ASMC_MBP_TEMPNAMES, ASMC_MBP_TEMPDESCS
},
{
"MacBookPro3,2", "Apple SMC MacBook Pro Core 2 Duo (17-inch HD)",
- ASMC_SMS_FUNCS, ASMC_FAN_FUNCS,
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, ASMC_LIGHT_FUNCS,
ASMC_MBP_TEMPS, ASMC_MBP_TEMPNAMES, ASMC_MBP_TEMPDESCS
},
@@ -164,6 +168,7 @@
{
"Macmini1,1", "Apple SMC Mac Mini",
NULL, NULL, NULL,
+ NULL, NULL,
ASMC_FAN_FUNCS,
ASMC_MM_TEMPS, ASMC_MM_TEMPNAMES, ASMC_MM_TEMPDESCS
},
@@ -173,6 +178,7 @@
#undef ASMC_SMS_FUNCS
#undef ASMC_FAN_FUNCS
+#undef ASMC_LIGHT_FUNCS
/*
* Driver methods.
@@ -195,7 +201,7 @@
static devclass_t asmc_devclass;
-DRIVER_MODULE(ascm, isa, asmc_driver, asmc_devclass, NULL, NULL);
+DRIVER_MODULE(asmc, isa, asmc_driver, asmc_devclass, NULL, NULL);
static void
@@ -367,6 +373,27 @@
"Sudden Motion Sensor Z value");
/*
+ * dev.asmc.n.light
+ */
+ if (model->smc_light_left) {
+ sc->sc_light_tree = SYSCTL_ADD_NODE(sysctlctx,
+ SYSCTL_CHILDREN(sysctlnode), OID_AUTO, "light",
+ CTLFLAG_RD, 0, "Keyboard backlight sensors");
+
+ SYSCTL_ADD_PROC(sysctlctx,
+ SYSCTL_CHILDREN(sc->sc_light_tree),
+ OID_AUTO, "left", CTLTYPE_INT | CTLFLAG_RD,
+ dev, 0, model->smc_light_left, "I",
+ "Keyboard backlight left sensor");
+
+ SYSCTL_ADD_PROC(sysctlctx,
+ SYSCTL_CHILDREN(sc->sc_light_tree),
+ OID_AUTO, "right", CTLTYPE_INT | CTLFLAG_RD,
+ dev, 0, model->smc_light_right, "I",
+ "Keyboard backlight right sensor");
+ }
+
+ /*
* Need a taskqueue to send devctl_notify() events
* when the SMS interrupt us.
*
@@ -500,9 +527,9 @@
DELAY(50);
}
+
+ asmc_sms_calibrate(dev);
out:
- asmc_sms_calibrate(dev);
-
sc->sc_nfan = asmc_fan_count(dev);
if (sc->sc_nfan > ASMC_MAXFANS) {
device_printf(dev, "more than %d fans were detected. Please "
@@ -912,3 +939,59 @@
return (error);
}
+
+static int
+asmc_mbp_sysctl_light_left(SYSCTL_HANDLER_ARGS)
+{
+ device_t dev = (device_t) arg1;
+ uint8_t buf[6];
+ int error;
+ unsigned int level;
+ int32_t v;
+
+ asmc_key_read(dev, ASMC_KEY_LIGHTRIGHT, buf, 6);
+
+ v = buf[2];
+ error = sysctl_handle_int(oidp, &v, sizeof(v), req);
+ if (error == 0 && req->newptr != NULL) {
+ level = *(unsigned int *)req->newptr;
+
+ if (level > 255)
+ return (EINVAL);
+
+ buf[0] = level;
+ buf[1] = 0x00;
+
+ asmc_key_write(dev, ASMC_KEY_LIGHTVALUE, buf, 2);
+ }
+
+ return (error);
+}
+
+static int
+asmc_mbp_sysctl_light_right(SYSCTL_HANDLER_ARGS)
+{
+ device_t dev = (device_t) arg1;
+ uint8_t buf[6];
+ int error;
+ unsigned int level;
+ int32_t v;
+
+ asmc_key_read(dev, ASMC_KEY_LIGHTRIGHT, buf, 6);
+
+ v = buf[2];
+ error = sysctl_handle_int(oidp, &v, sizeof(v), req);
+ if (error == 0 && req->newptr != NULL) {
+ level = *(unsigned int *)req->newptr;
+
+ if (level > 255)
+ return (EINVAL);
+
+ buf[0] = level;
+ buf[1] = 0x00;
+
+ asmc_key_write(dev, ASMC_KEY_LIGHTVALUE, buf, 2);
+ }
+
+ return (error);
+}
==== //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmcvar.h#11 (text+ko) ====
@@ -23,7 +23,7 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmcvar.h#10 $
+ * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmcvar.h#11 $
*
*/
@@ -39,6 +39,7 @@
struct sysctl_oid *sc_fan_tree[ASMC_MAXFANS+1];
struct sysctl_oid *sc_temp_tree;
struct sysctl_oid *sc_sms_tree;
+ struct sysctl_oid *sc_light_tree;
struct asmc_model *sc_model;
int sc_rid;
struct resource *sc_res;
@@ -61,6 +62,8 @@
int (*smc_fan_minspeed)(SYSCTL_HANDLER_ARGS);
int (*smc_fan_maxspeed)(SYSCTL_HANDLER_ARGS);
int (*smc_fan_targetspeed)(SYSCTL_HANDLER_ARGS);
+ int (*smc_light_left)(SYSCTL_HANDLER_ARGS);
+ int (*smc_light_right)(SYSCTL_HANDLER_ARGS);
const char *smc_temps[8];
const char *smc_tempnames[8];
@@ -130,7 +133,8 @@
* Keyboard backlight.
*/
#define ASMC_KEY_LIGHTLEFT "ALV0" /* RO; 6 bytes */
-#define ASMC_KEY_RIGHTLEFT "ALV1" /* RO; 6 bytes */
+#define ASMC_KEY_LIGHTRIGHT "ALV1" /* RO; 6 bytes */
+#define ASMC_KEY_LIGHTVALUE "LKSB" /* WO; 2 bytes */
/*
* Clamshell.
More information about the p4-projects
mailing list