GObject 子类重载基类实现的接口方法

GObject 对象系统中,基类A如实现了接口类I并且实现了I的三方法 I::a, I::b, I::c 后。基于类A的派生出的子类B如想重载 I::c 方法,只需要重新实现一下接口类 I,在接口类的初始化方法中仅仅重载 I::c 方法即可,而基类已经实现的 I::a, I::b 则依旧可用,而不是没有实现的状态。

Over!

修复 ModemManager 中华为 CDMA 设备的信号获取

在 ModemManager 0.6 及之前版本中,华为 CDMA 设备的信号获取依赖于 MMGenericCdma 基类实现的 MMModemCdma 接口的 get_signal_quality 方法。在此方法的实现中通过 AT+CSQ 或 AT+CSQ? 查询设备的 CDMA 1X 信号强度。但是华为的设备返回的 +CSQ 数据格式与代码中的格式并不相符,导致返回的信号数据并不能使用,换言之什么也没做,NetworkManager 看到的就是无信号!

目前 CDMA 设备是有两类信号要获取的,分别是 CDMA 1X 和 EVDO,而当前的 org.freedesktop.ModemManager.Modem.Cdma D-Bus 接口中只有一个方法 GetSignalQuality 且只能返回一个信号值。

在插件中的 MMModemHuaweiCdma 子类里实现了对非主动上报的 CDMA 1X (^RSSILVL) 和 EVDO (^HRSSILVL) 信号进行了更新,也仅此一处涉及到了 EVDO 信号的获取。

基于上述的情况,产生了这样的一种修复方案:在 MMModemHuaweiCdma 中重新实现 MMModemCdma 接口类的 get_signal_quality 方法。在此方法中根据当前的 CDMA 1X 和 EVDO 网络注册情况获取信号,当 EVDO 注册状态为 Unknown 时通过 AT^CSQLVL 获取 CDMA 1X 信号并更新,而当 EVDO 注册状态为非 Unknown 时通过 AT^HDRCSQLVL 获取 EVDO 信号并更新。

https://github.com/heiher/ModemManager/commit/4711bfc79abafd04d678c4c95976e9e7d561d2c4

在基类 MMGenericCdma 中信号变更还会触发信号 org.freedesktop.ModemManager.Modem.Cdma.SignalQuality,与上述规则相同,当 EVDO 注册时只返回 EVDO,反之返回 CDMA 1X。

https://github.com/heiher/ModemManager/commit/2a13ed070c2762058b4150c7069967df1bd4e6de

Over!

Panasonic CF-18/19 (Toughbook) Tablet Button driver for Linux

终于搞定了 Panasonic CF-19 笔记本的 Tablet Button 驱动程序,特此记录一下。

Panasonic CF-19 笔记本的有四个 Tablet Button,功能分别被定义为调用软键盘、开关触摸屏?、旋转屏幕、锁定计算机。

在安装了 Linux 操作系统的 CF-19 笔记本上,所有的功能键默认工作正常了,但是上述的四个 Tablet Button 不能正常工作,其边上的亮度调整可工作。

通过查看 /proc/interrupts 发现,按下和弹起 Tablet Button 时, acpi 的中断数会增加,这说明内核的 ACPI 总线驱动是接收到了事件的,但没有处理例程。

通过一系列的查找、测试,终于找到了 Tablet Button 所属的 ACPI 设备的 HID,即 MAT001F 或 MAT0020。

有了设备的 HID 后,只要编写一个内核驱动模块把 ACPI 事件映射到一个 Input Device 上即可上报到用户层,用户层的服务处理事件并执行动作。

内核驱动模块代码 => https://github.com/heiher/panasonic-hbtn

Over!

Power off USB port

1. git clone git://github.com/heiher/hubpower.git
2. gcc -o hubpower hubpower.c

Usage: hubpower busnum:devnum power {portnum (on|off)} …
hubpower busnum:devnum status
hubpower busnum:devnum bind

ThinkWill MI800 无线模块不知道怎么回事,用着用着就出问题了,然后只能关机(重启都不行)才能恢复。后来认为断电就可以了,有了 hubpower 就可以软件解决了,无需重启。

Over!