rk3576点灯

rk3576点灯驱动代码

c 复制代码
#include <linux/module.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/uaccess.h>
#include <linux/io.h>



#define ANFANG_LED_GPIO_DR 0x27320000
#define ANFANG_LED_GPIO_DDR 0x2732008
#define ANFANG_LED_GPIO_ADD 0x26042000



struct DEV{
	dev_t DEV_num;
	struct cdev DEV_cdev;
	struct class *DEV_class;
	struct device *DEV_device;
	int major;
	int minor;
	char kbuf[32];
	unsigned int *xiunidizhi;
};




struct DEV led;


static int led_open(struct inode *inode,struct file *file)
{
	file->private_data=container_of(inode->i_cdev,struct DEV,DEV_cdev);
	printk("led open\n");
	return 0;
}

static ssize_t led_read(struct file *file,char __user *buf,size_t size,loff_t *off)
{
	struct DEV *led_data=(struct DEV *)file->private_data;

	int ret;
	ret=copy_to_user(buf,led_data->kbuf,strlen(led_data->kbuf));
	if(ret!=0)
	{
		printk("read error\n");
	}
	return 0;
}

static ssize_t led_write(struct file *file,const char __user *buf,size_t size,loff_t *off)
{
	struct DEV *led_data=(struct DEV *)file->private_data;

	int ret;
	ret=copy_from_user(led_data->kbuf,buf,size);
	if(ret!=0)
	{
		printk("read error\n");
	}
	else
	{
		printk("kbuf is %d\n",led_data->kbuf[0]);
	}
	if(led_data->kbuf[0]==1)
	{
		*(led.xiunidizhi)=0x10001000;
		printk("led on\n");
	}
	else
	{
		 *(led.xiunidizhi)=0x10000000;
		 printk("led off\n");
	}
	return 0;
}		

static int led_release(struct inode *inode,struct file *file)
{
	return 0;
}

struct file_operations led_ops={
	.owner=THIS_MODULE,
	.open=led_open,
	.read=led_read,
	.write=led_write,
	.release=led_release,
	//.unlock_ioctl=;
};



static int moduledev_init(void)
{
	int ret;
	ret=alloc_chrdev_region(&led.DEV_num,0,1,"anfang_led");
	if(ret<0)
	{
		printk("alloc_chrdev_region error\n");
	}
	led.major=MAJOR(led.DEV_num);
	led.minor=MINOR(led.DEV_num);
	printk("major is %d",led.DEV_num);
	printk("minor is %d",led.DEV_num);


	led.DEV_cdev.owner=THIS_MODULE;
	cdev_init(&led.DEV_cdev,&led_ops);

	ret=0;
	ret=cdev_add(&led.DEV_cdev,led.DEV_num,1);
	if(ret<0)
	{
		printk("cdev_add error\n");
	}

	led.DEV_class=class_create(THIS_MODULE,"anfang_led_class");
	if(IS_ERR(led.DEV_class))
	{
		printk("class_create error");
	}

	led.DEV_device=device_create(led.DEV_class,NULL,led.DEV_num,NULL,"anfang_led_device");
	if(IS_ERR(led.DEV_device))
	{
		printk("device_create error");
	}
//------------------------------------------创建设备


	led.xiunidizhi=ioremap(ANFANG_LED_GPIO_DR,4);
	return 0;
}

static void moduledev_exit(void)
{
	unregister_chrdev_region(led.DEV_num,1);
	cdev_del(&led.DEV_cdev);
	device_destroy(led.DEV_class,led.DEV_num);
	class_destroy(led.DEV_class);

}


module_init(moduledev_init);
module_exit(moduledev_exit);


MODULE_LICENSE("GPL");
MODULE_AUTHOR("KFC");
MODULE_VERSION("V1.0");

应用代码

c 复制代码
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#include <stdint.h>
#include <unistd.h>
#include <errno.h>
#include <linux/input.h>

int main(int argc,char *argv[])
{

	int fd;
	int ret;
	ret=0;
	char buf[32]={0};
	fd=open("/dev/anfang_led_device", O_RDWR);
	if(fd<0)
	{
		printf("open /dev/anfang_led error\n");
		return 0;
	}
	buf[0]=atoi(argv[1]);
	ret=write(fd,buf,sizeof(buf));
	
	close(fd);
	return 0;
}
相关推荐
不昀2 小时前
网口Link Up后仍然掉线,怎样区分物理链路和数据通路问题?
linux·以太网
Lhan.zzZ2 小时前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt
Fcy6483 小时前
Linux下 多路转接select详解
linux·select·多路转接
无足鸟ICT4 小时前
【RHCA+】RPM包命名规则
linux·运维·服务器
Zucker n4 小时前
一款适合研究生科研工作安排的日历
linux·数据库·python
爱吃香菜的初学者5 小时前
十六.Linux——多线程(2)
linux·运维·开发语言
‎ദ്ദിᵔ.˛.ᵔ₎6 小时前
Linux:对有关 SIGCHLD 的深层理解
linux·运维·服务器
aichitang20246 小时前
QCU 2.0.0:补齐 Windows、Linux 与 GNOME Wayland
linux·运维·windows·ai·agent·ai编程
Lv_沐曦7 小时前
Linux 上的Web文件管理器-filebrowser
linux·运维·服务器