一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

platform驅(qū)動編寫 基于gpio-keys

 WUCANADA 2015-08-04

加入of_ (device tree操作api) 的platform驅(qū)動編寫 基于gpio-keys

Linux在啟動后,到C入口時,會執(zhí)行以下操作,加載系統(tǒng)平臺上的總線和設(shè)備:

start_kernel() --> setup_arch() --> unflatten_device_tree()  

在執(zhí)行完unflatten_device_tree()后,DTS節(jié)點信息被解析出來,保存到allnodes鏈表中,allnodes會在后面被用到。隨后,當(dāng)系統(tǒng)啟動到board文件時,會調(diào)用.init_machine,高通8974平臺對應(yīng)的是msm8974_init()。接著調(diào)用of_platform_populate(....)接口,加載平臺總線和平臺設(shè)備。


Device Tree 中的 I2C client 會透過 I2C host 驅(qū)動的 probe()函數(shù)中調(diào)用
of_i2c_register_devices(&i2c_dev->adapter);被自動展開

SPI host 驅(qū)動的 probe 函數(shù)透過
spi_register_master()注冊 master 的時候,會自動展開依附于它的 slave。


整體platform驅(qū)動架構(gòu)是這樣的。platform bus一旦把platform driver里的of_device_id 

static struct of_device_id gpio_keys_of_match[] = {

{ .compatible = "gpio-keys", },

{ },

};

與dts(platform device)

gpio-keys {
compatible = "gpio-keys";
power {
label = "Power Button";
gpios = <&gpio3 29 1>;
linux,code = <116>; /* KEY_POWER */
gpio-key,wakeup;
};

volume-up {
label = "Volume Up";
gpios = <&gpio1 4 1>;
linux,code = <115>; /* KEY_VOLUMEUP */
};

volume-down {
label = "Volume Down";
gpios = <&gpio1 5 1>;
linux,code = <114>; /* KEY_VOLUMEDOWN */
};
};

里的compatible匹配到。則會調(diào)用platform里的probe成員函數(shù)

static int gpio_keys_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);

。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。

}

struct platform_device *pdev指向匹配成功的platform device.通過他我們可以找到對應(yīng)于dts文件中的設(shè)備節(jié)點(定位到它就可以獲取設(shè)備參數(shù)列表了)【因為新版內(nèi)核struct device中包含了成員  struct device_node *of_node; /* associated device tree node */】

代碼如下

gpio_keys_get_devtree_pdata(struct device *dev)
{
struct device_node *node, *pp;
struct gpio_keys_platform_data *pdata;
struct gpio_keys_button *button;
int error;
int nbuttons;
int i;

node = dev->of_node;
if (!node) {
error = -ENODEV;
goto err_out;
}

nbuttons = of_get_child_count(node);
if (nbuttons == 0) {
error = -ENODEV;
goto err_out;
}

pdata = kzalloc(sizeof(*pdata) + nbuttons * (sizeof *button),
GFP_KERNEL);
if (!pdata) {
error = -ENOMEM;
goto err_out;
}

pdata->buttons = (struct gpio_keys_button *)(pdata + 1);
pdata->nbuttons = nbuttons;

pdata->rep = !!of_get_property(node, "autorepeat", NULL);

i = 0;
for_each_child_of_node(node, pp) {
int gpio;
enum of_gpio_flags flags;

if (!of_find_property(pp, "gpios", NULL)) {
pdata->nbuttons--;
dev_warn(dev, "Found button without gpios\n");
continue;
}

gpio = of_get_gpio_flags(pp, 0, &flags);
if (gpio < 0) {
error = gpio;
if (error != -EPROBE_DEFER)
dev_err(dev,
"Failed to get gpio flags, error: %d\n",
error);
goto err_free_pdata;
}

button = &pdata->buttons[i++];

button->gpio = gpio;
button->active_low = flags & OF_GPIO_ACTIVE_LOW;

if (of_property_read_u32(pp, "linux,code", &button->code)) {
dev_err(dev, "Button without keycode: 0x%x\n",
button->gpio);
error = -EINVAL;
goto err_free_pdata;
}

button->desc = of_get_property(pp, "label", NULL);

if (of_property_read_u32(pp, "linux,input-type", &button->type))
button->type = EV_KEY;

button->wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL);

if (of_property_read_u32(pp, "debounce-interval",
&button->debounce_interval))
button->debounce_interval = 5;
}

if (pdata->nbuttons == 0) {
error = -EINVAL;
goto err_free_pdata;
}




    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美亚洲综合另类色妞| 青草草在线视频免费视频| 91人妻人人精品人人爽| 精品视频一区二区三区不卡| 亚洲熟女诱惑一区二区| 粗暴蹂躏中文一区二区三区| 高清欧美大片免费在线观看| 中文字幕日韩一区二区不卡 | 年轻女房东2中文字幕| 色哟哟哟在线观看视频| 亚洲熟女诱惑一区二区| 亚洲中文字幕乱码亚洲| 精品国产一区二区欧美| 国产视频一区二区三区四区| 国产又色又爽又黄又免费| 夜夜嗨激情五月天精品| 夜夜躁狠狠躁日日躁视频黑人| 久久精品亚洲情色欧美| 最近的中文字幕一区二区| 日本淫片一区二区三区| 欧美性欧美一区二区三区| 亚洲中文字幕视频在线播放| 久久精品视频就在久久| 麻豆国产精品一区二区三区| 厕所偷拍一区二区三区视频| 欧美一区二区三区不卡高清视| 98精品永久免费视频| 99国产高清不卡视频| 99久久婷婷国产亚洲综合精品| 欧美一区二区三区性视频| 欧美老太太性生活大片| 日韩成人高清免费在线| 国产老熟女超碰一区二区三区| 亚洲欧美日韩网友自拍| 欧美日韩久久精品一区二区| 国产精品免费视频视频| 亚洲中文字幕在线综合视频| 国产成人高清精品尤物| 九九热在线视频精品免费| 色综合伊人天天综合网中文| 精品国产丝袜一区二区|