#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/gpio.h>
#include<linux/amlogic/aml_gpio_consumer.h>
static int GPIOA_7_pin = 0;
static int LED_open(struct inode *inode, struct file *file)
{
int ret = 0;
ret = amlogic_gpio_name_map_num("GPIOAO_7");
GPIOA_7_pin = ret;
amlogic_gpio_request(ret, "GPIAO7");
ret = amlogic_gpio_direction_output(ret, 0, "GPIAO7");
return 0;
}
static ssize_t LED_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
char val = 0;
unsigned long ret;
//ppos = ppos;
printk("carl_wang->led write...");
printk("count->%d\n",count);
ret = copy_from_user(&val, buf, count);
printk("buf[0]=%d\n",buf[0]);
printk("val=%d\n",val);
if(ret < 0){
printk("copy_from_user fail...\n");
return 1;
}
if (val == '1') //如果写入 1 就点灯
{
amlogic_gpio_direction_output(GPIOA_7_pin, 1, "GPIAO7");
}
else //否则 灭灯
{
amlogic_gpio_direction_output(GPIOA_7_pin, 0, "GPIAO7");
}
return count;
}
static struct file_operations LED_fops = {
.owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */
.open = LED_open,
.write = LED_write,
};
static struct class *led_class = NULL;
int major;
static int __init LED_init(void)
{
printk("carl_wang led init...\n");
major = register_chrdev(0, "led", &LED_fops); //参数0表示自动寻找设备号
led_class = class_create(THIS_MODULE, "led");
if(led_class == NULL){
printk("failed in My_led class.\n");
return -1;
}
device_create(led_class, NULL, MKDEV(major, 0),NULL,"led");
printk("led driver initialized\n");
return 0;
}
static void __exit LED_exit(void)
{
unregister_chrdev(major, "led"); // 卸载
device_destroy(led_class,MKDEV(major, 0));
}
module_init(LED_init);
module_exit(LED_exit);
MODULE_LICENSE("GPL");
这个驱动会在/dev/产生led的一个设备文件,上层可以直接对led的文件进行读写进而操作led的灯亮或者灭,至于如何对led的pin管脚进行如何操作就是平台相关的东西了。这个驱动是实际中使用的驱动,已经测试通过。平台是amlogic平台。
led驱动编写并非使用led 子系统(实际led驱动编写)
最新推荐文章于 2023-11-03 10:15:45 发布