Qbilinux 日記

Linux に関係することだけではなく,最近は一般的なコンピュータやガジェット関係についても記載してます.

キングジム XMC10 に Ubuntu 改め再び Debian stretch をインストール

キングジム XMC10 に linux を入れる話.

先日は Ubuntu を入れたけど,今後のことを考えてやっぱり Debian stretch に戻しました.

カーネルを作り直したりするときに XMC10 本体でやると厳しいので,手元の高スペックなデスクトップにいれてあるのと同じ Debian を入れておいた方が,デスクトップで作った deb を持っていけたりするので便利かなぁと.まぁ,Ubuntu でも Debian でつくった deb 持ち込めば良いだけだけど,気持ちの問題かな.

最初に Debian を入れた時には CUI 状態でインストールしましたが,Ubuntu で X が動作することまでは確認していたので,今回は普通にインストーラーから lxqt をインストール.Debian でのキーボードの調整とか X の起動手順は Ubuntu の時と同じで大丈夫でした.

キーボードの認識は /etc/rc.local を作成して,ファイルに実行パーミッションをつけて

#!/bin/bash
/sbin/lsmod | grep -o -e ^usbhid -e ^i2c_hid | xargs /sbin/rmmod
sleep 1
/sbin/modprobe usbhid
sleep 1
/sbin/modprobe i2c_hid
sleep 1
Exit 0

と書く感じね.

あ,付属キーボードを認識するようにしても,一部キーボードが効かないですね.「|」と「\_」あたり.debianubuntu も同じ.

xev でキーコードみて適当に割り当てようかと思いましたが,xev でもイベントが拾えないみたいですね.どうやら修正するにはカーネルを作り直さないと駄目っぽい.このあたりはすでに情報が出回っているみたいですね.ということで,検索してキーボード修正用のパッチを入手.ついでに BT/WiFi のための修正パッチも入手.

で,手元で使いやすいようにマージしてパッチ作成.

diff -rc /usr/src/linux-source-4.8/drivers/acpi/acpi_platform.c drivers/acpi/acpi_platform.c
*** /usr/src/linux-source-4.8/drivers/acpi/acpi_platform.c 2016-11-26 17:57:13.000000000 +0900
--- drivers/acpi/acpi_platform.c 2016-12-20 01:32:56.716959280 +0900
***************
*** 51,57 ****

/* If the ACPI node already has a physical device attached, skip it. */
if (adev->physical_node_count)
! return NULL;

if (!acpi_match_device_ids(adev, forbidden_id_list))
return ERR_PTR(-EINVAL);
--- 51,62 ----

/* If the ACPI node already has a physical device attached, skip it. */
if (adev->physical_node_count)
! {
! if(!strcmp(acpi_device_hid(adev),"80860F14") && !strcmp(adev->pnp.unique_id,"2"))
! dev_info(&adev->dev,"Physical node found. Proceeding anyway\n");
! else
! return NULL;
! }

if (!acpi_match_device_ids(adev, forbidden_id_list))
return ERR_PTR(-EINVAL);
diff -rc /usr/src/linux-source-4.8/drivers/hid/hid-core.c drivers/hid/hid-core.c
*** /usr/src/linux-source-4.8/drivers/hid/hid-core.c 2016-11-26 17:57:13.000000000 +0900
--- drivers/hid/hid-core.c 2016-12-20 02:06:48.601357603 +0900
***************
*** 1273,1279 ****
unsigned offset = field->report_offset;
unsigned size = field->report_size;
__s32 min = field->logical_minimum;
! __s32 max = field->logical_maximum;
__s32 *value;

value = kmalloc(sizeof(__s32) * count, GFP_ATOMIC);
--- 1273,1279 ----
unsigned offset = field->report_offset;
unsigned size = field->report_size;
__s32 min = field->logical_minimum;
! __s32 max = 222;
__s32 *value;

value = kmalloc(sizeof(__s32) * count, GFP_ATOMIC);
diff -rc /usr/src/linux-source-4.8/drivers/mmc/host/sdhci-acpi.c drivers/mmc/host/sdhci-acpi.c
*** /usr/src/linux-source-4.8/drivers/mmc/host/sdhci-acpi.c 2016-11-26 17:57:13.000000000 +0900
--- drivers/mmc/host/sdhci-acpi.c 2016-12-20 01:34:35.956190936 +0900
***************
*** 48,53 ****
--- 48,56 ----
#endif

#include "sdhci.h"
+ #include <linux/pci.h>
+
+ void patch(struct acpi_device *adev);

enum {
SDHCI_ACPI_SD_CD = BIT(0),
***************
*** 405,410 ****
--- 408,417 ----
hid = acpi_device_hid(device);
uid = device->pnp.unique_id;

+ /*Apply patch if you find the sibling device.*/
+ if (!strcmp(hid, "80860F14") && !strcmp(uid, "1"))
+ patch(device);
+
iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!iomem)
return -ENOMEM;
***************
*** 572,577 ****
--- 579,595 ----

module_platform_driver(sdhci_acpi_driver);

+ /*Custom patch for a specific SDIO Controller*/
+ void patch(struct acpi_device *adev)
+ {
+ struct pci_dev *pcidev = NULL;
+
+ pcidev = pci_get_device(0x8086,0x2280,NULL);
+ if(!pcidev)
+ return;
+ pci_stop_and_remove_bus_device(pcidev);
+ }
+
MODULE_DESCRIPTION("Secure Digital Host Controller Interface ACPI driver");
MODULE_AUTHOR("Adrian Hunter");
MODULE_LICENSE("GPL v2");

一応,ファイル形式でも http://plamo.linet.gr.jp/~matsuki/linux/debian/linux-4.8_xmc10.patch として置いておきます.

このパッチをカーネルソースに当てて,カーネルをつくり直し.debian だとこんな感じかな.

% apt-get install build-essential fakeroot kernel-package libncurses-dev linux-source libssl-dev
% tar xvf /usr/src/linux-source-4.8.tar.xz
% cd linux-4.8
% patch -p0 < linux-4.8_xmc10.patch
% cp /boot/config-4.8.0-1-amd64 .config
% make menuconfig

適当にパラメータ修正.CONFIG_SYSTEM_TRUSTED_KEYS あたりは必ず修正しないとダメだったかな?

% env CONCURRENCY_LEVEL=8 make-kpkg --rootcmd fakeroot --initrd --revision=20161220 kernel_image kernel_headers
% cd ..
% dpkg -i linux-image-4.8.11_20161220_amd64.deb
% dpkg -i linux-headers-4.8.11_20161220_amd64.deb

あとは https://github.com/hadess/rtl8723bshttps://github.com/lwfinger/rtl8723bs_bt を git clone して make & make install.前者が WiFi 用ドライバ,後者が Bluetooth 用ドライバです.

% git clone https://github.com/hadess/rtl8723bs
% cd rtl8723bs
% make
% make install

% git clone https://github.com/lwfinger/rtl8723bs_bt
% cd rtl8723bs_bt
% make
% make install

とりあえず,このカーネルに入れ替えて,ドライバーもいれた状態で態で再起動すれば日本語キーボード,WiFi が使えることを確認しました.Bluetooth は未確認です.X も問題なく動作.これでとりあえずは一通り使える状態でしょうか.

と思ったら,ハイバネとかできないみたいですね.やっぱりまだちょっと不便かな.

それにしても,みなさんの情報に感謝です.みなさん,作業が早いですよね._o_

本当は自分でいろいろと調べながらやりたかったんだけどね.:-)