Linux pincterlの駆動使用例
3545 ワード
使用例である以上,APIの使用のみに関心を持ち,APIにおける具体的な実装は余計なことではない.
例:dtsファイルにGPIO 5をリセットピンとして構成し、駆動中にこのリセットピンを呼び出し、dtsファイルから駆動ファイルに分けて説明する.
devm_pinctrl_get();//定義時にdevres_が呼び出されますalloc()動的申請メモリ領域
pinctrl_lookup_state();
pinctrl_select_state();
転載は出典を明記してください!
例:dtsファイルにGPIO 5をリセットピンとして構成し、駆動中にこのリセットピンを呼び出し、dtsファイルから駆動ファイルに分けて説明する.
一、dtsファイル
/ {
model = "CPU";
compatible = "Vendor,CPU";
interrupt-parent = ;
#address-cells = <2>;
#size-cells = <2>;
chosen {
bootargs = "console=tty0 console=ttyMT0,921600n1 root=/dev/ram initrd=0x84000000,0x400000 loglevel=8";
};
/*cpu{};pmu{}; */
bus {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0 0 0xffffffff>;
/*i2c、spi */
pio: pinctrl@0x10005000 {
compatible = "mediatek,mt6580-pinctrl";
reg = <0x10005000 0x1000>;
mediatek,pctl-regmap = ;
pins-are-numbered;
gpio-controller;
#gpio-cells = <2>;
};
};
gpio_rst: gpio_rst {
compatible = "mediatek,gpio_rst";/* &gpio_rst , */
};
};
&pio {
gpio_rst_enable: caotuo@0 {
pins_cmd_dat {
pins = ;
slew-rate = <1>; /* 0:in, 1:out*/
output-high; /* , */
};
};
gpio_rst_disable: caotuo@1 {
pins_cmd_dat {
pins = ;
slew-rate = <1>;
output-low;
};
};
};
&gpio_rst {
pinctrl-names = "gpio_rst_on", "gpio_rst_off";
pinctrl-1 = ;
pinctrl-2 = ;
}
二、駆動ファイル
/*
struct pinctrl_state {
struct list_head node;//
const char *name;// state
struct list_head settings;// settings
};*/
static int xxx_probe(struct platform_device *dev)
{
/* 、 */
/* gpio ctrl */
struct pinctrl_state *xxx_pin_ctrl,*xxx_rst_on,*xxx_rst_off;
xxx_pin_ctrl = devm_pinctrl_get(&pdev->dev); /*Resource managed pinctrl_get()*/
if (IS_ERR(xxx_pin_ctrl)) {
printk("failed
");
ret = PTR_ERR(xxx_pin_ctrl);
return ret;
}
xxx_rst_on = pinctrl_lookup_state(xxx_pin_ctrl, "gpio_rst_on");
if (IS_ERR(xxx_rst_on)) {
printk("failed
");
ret = PTR_ERR(xxx_rst_on);
return ret;
}
xxx_rst_off = pinctrl_lookup_state(xxx_pin_ctrl, "gpio_rst_off");
if (IS_ERR(xxx_rst_off)) {
printk("failed
");
ret = PTR_ERR(xxx_rst_off);
return ret;
}
/* gpio5, */
pinctrl_select_state(xxx_pin_ctrl, xxx_rst_on);/*gpio5 */
delay(20);
pinctrl_select_state(xxx_pin_ctrl, xxx_rst_off);/*gpio5 */
delay(20);
}
static int xxx_remove(struct platform_device *dev){
/*************/
}
#ifdef CONFIG_OF
static const struct of_device_id xxx_gpio_of_id[] = {
{.compatible = "mediatek,gpio_rst",},
{}
};
#endif
static struct platform_driver caotuo_platform_driver = {
.probe = xxx_probe,
.remove = xxx_remove,
.driver = {
.name = my_name,
.owner = THIS_MODULE,
#ifdef CONFIG_OF/* , dts*/
.of_match_table = xxx_gpio_of_id,
#endif
},
};
static int __init caotuo_init(void)
{
int ret=0;
ret = platform_driver_register(&caotuo_platform_driver);
if (ret) {
printk("failed
");
return ret;
}
return ret;
}
static void __exit caotuo_exit(void)
{
platform_driver_unregister(&caotuo_platform_driver);
}
module_init(caotuo_init);
module_exit(caotuo_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("xxxx");
MODULE_DESCRIPTION("xxxx");
三、まとめ
駆動では主に3つのAPIを把握し、順番に呼び出す.devm_pinctrl_get();//定義時にdevres_が呼び出されますalloc()動的申請メモリ領域
pinctrl_lookup_state();
pinctrl_select_state();
転載は出典を明記してください!