<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; Remix OS</title>
	<atom:link href="https://zohead.com/archives/tag/remix-os/feed" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>修改Remix OS kernel支持Chromebook触控板</title>
		<link>https://zohead.com/archives/remixos-cb-trackpad/</link>
		<comments>https://zohead.com/archives/remixos-cb-trackpad/#comments</comments>
		<pubDate>Tue, 01 Mar 2016 18:16:13 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[chromeos_laptop]]></category>
		<category><![CDATA[cyapa]]></category>
		<category><![CDATA[cyapatp]]></category>
		<category><![CDATA[I2C]]></category>
		<category><![CDATA[Remix OS]]></category>
		<category><![CDATA[触控板]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1183</guid>
		<description><![CDATA[继续接着上一篇文章「修改Remix OS适配Chromebook键盘」的修改之后在我的 Dell Chromebook 11 上使用 ext4 U 盘形式的 Remix OS PC 版已经是比较顺利了，那么剩下最大的问题就是触控板问题了，要知道之前我使用 Remix OS 的时候都是必须插着一个 USB 鼠标的。 Chromebook 的触控板由于比较特殊之前很多网友安装的 Ubuntu 系统里经常也用不了，这里我以 Dell Chromebook 11 为例子对 Remix OS PC 版内核模块做一些修改可以实现 Remix OS 下基本的触控功能，对于在 Chromebook 上单独安装 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>继续接着上一篇文章「<a href="https://zohead.com/archives/remixos-cb-keyboard/">修改Remix OS适配Chromebook键盘</a>」的修改之后在我的 Dell Chromebook 11 上使用 ext4 U 盘形式的 Remix OS PC 版已经是比较顺利了，那么剩下最大的问题就是触控板问题了，要知道之前我使用 Remix OS 的时候都是必须插着一个 USB 鼠标的。</p>
<p>Chromebook 的触控板由于比较特殊之前很多网友安装的 Ubuntu 系统里经常也用不了，这里我以 Dell Chromebook 11 为例子对 Remix OS PC 版内核模块做一些修改可以实现 Remix OS 下基本的触控功能，对于在 Chromebook 上单独安装的 Linux 系统下想使用触控板的用户也能做一个参考。</p>
<p>下面的篇幅有很大一部分是对 Remix OS 不能使用 Chromebook 触控板的原因分析，不想了解技术细节的话可以直接拖到最后「<em>修改 Remix OS 系统文件</em>」部分下载并使用我修改编译出来的适合 Remix OS 的内核模块哦。</p>
<blockquote>
<p>编写这篇文章时我使用的是 Remix OS PC 版 2016-02-01 alpha 版本，对应 Android x86 5.1.1 版本，Linux kernel 版本 4.0.9； <br />
  我使用的 Chrome OS 版本是 48.0.2564.116 正式版，Linux kernel 版本 3.8.11。</p>
</blockquote>
<h2 id="触控板问题分析">触控板问题分析</h2>
<p>首先确认能正常工作的 Chrome OS 下的 Chromebook 触控板相关信息，看看 Linux 输入设备中的触控板设备：</p>
<pre class="brush: bash; title: ; notranslate">
I: Bus=0018 Vendor=0000 Product=0000 Version=0001
N: Name=&quot;Cypress APA Trackpad (cyapa)&quot;
P: Phys=i2c-9-0067/input0
S: Sysfs=/devices/pci0000:00/0000:00:15.1/i2c-9/9-0067/input/input7
U: Uniq=
H: Handlers=event7 
B: PROP=5
B: EV=b
B: KEY=e520 10000 0 0 0 0
B: ABS=660800001000003
</pre>
<p>可以看到 Dell Chromebook 11 上的触控板其实用的是 Cypress 家的 APA I2C 输入设备，Chrome OS 上对应 i2c-9 适配器，I2C 地址是 67，对应的 I2C 输入设备驱动为 <code>cyapa</code>。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>其它也有不少三星、HP 之类的 Chromebook 设备用的是 I2C 触控板，但不一定是同一厂商的，有的是使用 ELAN 等 I2C 触控板； <br />
  另外具体机器上 I2C 地址是固定的，i2c-9 适配器则是 Linux kernel 自动生成的并不固定。</p>
</blockquote>
<p>接下来看看 I2C 适配器实际对应的设备位置和名称：</p>
<pre class="brush: bash; title: ; notranslate">
chronos@localhost ~ $ cd /sys/class/i2c-adapter/
chronos@localhost /sys/class/i2c-adapter $ ls -dl *
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-0 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-0
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-1 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-1
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-10 -&gt; ../../devices/pci0000:00/0000:00:15.2/i2c-10
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-2 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-2
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-3 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-3
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-4 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-4
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-5 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-5
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-6 -&gt; ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/i2c-6
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-7 -&gt; ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-DP-1/i2c-7
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-8 -&gt; ../../devices/pci0000:00/0000:00:1f.3/i2c-8
lrwxrwxrwx 1 root root 0 Mar  1 22:38 i2c-9 -&gt; ../../devices/pci0000:00/0000:00:15.1/i2c-9
chronos@localhost /sys/class/i2c-adapter $ cat i2c-*/name
i915 gmbus ssc
i2c-designware-pci-1
i915 gmbus vga
i915 gmbus panel
i915 gmbus dpc
i915 gmbus dpb
i915 gmbus dpd
DPDDC-A
DPDDC-B
SMBus I801 adapter at 0400
i2c-designware-pci-0
</pre>
<p>可以看到触控板的 I2C 适配器 i2c-9 在 PCI 设备 0000:00:15.1 上，名称为：<code>i2c-designware-pci-0</code>，另外系统里还有 i2c-10 适配器在 0000:00:15.2 上，名称为：<code>i2c-designware-pci-1</code>，这两个适配器对应的 I2C 总线驱动是：<code>i2c-designware-pci</code>。</p>
<p>下面就可以在 Chromebook 上启动 Remix OS 确认其内核下 I2C 设备信息是否正确：</p>
<pre class="brush: bash; title: ; notranslate">
chronos@localhost ~ $ cd /sys/class/i2c-adapter/
root@remix_cn_x86_64:/sys/class/i2c-adapter # ls -dl *
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-0 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-0
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-1 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-1
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-10 -&gt; ../../devices/pci0000:00/0000:00:1f.3/i2c-10
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-2 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-2
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-3 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-3
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-4 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-4
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-5 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-5
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-6 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-6
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-7 -&gt; ../../devices/pci0000:00/0000:00:02.0/i2c-7
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-8 -&gt; ../../devices/pci0000:00/0000:00:15.1/i2c-8
lrwxrwxrwx root     root              2016-03-01 00:24 i2c-9 -&gt; ../../devices/pci0000:00/0000:00:15.2/i2c-9
root@remix_cn_x86_64:/sys/class/i2c-adapter # cat i2c-*/name
i915 gmbus ssc
i915 gmbus vga
SMBus I801 adapter at 0400
i915 gmbus panel
i915 gmbus dpc
i915 gmbus dpb
i915 gmbus dpd
DPDDC-A
DPDDC-B
i2c-designware-pci
i2c-designware-pci
</pre>
<p>这样可以发现 Remix OS 内核下两个 I2C 适配器为 i2c-8 和 i2c-9，虽然 i2c-8 是触控板设备但是使用起来应该是没有影响的，I2C 总线驱动也是正确的，但适配器名称都是一样的 <code>i2c-designware-pci</code>。</p>
<p>同时进一步确认之后发现 Remix OS 内核下虽然没有 Chrome OS 里直接使用的 <code>cyapa</code> 驱动，但其默认集成了新的 Linux kernel 里自带的 <code>cyapatp</code> 驱动。<code>cyapa</code> 是 Google 为 Chromebook 内核专门修改的 Cypress Gen3 系列触控板驱动，而查看源代码之后发现 <code>cyapatp</code> 驱动不但支持 Cypress Gen3 系列触控板，也支持新的 Gen5 系列触控板，这样按说 <code>cyapatp</code> 直接就是支持我的 Chromebook 触控板设备的。</p>
<p>比较郁闷的是我直接在 Remix OS 终端里运行 <code>modprobe cyapatp</code> 命令虽然能成功加载驱动，但系统中并没有注册任何新的输入设备。</p>
<h2 id="chromebook-kernel-研究">Chromebook kernel 研究</h2>
<p>没办法就只能先检出 Chrome OS 当前使用的 3.8.11 版本内核源代码研究下了，检出方法可以参考我之前写的「<a href="https://zohead.com/archives/koding-chromebook/">在Koding云平台上编译Chromebook kernel</a>」这篇文章，Chrome OS kernel 分支可以在这里看到：</p>
<p><a href="https://chromium.googlesource.com/chromiumos/third_party/kernel/">https://chromium.googlesource.com/chromiumos/third_party/kernel/</a></p>
<p>稍微研究后发现原来 Chrome OS kernel 里增加了一个 <code>chromeos_laptop</code> 平台相关的驱动，Chrome OS 系统启动时会加载这个驱动（实际上是直接编译到 Chrome OS kernel 中的），<code>chromeos_laptop</code> 中会自动尝试查找并实例化 Chromebook 上的 I2C/SMBus 设备，看看其中的部分代码：</p>
<pre class="brush: cpp; title: chromeos_laptop.c; notranslate">
#define CYAPA_TP_I2C_ADDR	0x67

const char *i2c_adapter_names[] = {
	&quot;SMBus I801 adapter&quot;,
	&quot;i915 gmbus vga&quot;,
	&quot;i915 gmbus panel&quot;,
	&quot;i2c-designware-pci-0&quot;,
	&quot;i2c-designware-pci-1&quot;,
};

/* Keep this enum consistent with i2c_adapter_names */
enum i2c_adapter_type {
	I2C_ADAPTER_SMBUS = 0,
	I2C_ADAPTER_VGADDC,
	I2C_ADAPTER_PANEL,
	I2C_ADAPTER_I2C0,
	I2C_ADAPTER_I2C1,
};

static struct i2c_board_info cyapa_device = {
	I2C_BOARD_INFO(&quot;cyapa&quot;, CYAPA_TP_I2C_ADDR),
	.flags		= I2C_CLIENT_WAKE,
};

static struct chromeos_laptop wolf = {
	.i2c_peripherals = {
		/* Touchpad. */
		{ .add = setup_cyapa_tp, I2C_ADAPTER_I2C0 },
		/* Elan Touchpad option. */
		{ .add = setup_elantech_tp, I2C_ADAPTER_I2C0 },
	},
};

static struct i2c_client *add_i2c_device(const char *name,
						enum i2c_adapter_type type,
						struct i2c_board_info *info)
{
	const unsigned short addr_list[] = { info-&gt;addr, I2C_CLIENT_END };
	return __add_probed_i2c_device(name,
				       find_i2c_adapter_num(type),
				       info,
				       addr_list);
}

static int setup_cyapa_tp(enum i2c_adapter_type type)
{
	if (tp)
		return 0;

	/* add cyapa touchpad */
	tp = add_i2c_device(&quot;trackpad&quot;, type, &amp;cyapa_device);
	return (!tp) ? -EAGAIN : 0;
}
</pre>
<p>稍微分析下可以看到 <code>chromeos_laptop</code> 驱动是根据名称找到当前系统中的 I2C 适配器的，找到之后最后根据 I2C 地址调用 <code>i2c_new_probed_device</code> 函数实例化 I2C 设备，而这里 <code>cyapa</code> 触控板驱动使用的 I2C 适配器名称固定为 <code>i2c-designware-pci-0</code>。</p>
<p>这样就有 Remix OS 下使用触控板的解决思路了，我们可以修改 <code>i2c-designware-pci</code> 驱动使其报上来的两个 I2C 适配器使用不同的名称，并加入 <code>chromeos_laptop</code> 驱动这样就可以正常使用新的 <code>cyapatp</code> 驱动；或者也可以不修改 <code>i2c-designware-pci</code> 而直接加入并修改 <code>chromeos_laptop</code> 中的触控板 I2C 适配器名称，为了后续 I2C 的区分我决定用第一种方法。</p>
<h2 id="remix-os-kernel-修改">Remix OS kernel 修改</h2>
<p>首先我们就要检出技德不久前开放的 Remix OS kernel 代码了，地址在这里：</p>
<p><a href="https://github.com/jide-opensource/remixos-kernel/">https://github.com/jide-opensource/remixos-kernel/</a></p>
<p>值得一提的是 Remix OS 内核基本就是使用的默认 android-x86_64_defconfig 配置，先开始修改 <code>i2c-designware-pcidrv.c</code> 代码以支持使用不同的 I2C 适配器名称：</p>
<pre class="brush: diff; title: ; notranslate">
--- a/i2c-designware-pcidrv.c	2016-03-02 01:04:19.330843871 +0800
+++ b/i2c-designware-pcidrv.c	2016-03-01 00:18:04.502977140 +0800
@@ -48,7 +48,8 @@ enum dw_pci_ctl_id_t {
 	medfield_5,
 
 	baytrail,
-	haswell,
+	haswell_0,
+	haswell_1,
 };
 
 struct dw_scl_sda_cfg {
@@ -148,7 +149,15 @@ static struct dw_pci_controller dw_pci_c
 		.functionality = I2C_FUNC_10BIT_ADDR,
 		.scl_sda_cfg = &amp;byt_config,
 	},
-	[haswell] = {
+	[haswell_0] = {
+		.bus_num = -1,
+		.bus_cfg = INTEL_MID_STD_CFG | DW_IC_CON_SPEED_FAST,
+		.tx_fifo_depth = 32,
+		.rx_fifo_depth = 32,
+		.functionality = I2C_FUNC_10BIT_ADDR,
+		.scl_sda_cfg = &amp;hsw_config,
+	},
+	[haswell_1] = {
 		.bus_num = -1,
 		.bus_cfg = INTEL_MID_STD_CFG | DW_IC_CON_SPEED_FAST,
 		.tx_fifo_depth = 32,
@@ -258,7 +267,8 @@ static int i2c_dw_pci_probe(struct pci_d
 	adap-&gt;dev.parent = &amp;pdev-&gt;dev;
 	adap-&gt;nr = controller-&gt;bus_num;
 
-	snprintf(adap-&gt;name, sizeof(adap-&gt;name), &quot;i2c-designware-pci&quot;);
+	snprintf(adap-&gt;name, sizeof(adap-&gt;name), &quot;i2c-designware-pci-%ld&quot;,
+		(adap-&gt;nr &lt; 0) ? id-&gt;driver_data - haswell_0 : adap-&gt;nr);
 
 	r = devm_request_irq(&amp;pdev-&gt;dev, pdev-&gt;irq, i2c_dw_isr, IRQF_SHARED,
 			adap-&gt;name, dev);
@@ -314,8 +324,8 @@ static const struct pci_device_id i2_des
 	{ PCI_VDEVICE(INTEL, 0x0F46), baytrail },
 	{ PCI_VDEVICE(INTEL, 0x0F47), baytrail },
 	/* Haswell */
-	{ PCI_VDEVICE(INTEL, 0x9c61), haswell },
-	{ PCI_VDEVICE(INTEL, 0x9c62), haswell },
+	{ PCI_VDEVICE(INTEL, 0x9c61), haswell_0 },
+	{ PCI_VDEVICE(INTEL, 0x9c62), haswell_1 },
 	/* Braswell / Cherrytrail */
 	{ PCI_VDEVICE(INTEL, 0x22C1), baytrail },
 	{ PCI_VDEVICE(INTEL, 0x22C2), baytrail },
</pre>
<p>然后将 Chrome OS 3.8.11 版本 kernel 中的 <code>chromeos_laptop</code> 平台相关驱动加到 Remix OS 4.0.9 版本 kernel 中，最后开始编译内核 bzImage 和对应的内核模块文件，实际上编译 bzImage 只是为了生成需要的 Module.symvers 符号文件，真正要使用的是新编译生成的 <code>i2c-designware-pci.ko</code> 和 <code>chromeos_laptop.ko</code> 文件。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>我是在 Chromebook Crouton 64 位 Ubuntu 14.04 环境中检出并修改 Remix OS kernel 进行编译的，实际 kernel 修改、加入新驱动修改 Makefile 和 Kconfig 等还有编译操作步骤什么的这里就不说明了，编译中间可能会有无线驱动报错，稍微修改下内核配置就可以通过了。</p>
</blockquote>
<h2 id="修改-remix-os-系统文件">修改 Remix OS 系统文件</h2>
<p>我编译好的两个内核模块文件下载地址（只适用于 Remix OS PC 版 alpha 4.0.9 内核）：</p>
<p><a href="https://zohead.com/downloads/cbtp-remixos-20160201alpha.zip">https://zohead.com/downloads/cbtp-remixos-20160201alpha.zip</a></p>
<p>首先可以在 Chromebook 上将新的内核模块文件放到 Remix OS U 盘中，如果你使用的是按照我之前的「<a href="https://zohead.com/archives/cb-ext4-remixos/">Chromebook使用ext4 U盘运行Remix OS</a>」文章介绍的方法生成的 ext4 格式 U 盘，那么修改替换 Remix OS 系统文件还是非常简单的。</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ sudo cp i2c-designware-pci.ko /media/removable/Android-x86/android-2016-02-02/system/lib/modules/4.0.9-android-x86_64+/kernel/drivers/i2c/busses/
(trusty)zzm@localhost:~$ sudo cp chromeos_laptop.ko /media/removable/Android-x86/android-2016-02-02/system/lib/modules/4.0.9-android-x86_64+/kernel/drivers/platform/x86/
</pre>
<blockquote>
<p><strong>注意</strong></p>
<p>上面的命令例子中假定 Remix OS U 盘已经自动被 Chrome OS 挂载到 <code>/media/removable/Android-x86</code> 目录了，<code>android-2016-02-02</code> 是 Remix OS 系统路径，实际的挂载和系统路径不完全相同请自行检查。</p>
</blockquote>
<p>下面是使用 <code>depmod</code> 命令重新生成新的模块依赖关系等文件，这样 Remix OS 系统在启动的时候就会自动尝试加载 <code>chromeos_laptop</code> 驱动，接着自动加载 <code>cyapatp</code> 驱动成功之后就可以直接 Chromebook 触控板了。</p>
<pre class="brush: bash; title: ; notranslate">
sudo depmod -A -b /media/removable/Android-x86/android-2016-02-02/system 4.0.9-android-x86_64+
</pre>
<p>最后说下我简单测试之后 Remix OS 中 Chromebook 触控板的使用效果：</p>
<ul>
<li>基本的移动、点击等操作可以正常工作；</li>
<li>看起来也是支持简单的多点触控的；</li>
<li>Remix OS 桌面图标的双击功能不起作用；</li>
<li>Chrome OS 下特色的两指上下滚动功能也可以正常使用（不过由于 Android 的自然滚动方式所以方向和 Chrome OS 下是相反的）；</li>
<li>某些 App 下面支持三指同时长按然后放开之后出现右键菜单；</li>
<li>Chrome OS 下特色的两指同时点击呼出右键菜单功能无效。</li>
</ul>
<p>总之虽然触控版的使用不像 Chrome OS 下那样完美但基本还是能满足需求的，本文中有任何错误或疑问欢迎提出指正哦，祝玩的开心～～～。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/remixos-cb-trackpad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>修改Remix OS适配Chromebook键盘</title>
		<link>https://zohead.com/archives/remixos-cb-keyboard/</link>
		<comments>https://zohead.com/archives/remixos-cb-keyboard/#comments</comments>
		<pubDate>Tue, 23 Feb 2016 18:01:03 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[keylayout]]></category>
		<category><![CDATA[Remix OS]]></category>
		<category><![CDATA[扫描码]]></category>
		<category><![CDATA[键盘]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1178</guid>
		<description><![CDATA[按照之前博客里方法在我的 Dell Chromebook 11 上捣鼓使用 ext4 格式 Remix OS U 盘一段时间之后发现对于 Chromebook 上的 Remix OS PC 版一个普遍存在的问题就是 Chromebook 特殊键盘按键功能在 Remix OS 上都不能正常工作了，这对于习惯了 Chrome OS 便利性的我来说还是略不爽的，因此想办法修改了 Remix OS 系统文件以适配 Chromebook 键盘，这里给 Chromebook 用户一个参考。 Chromebook 上的特殊按键包括最上面一排的功能按键和专用搜索键； 功能按键和普通 PC 机上的 F1 - F [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>按照之前博客里方法在我的 Dell Chromebook 11 上捣鼓使用 ext4 格式 Remix OS U 盘一段时间之后发现对于 Chromebook 上的 Remix OS PC 版一个普遍存在的问题就是 Chromebook 特殊键盘按键功能在 Remix OS 上都不能正常工作了，这对于习惯了 Chrome OS 便利性的我来说还是略不爽的，因此想办法修改了 Remix OS 系统文件以适配 Chromebook 键盘，这里给 Chromebook 用户一个参考。</p>
<blockquote>
<p>Chromebook 上的特殊按键包括最上面一排的功能按键和专用搜索键； <br />
  功能按键和普通 PC 机上的 F1 - F12 功能按键有点类似，包括专门为 Chrome OS 设计的前进、后退、全屏、显示亮度控制、音量控制 等按键； <br />
  有关 Chromebook 键盘的相关信息请参考 Google 官方帮助文档 <a href="https://support.google.com/chromebook/answer/1047364">Use your Chromebook keyboard</a> 。</p>
</blockquote>
<p>首先可以用 Crouton Linux 环境中的命令行 <code>showkey</code> 命令或者图形界面下的 <code>xev</code> 命令检查 Chromebook 上特殊按键的 scan code，确认之后发现：</p>
<blockquote>
<p>直接运行 Remix OS 的话也可以安装 <a href="https://play.google.com/store/apps/details?id=aws.apps.keyeventdisplay">KeyEvent Display</a> 这款 App 来确认 Chromebook 上按键的 scan code。</p>
</blockquote>
<ul>
<li>Chromebook 搜索键的 scan code 为：<strong>125</strong>；</li>
<li>Chromebook 上面一排从后退键到提高音量键这些特殊功能键的 scan code 为：<strong>59 - 68</strong>；</li>
<li>特殊功能键的 scan code 和普通 PC 上的 F1 - F10 一致。</li>
</ul>
<blockquote>
<p><strong>注意</strong></p>
<p>不同 Chromebook 上特殊按键的 scan code 也有可能和上面的结果不同，我列出的结果适用于 Dell Chromebook 11 系列。</p>
</blockquote>
<p>知道这些特殊按键的 scan code 之后就可以修改 Android keylayout 以适配 Chromebook 键盘，不过这一步需要修改 Remix OS PC 版 system 目录中的文件。如果你是按照我写的 <a href="https://zohead.com/archives/cb-ext4-remixos/">Chromebook使用ext4 U盘运行Remix OS</a> 文章中的方法安装的，那只要安装过程中启用了 system 目录的可写功能，那可以直接在 Remix OS（Remix OS 中直接修改需要开启 root 权限） 或者 Chrome OS 里修改还是很方便的。</p>
<blockquote>
<p>如果你是用技德官方的工具烧写的 U 盘那会稍微麻烦点，需要在 Chromebook 等 Linux 系统中挂载 system 映像文件修改并重新打包，网上应该也能找到对应的教程，这里就不做详细介绍了。</p>
</blockquote>
<p>修改 Remix OS 中的 <code>/system/usr/keylayout/Generic.kl</code> 文件，首先注释掉这些已有的行（Android 默认的键盘 scan code 到 key code 映射）：</p>
<pre class="prettyprint"><code class="language-bash hljs "><span class="hljs-comment">#key 59    F1</span>
<span class="hljs-comment">#key 60    F2</span>
<span class="hljs-comment">#key 61    F3</span>
<span class="hljs-comment">#key 62    F4</span>
<span class="hljs-comment">#key 63    F5</span>
<span class="hljs-comment">#key 64    F6</span>
<span class="hljs-comment">#key 65    F7</span>
<span class="hljs-comment">#key 66    F8</span>
<span class="hljs-comment">#key 67    F9</span>
<span class="hljs-comment">#key 68    F10</span>
<span class="hljs-comment">#key 125   META_LEFT</span></code></pre>
<p>然后增加这些行：</p>
<pre class="prettyprint"><code class="language-bash hljs ">key <span class="hljs-number">59</span>    MEDIA_PREVIOUS
key <span class="hljs-number">60</span>    MEDIA_NEXT
key <span class="hljs-number">61</span>    MEDIA_PLAY_PAUSE
key <span class="hljs-number">62</span>    MENU
key <span class="hljs-number">63</span>    APP_SWITCH
key <span class="hljs-number">64</span>    BRIGHTNESS_DOWN
key <span class="hljs-number">65</span>    BRIGHTNESS_UP
key <span class="hljs-number">66</span>    VOLUME_MUTE
key <span class="hljs-number">67</span>    VOLUME_DOWN
key <span class="hljs-number">68</span>    VOLUME_UP
key <span class="hljs-number">125</span>   CAPS_LOCK</code></pre>
<p>这里分别简单解释下：</p>
<ul>
<li>59 - 后退键，改成了「上一个节目」键，改成 <code>BACK</code> 后退键等特殊键似乎会导致 Remix OS 下键盘输入有点问题，索性改成切换节目键可以配合各种音乐 App 方便切换歌曲；</li>
<li>60 - 前进键，改成了「下一个节目」键；</li>
<li>61 - 刷新键，改成了「播放/暂停」键，本来想改成 <code>MEDIA_REWIND</code> 也就是「倒回」键符合原来刷新键的意思，但测试后发现好多 App 不支持就算了；</li>
<li>62 - 全屏键，改成了「菜单」键，Remix OS 下没有直接的全屏按键，这里就用做现在比较少用了的「菜单」键了，目前看起来只有手动退出手机 QQ 时有用 ^_^；</li>
<li>63 - 切换窗口键，改成了「应用切换」键，类似 Android 原生的效果，和 Remix OS 自带的按 <kbd>Alt+Tab</kbd> 键切换应用效果稍微有点不一样；</li>
<li>64 - 降低亮度键；</li>
<li>65 - 提高亮度键；</li>
<li>66 - 静音键；</li>
<li>67 - 降低音量键；</li>
<li>68 - 提高音量键；</li>
<li>125 - 搜索键，改成了「大小写切换」键，因为发现现在 Android 下对原生搜索键支持的 App 太少（测试了只有 Chrome 支持），就改成了更常用的 <kbd>Caps lock</kbd> 键了，如果你想换成 Android 原生搜索键的话可以将值改为 <code>SEARCH</code>。</li>
</ul>
<p>修改之后重新启动 Remix OS 系统就可以看到这些特殊按键的效果了，这样起码能让 Chromebook 用的更顺利咯。如果文章中有任何问题欢迎提出指正哦，祝元宵节后玩的开心～～～</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/remixos-cb-keyboard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chromebook使用ext4 U盘运行Remix OS</title>
		<link>https://zohead.com/archives/cb-ext4-remixos/</link>
		<comments>https://zohead.com/archives/cb-ext4-remixos/#comments</comments>
		<pubDate>Sun, 14 Feb 2016 18:55:23 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[EXTLINUX]]></category>
		<category><![CDATA[Grub]]></category>
		<category><![CDATA[Remix OS]]></category>
		<category><![CDATA[U盘]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[桌面]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1167</guid>
		<description><![CDATA[之前在 Dell Chromebook 11 上体验 Remix OS PC 版的时候是直接使用的普通 USB 3.0 U 盘安装官方放出的 Windows 可执行安装版，在 Chromebook 使用 legacy 模式启动（刷了 RW_LEGACY 模式的修改版 BIOS）运行倒是还比较顺利，只是 Remix OS PC 版 U 盘默认 FAT32 分区格式限制了 Android 的用户空间（data 分区）也最多只有 4GB，这样用起来还是挺不爽的。 搜索之后发现 Remix 论坛里已经有直接的硬盘安装方法可以解决 4GB 用户空间限制的问题，但是我的 Chromebook 就只有 16 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>之前在 Dell Chromebook 11 上体验 Remix OS PC 版的时候是直接使用的普通 USB 3.0 U 盘安装官方放出的 Windows 可执行安装版，在 Chromebook 使用 legacy 模式启动（刷了 RW_LEGACY 模式的修改版 BIOS）运行倒是还比较顺利，只是 Remix OS PC 版 U 盘默认 FAT32 分区格式限制了 Android 的用户空间（data 分区）也最多只有 4GB，这样用起来还是挺不爽的。</p>
<p>搜索之后发现 Remix 论坛里已经有直接的硬盘安装方法可以解决 4GB 用户空间限制的问题，但是我的 Chromebook 就只有 16GB 的空间，同时又安装了 crouton 系统，本来就捉襟见肘的空间再给 Remix OS 分一个区就不太现实了，最主要 Chromebook 原生的 Chrome OS 我是必须要保留的，而且 U 盘格式的 Android x86 也比较符合我的需求，因此想到用 Remix OS PC 版里自带的 Android x86 安装器将 Remix OS 安装到 ext4 格式的 U 盘里。</p>
<blockquote>
<p><strong>提示</strong> <br />
  本文中介绍的安装及启动、升级方法不只是适用于 Chromebook 电脑，也同样适用于普通 Windows PC 机； <br />
  另外这篇文章并不是面向初学者的安装教程之类的，需要你对 Linux 有一定的了解。</p>
</blockquote>
<p>下面介绍一下安装方法以及后续升级的步骤：</p>
<h2 id="准备步骤">准备步骤</h2>
<ul>
<li>一个 8GB 以上的 U 盘，最好是 USB 3.0 的；</li>
<li>下载好的 Remix OS PC 版最新<a href="http://www.jide.com/remixos-for-pc">安装映像</a>；</li>
<li>VMware / VirtualBox / QEMU 等支持 USB 模拟的虚拟机软件。</li>
</ul>
<h2 id="vmware-安装-remix-os-步骤">VMware 安装 Remix OS 步骤</h2>
<p>这里以 VMware Workstation 虚拟机软件为例子介绍如何在 Windows 上将 Remix OS PC 版映像以 ext4 文件系统格式安装到普通 U 盘上，其它的虚拟机软件或者操作系统下步骤也是类似的（直接使用 Chromebook 安装 VirtualBox 也是可以完成的哦）。</p>
<ol>
<li>解压缩下载到的 Remix OS PC 版安装映像（一般为 zip 文件），会得到一个比较大的 iso 文件；</li>
<li>创建新虚拟机，记得启用 USB 控制器支持（默认就会启用），然后添加虚拟光驱并使用解压缩出来的 iso 文件，另外不用添加任何虚拟硬盘；</li>
<li>启动虚拟机，正常的话会看到 Android x86 安装画面，这里选择默认的 <code>Resident mode</code> 并按 Tab 键会出现输入参数的界面，在原有的参数后面增加 <code>INSTALL=1</code>，如下图所示：
</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442937/remixos-install.png" alt="Android x86 启动画面" title="Android x86 启动画面"> </p>
</li>
<li>按回车键启动安装程序，稍等就会出现选择安装分区界面：
</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442936/remixos-detectdev.png" alt="选择安装分区" title="选择安装分区"> </p>
</li>
<li>对于 VMware 虚拟机这时候需要将焦点切换到虚拟机中并插上 U 盘，一切正常的话稍等片刻就可以在虚拟机状态栏上看到新插上的 USB 设备：
</p>
<blockquote>
<p><strong>说明</strong> <br />
  对于 VirtualBox 这样可以直接在虚拟机设置中添加 USB 设备的虚拟机软件会在虚拟机启动时自动尝试加载 USB 设备就不需要专门做这步了； <br />
  QEMU 也可以直接通过命令行或者配置文件加载 USB 设备； <br />
  VMware 也是可以通过 vmx 配置文件自动加载 USB 设备的，只是配置稍微复杂点这里不做介绍了。</p>
</blockquote>
<p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442962/vmware-usb-dev.jpg" alt="VMware USB 设备" title="VMware USB 设备"> </p>
</li>
<li>找到 U 盘设备之后选择上面的 <code>Detect devices</code> 菜单项查找设备，顺利的话会看到要安装到的设备：
</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442937/remixos-usb-dev.png" alt="安装 U 盘" title="安装 U 盘"> </p>
</li>
<li>上图可以看到 U 盘上还没有任何分区，下面可以选择 <code>Create/Modify partitions</code> 菜单在 U 盘上创建并格式化分区，分区文件系统格式最好为 ext4 格式，另外最好也直接将整个 U 盘的空间都用上：
</p>
<blockquote>
<p><strong>提示</strong> <br />
  如果 U 盘上已经存在分区但不是 ext4 格式的也可以在这里删除并重新创建分区。</p>
</blockquote>
<p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442934/remixos-create-partition.png" alt="创建分区" title="创建分区"> </p>
</li>
<li>分区创建并格式化完成之后退出返回就可以在之前的选择分区界面中看到新创建的分区：
</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442937/remixos-usb-partition.png" alt="使用新分区" title="使用新分区"> </p>
</li>
<li>选择新创建的分区开始安装，顺利的话稍等几分钟应该就可以安装完成，中间会提示是否需要将 system 分区设为可写的，为了调试以及后续 root 方便建议选择 Yes 将 system 分区设备可写模式。 </li>
<li>这样安装之后的 U 盘就可以一般的电脑上启动成功了，而且用户空间（data 分区）和系统空间（system 分区）都是 ext4 格式的，不存在 4GB 的大小限制，同时后续如果换更大的 U 盘也比较好扩容。</li>
</ol>
<p>安装好之后我们可以看看 Remix OS PC 版 U 盘的分区及文件系统结构：</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# parted /dev/sdb p
Model: SanDisk Cruzer Glide 3.0 (scsi)
Disk /dev/sdb: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  标志
 1      1049kB  16.0GB  16.0GB  ext4

[root@localhost ~]# mount -t ext4 /dev/sdb1 /mnt/disk
[root@localhost ~]# ls /mnt/disk/
android-2016-01-23  grub  lost+found
[root@localhost ~]# ls /mnt/disk/android-2016-01-23/
data  initrd.img  kernel  ramdisk.img  system
[root@localhost ~]# ls /mnt/disk/android-2016-01-23/system/
addon  app  bin  build.prop  etc  fonts  framework  lib  lib64  lost+found  media  priv-app  priv-setting  tts  usr  vendor  xbin
[root@localhost ~]# ls /mnt/disk/android-2016-01-23/data/
adb  app-asec  app-private  dalvik-cache  dontpanic  local       media     misc      resource-cache  serialno  user
app  app-lib   bugreports   data          drm        lost+found  mediadrm  property  security        system
[root@localhost ~]# df -h /mnt/disk
文件系统              容量  已用  可用 已用%% 挂载点
/dev/sdb1              15G  1.7G   13G  12% /mnt/disk
</pre>
<p>可以看到 U 盘根目录下就是 android-2016-01-23 这样的目录，里面放的就是 Android kernel、initrd 文件以及实际的 data 及 system 目录，安装完成之后 U 盘实际占用了近 2GB 的空间。</p>
<h2 id="chromebook-u-盘启动问题">Chromebook U 盘启动问题</h2>
<p>下面将安装好的 U 盘在 Dell Chromebook 11 上用 legacy 模式启动时会出现无法正常启动的问题。经过初步研究认为是 Android x86 默认使用的 Trusted Grub 安全引导方式对于刷了 RW_LATENCY 模式 BIOS 的 Chromebook 可能存在不兼容的问题。</p>
<blockquote>
<p>刷了 RW_LATENCY 模式 BIOS 的 Chromebook 进入 legacy 模式的方法是在启动时按 <kbd>Ctrl+L</kbd> 键，并选择启动设备。</p>
</blockquote>
<p>为解决这个问题，我在安装好的 U 盘上尝试安装了 Grub、Grub2 等不同的引导程序发现都不能在 Dell Chromebook 11 上正常启动，最后发现如果改为使用 <a href="http://www.syslinux.org/wiki/index.php/EXTLINUX">EXTLINUX</a> 这个 Syslinux 变种不但能支持 ext4 格式分区引导而且支持在 Chromebook 上以 legacy 方式正常启动 Remix OS U 盘。</p>
<p>EXTLINUX 安装也比较简单，这里直接使用 Chromebook 中的 crouton 系统直接安装到 U 盘，下面的操作都需要使用 root 权限才能完成。</p>
<ul>
<li>首先挂载 U 盘分区，并在分区下创建 extlinux 目录，然后运行命令安装 EXTLINUX 相关文件到对应目录：
</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# mkdir -p /mnt/disk/extlinux
[root@localhost ~]# extlinux --install /mnt/disk/extlinux
</pre>
</li>
<li>生成 EXTLINUX 配置文件保存到 <code>extlinux/extlinux.conf</code> 中：
</p>
<pre class="brush: bash; title: ; notranslate">
TIMEOUT 5
DEFAULT Remix_OS_2016-01-23

LABEL Remix_OS_2016-01-23
	KERNEL /android-2016-01-23/kernel
	APPEND quiet root=/dev/ram0 androidboot.hardware=remix_cn_x86_64 androidboot.selinux=permissive DATA= SRC=/android-2016-01-23 initrd=/android-2016-01-23/initrd.img

LABEL Remix_OS_2016-01-23_Debug
	KERNEL /android-2016-01-23/kernel
	APPEND root=/dev/ram0 androidboot.hardware=remix_cn_x86_64 androidboot.selinux=permissive DATA= DEBUG=2 SRC=/android-2016-01-23 initrd=/android-2016-01-23/initrd.img
</pre>
<p>其中实际标题及目录名称请根据需要自行替换； </p>
</li>
<li>安装 EXTLINUX 引导程序到 U 盘：
</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# umount /mnt/disk
[root@localhost ~]# cat /usr/lib/extlinux/mbr.bin &gt; /dev/sdb
</pre>
<blockquote>
<p><strong>注意</strong> <br />
  进行此步骤还请特别注意不要搞错了 U 盘设备名，否则可能误安装到你的系统盘之类的哦。</p>
</blockquote>
</li>
</ul>
<p>一般这样修改之后的 U 盘就可以正常在 Chromebook 上以 legacy 模式启动了，这种方式最大的优点就是不影响 Chromebook 原生的 Chrome OS 系统。</p>
<h2 id="remix-os-系统升级">Remix OS 系统升级</h2>
<p>由于 Remix OS PC 版并没有提供直接的在线 OTA 升级方式，但按本文提供的方式安装的 U 盘明显又不能使用官方的 Windows 安装工具进行升级，这里就需要专门介绍一下如何升级新系统了。</p>
<p>其实步骤也算是比较简单的，只需要下载新的映像文件解压缩 iso 里的文件，并使用新的 kernel、ramdisk、initrd 替换到对应目录，然后替换整个 system 目录即可（保留 data 目录就可以保留所有用户数据）。</p>
<p>首先挂载 U 盘分区到指定目录，例如 <code>/mnt/disk</code>，上面已经有具体的命令这里不再说明了。</p>
<p>然后挂载 iso 中的 system 文件，这一步由于 Android x86 system 目录使用的是 squashfs 映像所以略微复杂点：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo mount -t iso9660 -o ro,loop Remix_OS_for_PC_64_B2016020201_CN_Alpha_Legacy.iso /mnt/test
(trusty)zzm@localhost:~/Downloads$ ls /mnt/test/
efi/         initrd.img   install.img  isolinux/    kernel       ramdisk.img  system.sfs   TRANS.TBL
(trusty)zzm@localhost:~/Downloads$ sudo mount -t squashfs -o ro,loop /mnt/test/system.sfs /mnt/image
(trusty)zzm@localhost:~/Downloads$ ls /mnt/image/
system.img
(trusty)zzm@localhost:~/Downloads$ sudo mount -t ext4 -o ro,loop /mnt/image/system.img /mnt/share
(trusty)zzm@localhost:~/Downloads$ ls /mnt/share/
addon  app  bin  build.prop  etc  fonts  framework  lib  lib64  lost+found  media  priv-app  priv-setting  tts  usr  vendor  xbin
</pre>
<p>接着就是将新的 system 目录到 U 盘中（下面的命令开始多了一条删除 U 盘中原来所有 system 文件的操作）：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo rm -rf /mnt/disk/android-2016-01-23/system/*
(trusty)zzm@localhost:~/Downloads$ cp -ra /mnt/share/* /mnt/disk/android-2016-01-23/system/
</pre>
<p>下面是替换 Android kernel、initrd、ramdisk 等文件：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo cp /mnt/test/initrd.img /mnt/test/kernel /mnt/test/ramdisk.img /mnt/disk/android-2016-01-23/
</pre>
<p>最后可以将原来的 Android 目录（例如上面的 android-2016-01-23）也重命名为最新的目录（例如：android-2016-02-02），不过重命名之后千万别忘了把 extlinux.conf 配置文件里的标题和目录名称也改掉哦。</p>
<p>依次卸载上面的一些挂载之后用新的 U 盘启动 Chromebook 就可以看到升级后的效果啦。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/cb-ext4-remixos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
