當前位置:首頁 » 操作系統 » linux觸摸屏

linux觸摸屏

發布時間: 2022-07-15 14:01:52

⑴ 嵌入式linux觸摸屏失效

我的理解,系統啟動的時候,會載入各項外設,
邏輯是,如果你沒有鍵盤,初始化就不成功,觸摸屏的驅動沒有啟動
有鍵盤,初始化成功,觸摸屏驅動載入成功,拔下鍵盤也可以使用

⑵ EPC-9600跑Linux如何校準觸摸屏

如果是換用其他尺寸的觸摸屏,或者其他原因導致的觸摸點擊位置不正確,需要重新校準觸摸屏。校準觸摸屏:刪除/etc/pointercal文件,然後重啟即可進入校準程序。命令如下:
#wr rm /etc/pointercal
#reboot

⑶ linux系統中如何校準觸摸屏

觸摸屏?有設置的吧應該

⑷ 如何在ARM Linux下使用多點觸摸屏

我在3.2內核下做的,配合Xorg 1.2.4,Xinput2,Qt5.2.1。

首先,驅動程序probe的時候要聲明成多點觸摸的:
input_set_abs_params(input, ABS_X, 0, pdata->x_res - 1, 0, 0);
input_set_abs_params(input, ABS_Y, 0, pdata->y_res - 1, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_X,
0, pdata->x_res - 1, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_Y,
0, pdata->y_res - 1, 0, 0);
error = input_mt_init_slots(input, MAX_SUPPORT_POINTS);

pdata是board-[mach].c裡面定義的platform data,如果是3.8以上的內核,你可以用device tree。

其次,提交觸摸數據的時候,要提交成多點的:

for (i = 0; i < MAX_SUPPORT_POINTS; i++)
{
type = posdata.touch[i].xh >> 6;
if (type == TOUCH_EVENT_RESERVED)
continue;

x = ((posdata.touch[i].xh << 8) | (posdata.touch[i].xl)) & 0x0fff;
y = ((posdata.touch[i].yh << 8) | (posdata.touch[i].yl)) & 0x0fff;
id = (posdata.touch[i].yh >> 4) & 0x0f;
down = (type != TOUCH_EVENT_UP);

input_mt_slot(tsdata->input, id);
input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down);

if (!down)
continue;

input_report_abs(tsdata->input, ABS_MT_POSITION_X, x);
input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y);
}

input_mt_report_pointer_emulation(tsdata->input, true);
input_sync(tsdata->input);
然後,Buildroot做根文件系統的時候要選上Target packages > Libraries > Hardware handling > mtdev和Target packages > Graphic libraries and applications (graphic/text) > X.org X Window System > X11R7 Drivers > xf86-input-evdev,網上有很多文章說如何讓X支持多點觸摸的,那都是過去式了,現在的X和xf86-input-evdev都支持多點觸摸。
最後,編譯Qt開發包的時候要加上-xinput2選項,在qtbase/examples/touch里能找到觸摸屏的樣例代碼。

⑸ linux 系統下如何實現觸摸屏的滑動,放大等特效

這個就看你的觸摸屏是否支持linux系統的多點觸控了。如果不能就要換一塊觸控面板且支持linux多點操作的。不然沒法。當然,找那個觸摸屏廠家看看能否有技術給你改觸摸屏的核心技術。

⑹ Linux觸摸屏驅動中什麼時候會調用suspend這個函數

android系統摁下電源鍵後會讓系統進入休眠以達到節電的目的。內核驅動中和休眠相關的就是suspend和resume函數。

suspend函數用於休眠,resume函數用於喚醒。下面分析驅動中的這兩個函數是如何被調用到的。

驅動部分:

首先需要分析驅動的注冊過程,較新的內核都是採用DTS方式來取代在內核中直接定義platform_device數據結構的注冊方式,本文是基於DTS機制的內核來分析。

proct對應的dts文件在編譯時被編譯為dtb文件,uboot在啟動時候會將其地址傳給內核,內核在啟動過程中會去解析,具體解析是在start_kernel()->setup_arch() --> unflatten_device_tree()中具體分析可以參考網上,解析的最終結果會存放在allnodes地址處,這個allnodes隨後在machine的init函數
中被使用,init函數中會根據allnodes中的節點數據組合成platform_device數據結構,然後將其注冊到platform匯流排上,下面簡要分析一下並重點關注這些初始化過程中和
pm相關的初始化。

