查看: 1507|回复: 0

linux 通过设备树写LED驱动(附参考代码,...

[复制链接]
  • TA的每日心情
    奋斗
    2016-4-14 10:16
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2019-3-6 16:59:39 | 显示全部楼层 |阅读模式
    分享到:


    全志A64设备树结构体

    #include <linux/of.h> //设备树里的每个设备及每个设备子节点都用此结构体描述
    struct device_node
    {
        const char *name;
        const char *type;
        phandle phandle;
        const char *full_name;
        struct property *properties; //属性
        struct property *deadprops; /* removed properties */
        struct device_node *parent; //在设备子节点对象,指向属于的设备对象
        struct device_node *child; //在设备对象,指向子节点
        struct device_node *sibling; //指向同级的下一个对象.
        struct device_node *next; /* next device of same type */ //应是指向device_type是同样的对象
        struct device_node *allnext; /* next in list of all nodes */ ...
    };

    //下面函数用于获取设备树里的设备节点及设备子节点
    extern struct device_node *of_find_node_by_name(struct device_node *from, const char *name);
    //通过名字查找相应的设备节点
    static inline int of_get_child_count(const struct device_node *np);
    //获取指定设备的子节点个数
    extern struct device_node *of_find_node_by_path(const char *path);
    //通过路径来获取设备节点,可用于获取设备子节点
    extern struct device_node *of_find_node_by_type(struct device_node *from, const char *type);  //通过指定的device_type来获取设备节点

    //下面函数用于获取设备节点或设备子节点的属性
    static inline int of_property_read_u32(const struct device_node *np, const char *propname, u32 *out_value)
    extern int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value);
    extern int of_property_read_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz);
    extern int of_property_read_u16_array(const struct device_node *np, const char *propname, u16 *out_values, size_t sz);
    extern int of_property_read_u32_array(const struct device_node *np, const char *propname, u32 *out_values, size_t sz);
    extern int of_property_read_u64(const struct device_node *np, const char *propname, u64 *out_value);
    extern int of_property_read_string(struct device_node *np, const char *propname, const char **out_string)

    首先增加节点,修改dtsi文件。
    vim /lichee/linux-3.10/arch/arm64/boot/dts/sun50iw1p1-pinctrl.dtsi

    gpio = <&pio 1 1 1 1 1 0>;
    |              |    |  |   |  |  | |-------------------表示有效电平
    |              |    |  |   |  |  |----------------------上下拉, 0关闭功能, 1上拉, 2下拉, 3保留
    |              |    |  |   |  |-------------------------驱动力,电流等级(0 - 3),级别越高,输出电流越大
    |              |    |  |   |----------------------------gpio功能类型,0输入, 1输出, 6和外部中断,7关闭功能(具体查手册)
    |              |    |  |------------------------------pin bank 内偏移(即组内第几个io口).
    |              |    |---------------------------------哪组gpio,PA(0),PB(1),PC(2),PD(3),PE(4),PF(5),PG(6),PH(7),PI(8),PJ(9),PK(10),PL(11)
    |              |--------------------------------------指向哪个gpio控制器, pio / r_pio(PL组) |-----------------------------------------------------属性名字(随便命名)

    驱动代码:

    [code]#include <linux/module.h>
    #include <linux/init.h>
    #include <linux/fs.h>
    #include <linux/device.h>
    #include <linux/slab.h>
    #include <linux/cdev.h>
    #include <asm/uaccess.h>
    #include <linux/io.h>
    #include <linux/of.h>
    #include <linux/of_gpio.h>
    #include <linux/gpio.h>
    #include <linux/sys_config.h>

    #define MY_DEVICE_NAME "my_led_device"
    // 获取到设备树中到节点
    static int gpio = -1;
    int get_irqno_from_node(void)
    {
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 20:39 , Processed in 0.108206 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.