Hi tech@, This is an attempt at adding lid state detection in ykbec(4). Tested on a Lemote Yeeloong 8101B.
Comments? OK? Index: share/man/man4/man4.loongson/ykbec.4 =================================================================== RCS file: /cvs/src/share/man/man4/man4.loongson/ykbec.4,v retrieving revision 1.3 diff -u -p -r1.3 ykbec.4 --- share/man/man4/man4.loongson/ykbec.4 25 Feb 2010 10:07:11 -0000 1.3 +++ share/man/man4/man4.loongson/ykbec.4 12 Nov 2016 15:10:03 -0000 @@ -40,9 +40,11 @@ Battery control Button events .It Power management +.It +Lid state .El .Pp -Fan and battery information is made available via the +Fan, battery, and lid information is made available via the .Xr sysctl 3 hardware sensor interface. Not all the device interfaces are supported under Index: sys/arch/loongson/dev/kb3310.c =================================================================== RCS file: /cvs/src/sys/arch/loongson/dev/kb3310.c,v retrieving revision 1.20 diff -u -p -r1.20 kb3310.c --- sys/arch/loongson/dev/kb3310.c 8 Jan 2016 15:54:13 -0000 1.20 +++ sys/arch/loongson/dev/kb3310.c 12 Nov 2016 15:10:05 -0000 @@ -76,8 +76,10 @@ static const struct { #define YKBEC_CHARGING 7 { "Battery charging", SENSOR_INDICATOR }, #define YKBEC_AC 8 - { "AC-Power", SENSOR_INDICATOR } -#define YKBEC_NSENSORS 9 + { "AC-Power", SENSOR_INDICATOR }, +#define YKBEC_LID 9 + { "Lid open", SENSOR_INDICATOR } +#define YKBEC_NSENSORS 10 }; struct ykbec_softc { @@ -310,6 +312,10 @@ ykbec_read16(struct ykbec_softc *mcsc, u #define REG_FAN_ON 1 #define REG_FAN_OFF 0 +#define REG_LID_STATE 0xf4bd +#define LID_OPEN 1 +#define LID_CLOSED 0 + #define YKBEC_SCI_IRQ 0xa #ifdef DEBUG @@ -337,7 +343,7 @@ ykbec_refresh(void *arg) { struct ykbec_softc *sc = (struct ykbec_softc *)arg; u_int val, bat_charge, bat_status, charge_status, bat_state, power_flag; - u_int cap_pct, fullcap; + u_int lid_state, cap_pct, fullcap; int current; #if NAPM > 0 struct apm_power_info old; @@ -376,11 +382,14 @@ ykbec_refresh(void *arg) charge_status = ykbec_read(sc, REG_CHARGE_STATUS); bat_state = ykbec_read(sc, REG_BAT_STATE); power_flag = ykbec_read(sc, REG_POWER_FLAG); + lid_state = ykbec_read(sc, REG_LID_STATE); sc->sc_sensor[YKBEC_CHARGING].value = !!ISSET(bat_state, BAT_STATE_CHARGING); sc->sc_sensor[YKBEC_AC].value = !!ISSET(power_flag, POWER_FLAG_ADAPTER_IN); + + sc->sc_sensor[YKBEC_LID].value = !!ISSET(lid_state, LID_OPEN); sc->sc_sensor[YKBEC_CAP].status = ISSET(bat_status, BAT_STATUS_BAT_LOW) ? SENSOR_S_CRIT : SENSOR_S_OK;