我參考的朱友鵬課程中的學習課件進行移植,可能我的kernel和文件系統與課程中存在部分微小差異,過程中遇上了一些問題,網上查閱了很多資料,目前都解決掉了,先在此記錄下免得忘了。
一、/dev目錄下沒有/input設備目錄
修改/etc/mdev.conf
# Move input devices to input directory
event.* 0:0 0660 @(mkdir -p input&&mv $MDEV input)
mice 0:0 0660 @(mkdir -p input&&mv $MDEV input)
mouse.* 0:0 0660 @(mkdir -p input&&mv $MDEV input)
成功後可以看到:
[@192 /bin]# ls /dev/input/
event0 event1 event2 mice mouse0 mouse1
二、移植gslX680驅動
1,將驅動源碼(gslX680.c gslX680.h gsl_point_id )拷貝到/kernel/derivers/input/touchscreen中
2,修改Makefile,添加
obj-$(CONFIG_TOUCHSCREEN_GSLX680) +=gslX680.0 gsl_point_id
3,修改Kconfig,添加
config TOUCHSCREEN_GSLX680
tristate "gslX680 touch driver"
depends on I2C
help
This enables support for gslX680 over I2C based touchscreens.
4,make menuconfig,重新編譯make
此時gslX680驅動已成功編譯進內核
[@192 /bin]# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="s3c-button"
P: Phys=s3c-button/input0
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=kbd event0 evbug
B: EV=3
B: KEY=101680 0 10000 40000000
I: Bus=0013 Vendor=dead Product=beef Version=0101
N: Name="S5P TouchScreen"
P: Phys=input(ts)
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=mouse0 event1 evbug
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="gslX680"
P: Phys=
S: Sysfs=/devices/platform/s3c2440-i2c.1/i2c-1/1-0040/input/input2
U: Uniq=
H: Handlers=mouse1 event2 evbug
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003
[@192 /bin]#
手指在觸摸屏滑動時,cat /dev/input/event2可打印出座標信息,不過是亂碼。此時即爲成功。
三、tslib移植和測試
1,源碼準備,解壓,配置
# cd tslib
# ./autogen.sh
# echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache
# mkdir /opt/tslib
# ./configure --prefix=/opt/tslib --host=arm-linux --cache-file=arm-linux.cache
2,編譯和安裝
# make
# make install
成功後會在安裝目錄生成四個文件夾:
include lib etc bin
生成的庫位於lib中,該目錄下還有一個子目錄ts,它包含了許多校準用到的庫(如input.so等)。
etc下的ts.conf爲配置文件,bin目錄下爲校準、測試工具(如校準的ts_calibrate,測試用的ts_test)。
然後把這個四個文件複製到根文件系統的根目錄下,注意:我是將這些文件夾裏的庫和可執行程序考出來到根文件系統中對應的目錄的。
3,部署,配置文件ts.conf內容如下:
module_raw input (去掉前面的# 和空格,其他的保持不變)
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
module_raw有許多種,這裏只使用input(即Linux的input子系統,設備文件名稱爲/dev/event1)/dev/event0爲觸模屏的設備節點
4,導出環境變量
定義tslib運行需要的環境變量,/etc/profile文件中添加如下:
export TSLIB_TSDEVICE=/dev/input/event2
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib
export TS_INFO_FILE=/sys/class/input/input2/uevent
5,運行與測試
這裏我出現了三個問題,兩個在朱老師視頻中已講到,
(A)No raw modules loaded.
ts_config: No such file or directory
解決:在etc/ts.conf中打開module raw input這行的註釋就行了。
(B)執行 ts_calibrate 出現瞭如下錯誤:
selected device is not a touchscreen I understand
原因是內核用的EV_VERSION爲0x0100001,交叉編譯工具EV_VERSION爲0x0100000 把這兩個修改成一樣就可以了。
這個問題我是參考了這裏的方法:
[經驗] 移植tslib庫出現selected device is not a touchscreen I understand的解決方法
修改文件路徑:
linux源碼路徑下:kernel/include/linux/input.h
編譯器安裝路徑下:/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/linux/input.h
將內核源代碼裏的include/linux/input.h中的 #define EV_VERSION0x010001 改爲: #define EV_VERSION0x010000 |
(C)修改屏幕分辨率
參考:應用層爲何不能設置分辨率
移植的核心是lcd參數的更改:主要是在mach-x210.c文件中
kernel/arch/arm/mach-s5pv210/mach-x210.c
#define S5PV210_LCD_WIDTH 800
#define S5PV210_LCD_HEIGHT 600
修改爲:
#define S5PV210_LCD_WIDTH 1024
#define S5PV210_LCD_HEIGHT 600
至此驅動移植才完成。