ブログネタ
Android に参加中!
Gingerbread と同じ方法ではうまくいかなかったので、
少し調べてみた。
HM-TL10T のタッチパネル対応は既に行っている人がいる。
http://d.hatena.ne.jp/h_kojima/20110329
Gingerbread はこれでタッチパネルを使えていた。

Ice Cream Sandwich で同じことをした場合は使えず、
以下のような状態になった。
device-2011-12-10-042830device-2011-12-10-042849
タッチしたと認識された部分が白い丸で表示されていると思う。
実際にタッチした場所と白い丸の場所はかなりズレていたので、自信は無い。

これについて調べたところ、Ice Cream Sandwich では
Input Device Configuration Files というファイルが必要。
http://source.android.com/tech/input/input-device-configuration-files.html

これは Emulator や Galaxy Nexus の環境にも入っていて、
起動時に読み込まれていた。

frameworks/base/services/input/EventHub.cpp
L.1091 〜 L.1106
void EventHub::loadConfigurationLocked(Device* device) {
device->configurationFile = getInputDeviceConfigurationFilePathByDeviceIdentifier(
device->identifier, INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION);
if (device->configurationFile.isEmpty()) {
LOGD("No input device configuration file found for device '%s'.",
device->identifier.name.string());
} else {
status_t status = PropertyMap::load(device->configurationFile,
&device->configuration);
if (status) {
LOGE("Error loading input device configuration file for device '%s'. "
"Using default configuration.",
device->identifier.name.string());
}
}
}

frameworks/base/libs/ui/Input.cpp
L.71 〜 L.99
String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
const InputDeviceIdentifier& deviceIdentifier,
InputDeviceConfigurationFileType type) {
if (deviceIdentifier.vendor !=0 && deviceIdentifier.product != 0) {
if (deviceIdentifier.version != 0) {
// Try vendor product version.
※1 String8 versionPath(getInputDeviceConfigurationFilePathByName(
String8::format("Vendor_%04x_Product_%04x_Version_%04x",
deviceIdentifier.vendor, deviceIdentifier.product,
deviceIdentifier.version),
type));
if (!versionPath.isEmpty()) {
return versionPath;
}
}

// Try vendor product.
※2 String8 productPath(getInputDeviceConfigurationFilePathByName(
String8::format("Vendor_%04x_Product_%04x",
deviceIdentifier.vendor, deviceIdentifier.product),
type));
if (!productPath.isEmpty()) {
return productPath;
}
}

// Try device name.
※3 return getInputDeviceConfigurationFilePathByName(deviceIdentifier.name, type);
}
※1で探すファイル
/system/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
※2で探すファイル
/system/usr/idc/Vendor_XXXX_Product_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX.idc
※3で探すファイル
/system/usr/idc/DEVICE_NAME.idc
/data/system/devices/idc/DEVICE_NAME.idc

Emulator や Galaxy Nexus で使用してるのは、
※3で探すファイル名のもの。
※1や※2 は Vendor、Product 名を使うので、分かり難い。
※3だとデバイス名を使うので、分り易いと思う。

デバイス名の idc ファイルを用意する場合、
分り易いが、用意するファイル名に注意が必要。

ファイル名は、デバイス名を以下の処理で変換して得ている。
frameworks/base/libs/ui/Input.cpp
L.54 〜 L.69
static bool isValidNameChar(char ch) {
return isascii(ch) && (isdigit(ch) || isalpha(ch) || ch == '-' || ch == '_');
}

static void appendInputDeviceConfigurationFileRelativePath(String8& path,
const String8& name, InputDeviceConfigurationFileType type) {
path.append(CONFIGURATION_FILE_DIR[type]);
for (size_t i = 0; i < name.length(); i++) {
char ch = name[i];
if (!isValidNameChar(ch)) {
ch = '_';
}
path.append(&ch, 1);
}
path.append(CONFIGURATION_FILE_EXTENSION[type]);
}

今回使用したデバイスは、
eGalax Inc. USB TouchController
という名前。
これを変換すると、
eGalax_Inc__USB_TouchController
となる。
なので用意するファイル名は、
eGalax_Inc__USB_TouchController.idc
となる。

