tslib簡單流程分析

2021-07-02 18:27:08 字數 4009 閱讀 3712

首先說,本人水平有限,如有錯誤歡迎指正。

tslib的校準過程,從tests/ts_calibrate.c檔案的main函式開始:

int main()

;在這個結構體中,只關心list_raw這個結構體指標,在來看一下這個結構體:

struct tslib_module_info ;

這個結構體中,只關心tslib_ops *ops這個結構體指標,繼續看這個結構體:

struct tslib_ops ;

可以看到,int (*read)();這個函式指標,就是從驅動裝置,讀取座標資料的。

那這個函式是在哪註冊的呢!看plugins\input-raw.c這個檔案中有乙個

static const struct tslib_ops __ts_input_ops = ;這個結構體,就是註冊__ts_read_raw這個函式的。這個函式之後再看。

那現在首先就搞清楚了,校準的時候是從那個地方讀取的資料。

signal(sigsegv, sig);

signal(sigint, sig);

signal(sigterm, sig);

if( (tsdevice = getenv("tslib_tsdevice")) != null ) 

return ts;

free:

free(ts);

return null;

}這是ts_open函式,比較簡單,申請記憶體,然後初始化申請到的記憶體為0,之後使用c庫函式open開啟裝置。最後返回tsdev結構體。flags由於傳進函式的引數是0,所以flags在開啟裝置時,是以唯讀方式。

} else

if (!ts)

if (ts_config(ts))

f = fopen(conffile, 「r」);

if (!f)

buf[buf_size - 2] = 『\0』;

while ((p = fgets(buf, buf_size, f)) != null)

/* did we read a whole line? */

if (buf[buf_size - 2] != 『\0』)

tok = strsep(&p, 」 \t」);

/* ignore comments or blank lines.

* note: strsep modifies p (see man strsep)

*/if (p==null || *tok == 『#』)

continue;

/* search for the option. */

if (strcasecmp(tok, 「module」) == 0)

else if (strcasecmp(tok, 「module_raw」) == 0) else

if (ret != 0)

}if (ts->list_raw == null)

fclose(f);

return ret;

}這個函式主要的作用是,讀取etc\ts.conf檔案,檢視選擇的是哪種方式,並且載入相應的模組。那麼我使用的是module input raw,所以載入input-raw模組,事實上在這裡,才確定是如何讀取位置座標資訊的。

perror(「ts_config」);

exit(1);

}if (open_framebuffer())

for (i = 0; i < nr_colors; i++)

setcolor (i, palette [i]);

put_string_center (xres / 2, yres / 4,

"tslib calibration utility", 1);

put_string_center (xres / 2, yres / 4 + 20,

"touch crosshair to calibrate", 2);

printf("xres = %d, yres = %d\n", xres, yres);

// read a touchscreen event to clear the buffer

//getxy(ts, 0, 0);

get_sample (ts, &cal, 0, 50,        50,        "top left");

這個函式的函式體如下:

static void get_sample (struct tsdev *ts, calibration *cal,

int index, int x, int y, char *name) }

put_cross(x, y, 2 | xormode);

getxy (ts, &cal->x [index], &cal->y [index]);

put_cross(x, y, 2 | xormode);

last_x = cal->xfb [index] = x;

last_y = cal->yfb [index] = y;

printf(「%s : x = %4d y = %4d\n」, name, cal->x [index], cal->y [index]);

}這個函式,用來在顯示裝置上面指定的位置,顯示校準用的十字圖示。然後通過getxy()函式,獲得當前觸屏返回的座標值。

下面看一下這個函式,

void getxy(struct tsdev *ts, int *x, int *y)

} while (samp[0].pressure == 0);

/* now collect up to max_samples touches into the samp array. */

index = 0;

do

} while (samp[index].pressure > 0);

printf(「took %d samples…\n」,index);

middle = index/2;

if (x)

if (y)

} 紅色標識的函式如下:

int ts_read_raw(struct tsdev *ts, struct ts_sample *samp, int nr)

終於可以看到,經過ts_config註冊到的讀取座標的函式了。整個過程結束之後,會把讀取到的座標資訊,寫到cal對應的成員裡面。calibrate結構體的定義如下:

typedef struct calibration;可以看到就是定義的座標資訊。xfb這個是顯示器的座標。

get_sample (ts, &cal, 1, xres - 50, 50, 「top right」);

get_sample (ts, &cal, 2, xres - 50, yres - 50, 「bot right」);

get_sample (ts, &cal, 3, 50, yres - 50, 「bot left」);

get_sample (ts, &cal, 4, xres / 2, yres / 2, 「center」);

if (perform_calibration (&cal))  else 

sprintf (cal_buffer,"%d %d %d %d %d %d %d",

cal.a[1], cal.a[2], cal.a[0],

cal.a[4], cal.a[5], cal.a[3], cal.a[6]);

write (cal_fd, cal_buffer, strlen (cal_buffer) + 1);

close (cal_fd);

i = 0;

} else

close_framebuffer();

return i;

}

到此整個流程就結束了。我只是羅列了一下tslib校準的流程。是我當前分析原始碼的記錄總結。

歡迎交流。

linux kernel 啟動流程簡單分析

ping linux 核心啟動的時候,總是從start kernel 這個函式作為入口。start kernel完成了對各種資源的初始化。隨後,呼叫了rest init 完成對init程序的啟動。我們用gdb跟蹤linux kernel 核心啟動可以看到。1.我們把斷點置於start kernel ...

簡單的日誌分析流程

使用flume採集資料到hdfs上 對資料進行清洗 可以使用mapreduce程式來清洗 在hive上建立相應的表載入清洗後的資料,然後使用hive對清洗後的資料進行多維分析 把hive分析得出的結果通過sqoop匯出到mysql中 提供檢視工具供使用者使用 可以自己寫web程式來訪問mysql 備...

資料分析簡單流程

基本統計分析又叫描述性統計分析,一般統計某個變數的最小值,第一四分位值,中值,第三四分位值,以及最大值。常用的統計指標 指標panda方法或屬性 計數size 最大值max 最小值min 求和sum 平均值mean 方差var 標準差std 顯示各個等分值 describe 根據分組字段,將分析物件...