3月27号作业

该代码示例展示了如何在Linux中使用设备树来获取GPIO引脚,并通过定时器实现三盏LED灯的交替点亮。通过of_find_node_by_name找到设备树节点,然后使用of_get_named_gpio获取GPIO编号,设置为输出并初始化定时器进行灯的状态切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

        题目一:基于GPIO子系统实现三盏灯点亮

        题目二:用自己的话描述设备树相关解析函数

代码:

        题目一:

mycdev.c

#include<linux/io.h>
#include<linux/device.h>
#include<linux/poll.h>
#include<linux/of.h>
#include <linux/init.h>
#include <linux/module.h>
#include<linux/fs.h>
#include<linux/uaccess.h>
#include<linux/timer.h>
#include"myled.h"
#include<linux/of_gpio.h>

struct timer_list timer;
struct device_node *dnode;
int gpiono1;
int gpiono2;
int gpiono3;


void timer_handler(struct timer_list *timer)
{
    gpio_set_value(gpiono1,!gpio_get_value(gpiono1));
    gpio_set_value(gpiono2,!gpio_get_value(gpiono2));
    gpio_set_value(gpiono3,!gpio_get_value(gpiono3));
    mod_timer(timer,jiffies+HZ);
}


//入口函数
static int __init mycdev_init(void)
{
    dnode=of_find_node_by_name(NULL,"myleds");
    if(dnode==NULL)
    {
        printk("解析设备树节点失败\n");
        return -EIO;
    }
    printk("解析设备树节点成功\n");
    gpiono1=of_get_named_gpio(dnode,"led1",0);
    gpiono2=of_get_named_gpio(dnode,"led2",0);
    gpiono3=of_get_named_gpio(dnode,"led3",0);
    if(gpiono1<0||gpiono2<0||gpiono3<0)
    {
        printk("解析gpio编号失败\n");
        return -EIO;
    }
    printk("解析gpio编号成功\n");
    gpio_request(gpiono1,NULL);
    gpio_request(gpiono2,NULL);
    gpio_request(gpiono3,NULL);
    gpio_direction_output(gpiono1,0);
    gpio_direction_output(gpiono2,0);
    gpio_direction_output(gpiono3,0);

    timer.expires=jiffies+HZ;
    timer_setup(&timer,timer_handler,0);
    add_timer(&timer);
    
    return 0;
}
//出口函数
static void __exit mycdev_exit(void)
{
    gpio_free(gpiono1);   
    gpio_free(gpiono2); 
    gpio_free(gpiono3); 
    del_timer(&timer);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

题目二:

of_find_node_by_name(),通过名字查找要操作的设备树节点,通过解析得到的设备树节点的句柄,利用句柄和不同功能解析函数能得到设备树节点里不同的资源,比如of_find_property 能解析出和键名对应的属性,of_get_named_gpio()可以解析出gpio编号.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值