zoukankan      html  css  js  c++  java
  • 点亮led灯程序(驱动部分)

    #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 ");

    /*配置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 ");

    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");

  • 相关阅读:
    【读书笔记】组合计数中的行列式方法 基础
    【读书笔记】有序分拆和无序分拆的结论速览
    三种常见的卷积概述(线性卷积周期卷积圆周卷积)以及重叠保留法重叠相加法
    大会COOKIE与session
    JVM监测&工具[整理中](五)
    谷歌浏览器启动参数
    Maven的配置文件pom.xml
    classLoader卸载与jvm热部署
    在Windows Server 2008R2中安装配置SMTP服务
    Could not start the MS DTC Transaction Manager
  • 原文地址:https://www.cnblogs.com/kingqinwang/p/5147379.html
Copyright © 2011-2022 走看看