首先說,本人水平有限,如有錯誤歡迎指正。
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 根據分組字段,將分析物件...