我參與的項目中machine的init函數就是via_init_machine函數,在這個函數中就是調用了of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL)這個函數來解析allnodes的。of_platform_populate是系統提供的介面。下面分析這個介面的實現:

[html] view plain
int of_platform_populate(struct device_node *root,
const struct of_device_id *matches,
const struct of_dev_auxdata *lookup,
struct device *parent)
{
struct device_node *child;
int rc = 0;

root = root ? of_node_get(root) : of_find_node_by_path("/");
if (!root)
return -EINVAL;

for_each_child_of_node(root, child) {
rc = of_platform_bus_create(child, matches, lookup, parent, true);
if (rc)
break;
}

of_node_put(root);
return rc;
}
root最後就是取到的根節點,然後其作為參數傳遞給of_platform_bus_create,of_platform_device_create_pdata的實現如下:

[html] view plain
static int of_platform_bus_create(struct device_node *bus,
const struct of_device_id *matches,
const struct of_dev_auxdata *lookup,
struct device *parent, bool strict)
{
const struct of_dev_auxdata *auxdata;
struct device_node *child;
struct platform_device *dev;
const char *bus_id = NULL;
void *platform_data = NULL;
int rc = 0;

/* Make sure it has a compatible property */
if (strict && (!of_get_property(bus, "compatible", NULL))) {
pr_debug("%s() - skipping %s, no compatible prop\n",
__func__, bus->full_name);
return 0;
}

auxdata = of_dev_lookup(lookup, bus);
if (auxdata) {
bus_id = auxdata->name;
platform_data = auxdata->platform_data;
}

if (of_device_is_compatible(bus, "arm,primecell")) {
of_amba_device_create(bus, bus_id, platform_data, parent);
return 0;
}

dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);
if (!dev || !of_match_node(matches, bus))
return 0;

for_each_child_of_node(bus, child) {
pr_debug(" create child: %s\n", child->full_name);
rc = of_platform_bus_create(child, matches, lookup, &dev->dev, strict);
if (rc) {
of_node_put(child);
break;
}
}
return rc;
}
根據傳入參數,我們這里直接分析of_platform_device_create_padate函數,如下:

[html] view plain
struct platform_device *of_platform_device_create_pdata(
struct device_node *np,
const char *bus_id,
void *platform_data,
struct device *parent)
{
struct platform_device *dev;

if (!of_device_is_available(np))
return NULL;

dev = of_device_alloc(np, bus_id, parent);
if (!dev)
return NULL;

#if defined(CONFIG_MICROBLAZE)
dev->archdata.dma_mask = 0xffffffffUL;
#endif
dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
dev->dev.bus = &platform_bus_type;
dev->dev.platform_data = platform_data;

/* We do not fill the DMA ops for platform devices by default.
* This is currently the responsibility of the platform code
* to do such, possibly using a device notifier
*/

if (of_device_add(dev) != 0) {
platform_device_put(dev);
return NULL;
}

return dev;
}

of_platform_device_create_padate->of_device_alloc->platform_device_alloc

便在platform_device_alloc函數中進行進行alloc和初始化了,實現如下:

[html] view plain
struct platform_device *platform_device_alloc(const char *name, int id)
{
struct platform_object *pa;

pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
if (pa) {
strcpy(pa->name, name);
pa->pdev.name = pa->name;
pa->pdev.id = id;
device_initialize(&pa->pdev.dev);
pa->pdev.dev.release = platform_device_release;
arch_setup_pdev_archdata(&pa->pdev);
}

return pa ? &pa->pdev : NULL;
}
可以看到有個device_initialize,這裡面對pdev.dev做一些列的初始化,其中有一個函數就是device_pm_init,這個函數就是我們一直關心的device相關的pm函數,具體實現如下:

[html] view plain
void device_pm_init(struct device *dev)
{
dev->power.is_prepared = false;
dev->power.is_suspended = false;
init_completion(&dev->power.completion);
complete_all(&dev->power.completion);
dev->power.wakeup = NULL;
spin_lock_init(&dev->power.lock);
pm_runtime_init(dev);
INIT_LIST_HEAD(&dev->power.entry);
dev->power.power_state = PMSG_INVALID;
}

