题目:
题目一:基于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编号.