idc ファイルの中身は、
Emulator のものを参考に以下の2行のみを書いた。
touch.deviceType = touchScreen
touch.orientationAware = 1

大事なのは、touch.deviceType の指定。
deviceType の設定を行っているのはここ。
frameworks/base/services/input/InputReader.cpp
L.2528 〜 L.2556
    if (getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_DIRECT)) {
// The device is a touch screen.
mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
} else if (getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_POINTER)) {
// The device is a pointing device like a track pad.
mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
} else if (getEventHub()->hasRelativeAxis(getDeviceId(), REL_X)
|| getEventHub()->hasRelativeAxis(getDeviceId(), REL_Y)) {
// The device is a cursor device with a touch pad attached.
// By default don't use the touch pad to move the pointer.
mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
} else {
// The device is a touch pad of unknown purpose.
mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
}

String8 deviceTypeString;
if (getDevice()->getConfiguration().tryGetProperty(String8("touch.deviceType"),
deviceTypeString)) {
if (deviceTypeString == "touchScreen") {
mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
} else if (deviceTypeString == "touchPad") {
mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
} else if (deviceTypeString == "pointer") {
mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
} else if (deviceTypeString != "default") {
LOGW("Invalid value for touch.deviceType: '%s'", deviceTypeString.string());
}
}

touch.deviceType を指定すると、
後半の if 文で deviceType が設定(上書き)される。
idc ファイルを用意してない時は、
前半の if 文の else に入って DEVICE_TYPE_POINTER が設定されていた。

作成した eGalax_Inc__USB_TouchController.idc を
/system/usr/idc/eGalax_Inc__USB_TouchController.idc
に格納して Android を起動すると、
ICS な PandaBoard でタッチパネルが使えるようになった。

補足
デバイス名の調べ方(例)
root@android:/ # cat /sys/class/input/input2/name
eGalax Inc. USB TouchController

Android 側にログを出す場合の例。
frameworks/base/services/input/EventHub.cpp
L.912 〜 L.924
#if 0
LOGI("add device %d: %s\n", deviceId, devicePath);
LOGI(" bus: %04x\n"
" vendor %04x\n"
" product %04x\n"
" version %04x\n",
identifier.bus, identifier.vendor, identifier.product, identifier.version);
LOGI(" name: \"%s\"\n", identifier.name.string());
LOGI(" location: \"%s\"\n", identifier.location.string());
LOGI(" unique id: \"%s\"\n", identifier.uniqueId.string());
LOGI(" driver: v%d.%d.%d\n",
driverVersion >> 16, (driverVersion >> 8) & 0xff, driverVersion & 0xff);
#endif
ここの #if 0 を #if 1 にする。

idc ファイルを読み込んでるかは、
frameworks/base/libs/ui/Input.cpp
でデバッグログを有効にすると分り易い。
L.11 の #define DEBUG_PROBE 0 を、
#define DEBUG_PROBE 1 にする。

ログの例
01-02 00:00:08.843 D/Input ( 153): Probing for system provided input device configuration file: path='/system/usr/idc/Vendor_0eef_Product'
01-02 00:00:08.843 D/Input ( 153): Probing for system user input device configuration file: path='/data/system/devices/idc/Vendor_0eef_Pr'
01-02 00:00:08.843 D/Input ( 153): Probe failed to find input device configuration file: name='Vendor_0eef_Product_0001_Version_0100', ty0
01-02 00:00:08.843 D/Input ( 153): Probing for system provided input device configuration file: path='/system/usr/idc/Vendor_0eef_Product'
01-02 00:00:08.843 D/Input ( 153): Probing for system user input device configuration file: path='/data/system/devices/idc/Vendor_0eef_Pr'
01-02 00:00:08.843 D/Input ( 153): Probe failed to find input device configuration file: name='Vendor_0eef_Product_0001', type=0
01-02 00:00:08.843 D/Input ( 153): Probing for system provided input device configuration file: path='/system/usr/idc/eGalax_Inc__USB_Tou'
01-02 00:00:08.843 D/Input ( 153): Found