可以看見它對device和功耗相關的數據做了一些初始化,我們這里先重點關注下dev->power.entry,初始化一個鏈表頭,所以他/它很有可能會在後面加到某個鏈表裡面去,而那個鏈表應該是用來保存所有的device用的。系統中所有的platform_device都是通過這種方式注冊到系統中的,那麼應該所有的platform_device都會初始化一個dev->power.entry,如果到時候把所有的dev->power.entry都添加到某個鏈表上去,那麼系統到時候查詢的時候只要找到這個list head就可以找到所有的platform_device了。嗯,不過這是我們的猜測。我們接下去分析來驗證下。

platform_device通過alloc之後已經初始化好了,那麼接下去就可以添加到系統中了,所以我們再回頭看of_platform_device_create_pdata的實現。
函數在of_device_alloc之後把dev->dev.bus賦值給了platform_bus_type,接著就調用了of_device_add函數,在of_device_add函數中最後通過device_add添加到了bus上,但是device_add中有個函數需要我們關系,就是device_pm_add(dev),實現如下:

[html] view plain
void device_pm_add(struct device *dev)
{
pr_debug("PM: Adding info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
mutex_lock(&dpm_list_mtx);
if (dev->parent && dev->parent->power.is_prepared)
dev_warn(dev, "parent %s should not be sleeping\n",
dev_name(dev->parent));
list_add_tail(&dev->power.entry, &dpm_list);
dev_pm_qos_constraints_init(dev);
mutex_unlock(&dpm_list_mtx);
}

可以看到這里list_add_tail(&dev->power.entry, &dpm_list);這就驗證了我們之前的猜測。所有注冊到系統中的設備,最終都是會添加到dpm_list這條鏈表上。

那麼系統在休眠的時候是如何通過dmp_list這表鏈表來suspend設備的呢?接下去就是我們要分析的電源管理部分內容。

系統電源部分:
電源管理相關文件在kernel/power目錄下,前面已經分析到。系統中注冊的設備都是會添加到dmp_list這條鏈表上的。那麼睡眠的時候系統應該是會查找dmp_list這條鏈表,
然後通過這條鏈表依次去查到對應的driver,然後調用driver中的suspend方法。下面我們來驗證。

2.在suspend會輪詢bus下的driver,然後一次調用到driver->pm->suspend方法,然後進入休眠。

3.state_store->pm_suspend->enter_state->suspend_devices_and_enter->dpm_suspend_start->dpm_suspend->device_suspend->__device_suspend->pm_op->(ops->suspend)

⑺ linux開發板怎麼樣實現觸摸屏校驗

第一進入LINUX系統時,會出現觸摸屏校驗提示,按提示校準5個點就可以了.
如果想重新校驗,可以如下操作
#rm /etc/pointercal (刪除校準文件)
#reboot (重新啟動開發板)
此時可以重新校驗

⑻ 如何實現linux下的多點觸摸屏驅動

要看你是什麼觸摸屏
不一樣的觸摸屏的驅動也是不一樣的
只要你安裝了對應的觸摸屏的編程軟體
編程軟體裡面就自帶了本機觸摸屏的驅動

熱點內容
sql資料庫的埠 發布:2025-01-22 12:20:02 瀏覽:362
安卓最終幻想8怎麼設置中文 發布:2025-01-22 12:19:23 瀏覽:651
怎麼查電腦配置和網路 發布:2025-01-22 12:19:16 瀏覽:586
linuxsnmp查看 發布:2025-01-22 12:17:49 瀏覽:37
安卓數據線怎麼接藍牙 發布:2025-01-22 12:07:29 瀏覽:229
扣扣賬號多少次密碼不正確會被封 發布:2025-01-22 12:07:19 瀏覽:400
python是32位還是64位 發布:2025-01-22 11:51:41 瀏覽:894
鈴聲多多緩存文件夾 發布:2025-01-22 11:51:39 瀏覽:724
java按鍵精靈 發布:2025-01-22 11:49:31 瀏覽:81
python配色 發布:2025-01-22 11:46:40 瀏覽:613