2023/3/27作业

实现过程:

        

通过增加设备树结点,使用gpio子系统对LED灯进行操作

GPIO子系统框架图:

2023/3/27作业_第1张图片

 

LED等的硬件连接图:

2023/3/27作业_第2张图片

 

新增设备树结点:

在linux内核源码目录/arch/arm/boot/dts目录下,打开对应dts文件,添加如下设备结点

注:根据linux内核源码目录/Documentation/devicetree/bindings/gpio/下的gpio.txt文件中的例子编写对应新增的设备树结点

2023/3/27作业_第3张图片

 

驱动代码:

#include 
#include 
#include
#include
#include
/*myleds{
    led1=<&gpioe 10 0>;
    led2=<&gpiof 10 0>;
    led3=<&gpioe 8 0>;
};*/
//分配定时器对象
 struct timer_list timer;  
 struct device_node *dnode;
 int gpiono;
 int gpiono1;
 int gpiono2;
 //定时器处理函数
 void timer_handler(struct timer_list *timer)
{
    gpio_set_value(gpiono,!gpio_get_value(gpiono));
    gpio_set_value(gpiono1,!gpio_get_value(gpiono1));
    gpio_set_value(gpiono2,!gpio_get_value(gpiono2));
    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");
    //根据设备树节点解析gpio编号
    gpiono= of_get_named_gpio(dnode,"led1",0);
    if(gpiono<0)
    {
        printk("1解析gpio编号失败\n");
        return -EIO;
    }
    printk("1解析gpio编号成功\n");
    gpiono1= of_get_named_gpio(dnode,"led2",0);
    if(gpiono1<0)
    {
        printk("2解析gpio编号失败\n");
        return -EIO;
    }
    printk("2解析gpio编号成功\n");
    gpiono2= of_get_named_gpio(dnode,"led3",0);
    if(gpiono2<0)
    {
        printk("3解析gpio编号失败\n");
        return -EIO;
    }
    printk("3解析gpio编号成功\n");
    //申请gpio编号
    gpio_request(gpiono,NULL);
    gpio_request(gpiono1,NULL);
    gpio_request(gpiono2,NULL);
    //设置gpio为输出并且初始化数值为0
    gpio_direction_output(gpiono,0);
    gpio_direction_output(gpiono1,0);
    gpio_direction_output(gpiono2,0);
    //定时器初始化
    //指定定时阈值
    timer.expires=jiffies+HZ;
    timer_setup(&timer,timer_handler,0);
    add_timer(&timer);
    return 0;
}
static void __exit mycdev_exit(void)
{
    gpio_free(gpiono);
    del_timer(&timer);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

2023/3/27作业_第4张图片

 

你可能感兴趣的:(linux,运维,服务器)