#include <linux/init.h> /* module_init()等宏定义头文件 */
#include <linux/module.h> /* MODULE_LICENSE等宏定义头文件 */
#include <linux/gpio.h> /* gpio 相关头文件 */
#include <linux/fs.h> /* file_operations 的相关头文件 */
#include <linux/uaccess.h> /* copy_from_user()的头文件 */
#include <linux/device.h> /* class_destroy()等函数头文件 */
#include <linux/platform_device.h> /* platform_device_register()等函数头文件 */
#include <linux/gpio/consumer.h>
#include <linux/gpio.h> // 用于 GPIO 操作
#include <linux/of_gpio.h> // 用于设备树 GPIO 操作
#include <linux/of.h> // 用于设备树操作
static int major = 0;
static int gpio_num; // 使用 gpio_num 来存储 GPIO 引脚编号
static struct class *gpio_class;
static int gpio_open(struct inode *node, struct file *filp)
{
/* 设置为输出功能,输出0 */
gpio_direction_output(gpio_num, 0);
return 0;
}
static int gpio_release(struct inode *node, struct file *filp)
{
/* 灭灯 */
gpio_set_value(gpio_num, 0);
/* 释放 GPIO 硬件资源 */
gpio_free(gpio_num);
return 0;
}
static ssize_t gpio_read(struct file *filp, char __user *buf, size_t size, loff_t *off)
{
return 0;
}
static ssize_t gpio_write(struct file *filp, const char __user *buf, size_t size, loff_t *off)
{
unsigned char val_led;
copy_from_user(&val_led, buf, 1);
if (val_led) {
/* GPIO 输出高电平,开灯 */
gpio_set_value(gpio_num, 1);
} else {
/* GPIO 输出低电平,关灯 */
gpio_set_value(gpio_num, 0);
}
return 1;
}
static struct file_operations gpio_oprs = {
.owner = THIS_MODULE,
.open = gpio_open,
.read = gpio_read,
.write = gpio_write,
.release = gpio_release,
};
static int gpio_probe(struct platform_device *pdev)
{
gpio_num = of_get_named_gpio(pdev->dev.of_node, "my-gpios", 0);
if (gpio_num < 0) {
pr_err("Failed to get GPIO from device tree\n");
return gpio_num;
}
/* 初始化 GPIO */
if (gpio_request(gpio_num, "PB4") != 0) {
pr_err("Failed to request GPIO %d\n", gpio_num);
return -1;
}
gpio_direction_output(gpio_num, 0); // 设置为输出,初始为 0
// 注册字符设备
major = register_chrdev(0, "mygpio", &gpio_oprs);
if (major < 0) {
printk(KERN_ERR "Failed to register char device\n");
gpio_free(gpio_num); // 释放 GPIO 资源
return major;
}
// 创建 class 和 device
gpio_class = class_create(THIS_MODULE, "mygpio");
if (IS_ERR(gpio_class)) {
unregister_chrdev(major, "mygpio");
gpio_free(gpio_num);
return PTR_ERR(gpio_class);
}
device_create(gpio_class, NULL, MKDEV(major, 0), NULL, "mygpio");
return 0;
}
static int gpio_remove(struct platform_device *pdev)
{
unregister_chrdev(major, "mygpio");
device_destroy(gpio_class, MKDEV(major, 0));
class_destroy(gpio_class);
return 0;
}
struct platform_driver gpio_drv = {
.probe = gpio_probe,
.remove = gpio_remove,
.driver = {
.name = "mygpio",
}
};
// 入口:insmod
static int __init gpio_init(void)
{
/* 注册平台驱动 */
platform_driver_register(&gpio_drv);
printk("LED init ...\n"); // 打印提示信息
return 0;
}
// 出口:rmmod
static void __exit gpio_exit(void)
{
/* 删除平台驱动 */
platform_driver_unregister(&gpio_drv);
printk(KERN_INFO "LED exit...\n"); // 打印提示信息
}
/* 三要素 */
module_init(gpio_init);
module_exit(gpio_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LDL-1027221389.qq.com"); // 模块作者的声明
MODULE_DESCRIPTION("LED Driver"); // 当前模块的功能描述
冬瓜~
- 粉丝: 2214
- 资源: 128
最新资源
- 00-【管理制度】09-师带徒管理办法.docx
- 02-【考核方案】02-师带徒考核管理办法.docx
- 02-【考核方案】06-师带徒考核表.doc
- 02-【考核方案】05-师带徒考核标准打分表.doc
- 02-【考核方案】04-师带徒工作考核评价办法.docx
- 02-【考核方案】07-师带徒考核评定标准表范例.doc
- 02-【考核方案】09-师带徒月度考核表.xls
- 03-【培训方案】新员工师带徒岗位成才培训方案.doc
- 双pwm变流器,ac-dc-ac,整流逆变并网,整流侧采用双闭环PI控制,电压外环电流内环,双解耦,svpwm;逆变侧采用双闭环PI控制,电压外环电流内环,svpwm 380vac整流至750v,再
- 导师制培养方案.pptx
- 结构化在岗辅导与导师制P30.pptx
- 华为导师制人才培养模式p22.pptx
- MPPT电导增量法INC仿真模型,作为目前实际光伏发电系统中最常用的mppt算法,采用了输出参考电压的方式来进行PWM调制
- “师带徒”评价表(徒弟评价师傅).xls
- 导师带徒活动记录.xls
- “师带徒”统计表.xlsx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