device tree在觸屏中的實際應用

/*

首先是在dtsi中定義一些和設備(觸屏)相關的重要變量。
定義這些個變量的目的就是在不同項目中,去讀取與該項目對應
的dtsi文件,對於觸屏,提高了代碼的兼容性,使內核代碼更清晰明瞭。
*/


/*首先看一下dtsi文件裏寫了什麼。*/


/* ty-focaltech-ft6206.dtsi */

&soc {
	i2c@78b9000 { /* BLSP1 QUP5 */
		focaltech@38 {
			
		};

	};

	gen-vkeys {
		compatible = "qcom,gen-vkeys";
		label = "ft5x06_ts";
		qcom,disp-maxx = <480>;
		qcom,disp-maxy = <854>;
		qcom,panel-maxx = <480>;
		qcom,panel-maxy = <946>;
		qcom,key-codes = <158 172 139>;
		qcom,y-offset = <0>;
		qcom,key-menu-coords = <120 900 30 30>;
		qcom,key-home-coords = <240 900 30 30>;
		qcom,key-back-coords = <360 900 30 30>;
		qcom,key-search-coords = <0 0 0 0>;
	};
};



處於方便的目的吧,通過of_find_property()函數,獲取dtsi文件中的內容。
dtsi文件中,等號左邊是爲了便於搜索,右邊是真正的數值。
瞭解了框架,下面在具體看一下of_find_property()函數執行的過程。

讀取dtsi中數據前,我們先建立一個數組:
struct vkeys_platform_data {
	const char *name;
	int disp_maxx;
	int disp_maxy;
	int panel_maxx;
	int panel_maxy;
	int *keycodes;
	int num_keys;
	int y_offset;
	int y_center;
	int *x_center;
	int v_width;
	int v_height;
};

1. 讀取字符串
例如:label = "ft5x06_ts";
char *name;
rc = of_property_read_string(np, "label", &pdata->name);
	if (rc) {
		dev_err(dev, "Failed to read label\n");
		return -EINVAL;
	}
snprintf(name, MAX_BUF_SIZE,
				"virtualkeys.%s", pdata->name);

name指針就指向virtualkeys.ft5x06_ts了!
這裏面主要利用of_property_read_string()這個API!
2. 讀取單個數值
例如:qcom,y-offset = <0>;
rc = of_property_read_u32(np, "qcom,y-offset", &val);
	if (!rc)
		pdata->y_offset = val;
	else if (rc != -EINVAL) {
		dev_err(dev, "Failed to read y position offset\n");
		return rc;
	}

//這個也很簡單
3. 讀取數組:
prop = of_find_property(np, "qcom,key-codes", NULL);
	if (prop) {
		pdata->num_keys = prop->length / sizeof(u32);
		pdata->keycodes = devm_kzalloc(dev,
			sizeof(u32) * pdata->num_keys, GFP_KERNEL);
		if (!pdata->keycodes)
			return -ENOMEM;
		rc = of_property_read_u32_array(np, "qcom,key-codes",
				pdata->keycodes, pdata->num_keys);
		if (rc) {
			dev_err(dev, "Failed to read key codes\n");
			return -EINVAL;
		}
	}
這一步主要集中在rc = of_property_read_u32_array(np, "qcom,key-codes",
				pdata->keycodes, pdata->num_keys);
結束後,數據存儲在指針pdata->keycodes中, pdata->num_keys爲數組中數據個數!
---------------------------------------------------------------------------
OK!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章