1、内核中gpio的函数API--->gpiolib.c [1]测试gpio端口是否合法: int gpio_is_valid(int number); [2]申请、释放gpio管脚 static inline int gpio_request(unsigned gpio, const char *label); static inline void gpio_free(unsigned gpio); [3]标记gpio的使用方向包括输入还是输出/*成功返回零失败返回负的错误值*/ static inline int gpio_direction_input(unsigned gpio); static inline int gpio_direction_output(unsigned gpio , int value); [4]获得gpio引脚的值和设置gpio引脚的值(对于输出) static inline int gpio_get_value(unsigned gpio); static inline void gpio_set_value(unsigned int gpio, int value); [5]gpio当作中断口使用 static inline int gpio_to_irq(unsigned int gpio); 2、用户空间gpio的调用 在/sys/下提供了相关用户层与底层进行交互的属性文件; /sys/class/gpio/ (2.0)内核配置 Device Drivers ---> -*- GPIO Support ---> /sys/class/gpio/... (sysfs interface)
如果说用户空间想跟内核中的GPIO管叫进行交互的话,首先需要将该管脚导出至用户空间; (2.1) export/unexport /sys/class/gpio/export (2.2) /sys/class/gpio/gpioN:pin direction: in/out value:0/1 (2.3)/sys/class/gpio/gpiochipN 3、gpio的led编写方式 (3.0)原理图中led对应管脚信息: led2 gpx2_7 led3 gpx1_0 led4 gpf3_4 led5 gpf3_5 (3.1)GPIO管脚设备树的写法: [1]改写设备树 设备树写法: fs4412-leds-gpio{ compatible = "fs4412,leds"; /* index : 0 1*/ led2 = <&gpx2 7 0>; led3 = <&gpx1 1 0>; led4 = <&gpf3 4 0>; led5 = <&gpf3 5 0>; }; /* 就led2引用节点剖析: gpx2这一组对应的设备树:exynos4x12-pinctrl.dtsi 582 gpx2: gpx2 { 583 gpio-controller; 584 #gpio-cells = <2>;---->表征的是其子节点或者是继承者的GPIO的<&gpx2 7 0>; 中&gpx2后边的参数个数,7代表第七个管脚,0代表工作模式 586 interrupt-controller; 587 #interrupt-cells = <2>; 588 }; */ 编译设备树: make dtbs 拷贝设备树生成的文件至挂载目录: cp xxx.dtb ~/tftpboot [2]程序编写 [2.1]将设备树中的设备信息所在的节点获取 设备树节点信息获取:of_find_node_by_path gpio管脚获取 :of_get_named_gpio [2.2]获取该节点中的设备信息 [2.3]执行gpio相关的操作
|