点亮led灯程序(驱动部分)

回眸只為那壹抹淺笑 提交于 2020-01-24 14:39:57

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/fs.h>

#include <linux/init.h>

#include <linux/delay.h>

#include <asm/uaccess.h>

#include <asm/irq.h>

#include <asm/io.h>

#include <asm/arch/regs-gpio.h>

#include <asm/hardware.h>

static  struct  class *firstdrv_class;

static struct class_device *firstdrv_class_dev;

volatile  unsigned  long  *gpfcon =NULL;

volatile  unsigned  long  *gpfdat =NULL;

static int  first_drv_init(void);

static  int  first_drv_open(struct  inode  *inode,  struct  file  *file )

{ //printk("first_drv_open\n");

/*配置GPF4,5,6 为输出*/

//初始状态为输入

*gpfcon &= ~((0x3<<(4*2) ) |(0x3<<(5*2) ) |(0x3<<(6*2) ));

*gpfcon |=((0x1<<(4*2) ) |(0x1<<(5*2) ) |(0x1<<(6*2) ));

return  0;

}

static ssize_t  first_drv_write(struct  file  *file ,const  char __user  *buf, size_t  count ,loff_t  *ppos) {

int val;

//printk("first_drv_write\n");

copy_from_user( &val, buf, count); //copy_to _user();

if(val==1) {

//点灯,低电平点灯

*gpfdat &=~(1<<4) | (1<<5) |(1<<6);

} else {

//灭灯

*gpfdat |=(1<<4) | (1<<5) |(1<<6);

}

return 0;

} static  struct  file_operations  first_drv_fops=

{

    .owner=THIS_MODULE,    

   .open = first_drv_open,          

   .write=first_drv_write,

};

int  major;

static int  first_drv_init(void) {

/* 系统自动分配主设备号 */

major=register_chrdev(0,"first_drv ",&first_drv_fops );

//注册驱动程序

firstdrv_class = class_create(THIS_MODULE, "firstdrv");  

//创建设备节点

firstdrv_class_dev= class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz");

/*if (unlikely(IS_ERR(firstdrv_class_dev)))    return PTR_ERR(firstdrv_class_dev);*/

//映射寄存器的地址到内核

gpfcon =(volatile unsigned long * )ioremap(0x56000050,16);             

gpfdat=gpfcon+1;

return  0;

}

void  first_drv_exit(void) {

unregister_chrdev(major,"first_drv");

//卸载驱动

class_device_unregister(firstdrv_class_dev);    

class_destroy(firstdrv_class);  iounmap(gpfcon); }    

module_init( first_drv_init);

module_exit(first_drv_exit);

MODULE_LICENSE("GPL");

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!