创作本文目的:记录自己的学习历程
一、用分步注册+GPIO子系统编写实现6盏LED的控制
1.程序
头文件.h
#ifndef __LED_H__
#define __LED_H__
enum LED
{
LED1=0,
LED2,
LED3,
LED4,
LED5,
LED6
};
#define LED_ON _IOW('a',1,int)
#define LED_OFF _IOW('a',0,int)
#endif
驱动.c
#include "led.h"
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/gpio.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#define CNAME "mycdev_led"
#define COUNT 6
struct cdev* cdev;
int minor = 0;
#if 0
unsigned int major = 0;//动态申请
#else
unsigned int major = 500; //静态指定设备号
#endif
char kbuf[128] = {
0 };
struct class* cls;
struct device* dev;
//定义一个指向设备节点的指针
struct device_node* node;
struct property* pr; //属性结构体指针
int gpioled[6]; //存放gpio编号
int curno; //记录打开的是哪一个设备节点
int mycdev_open(struct inode* inode, struct file* filp)
{
curno = MINOR(inode->i_rdev);
printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
return 0;
}
ssize_t mycdev_read(struct file* filp,
char __user* ubuf, size_t size, loff_t* offs)
{
int ret;
printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
if (size > sizeof(kbuf))
size = sizeof(kbuf);
ret = copy_to_user(ubuf, kbuf, size);
if (ret) {
printk("copy data to user error\n");
return -EINVAL;
}
return size;
}
ssize_t mycdev_write(struct file* filp,
const char __user* ubuf, size_t size, loff_t* offs)
{
int ret;
printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
if (size > sizeof(kbuf))
size = sizeof(kbuf);
ret = copy_from_user(kbuf, ubuf, size);
if (ret) {