Linux pincterlの駆動使用例


使用例である以上,APIの使用のみに関心を持ち,APIにおける具体的な実装は余計なことではない.
例: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();
転載は出典を明記してください!