• misc_register


    杂项设备

    linux里面的misc杂项设备是主设备号为10的驱动设备
    定义头文件<linux/miscdevice.h>
     
    杂项设备的结构体:
    struct miscdevice{
      int minor; //杂项设备的此设备号(如果设置为MISC_DYNAMIC_MINOR,表示系统自动分配未使用的minor)
      const char *name;
      const stuct file_operations *fops;//驱动主题函数入口指针
      struct list_head list;
      struct device *parent;
      struct device *this device;
      const char *nodename;(在/dev下面创建的设备驱动节点)
      mode_t mode;
    };
     
    注册和释放
    注册:int misc_register(struct miscdevice *misc)
    释放:int misc_deregister(struct miscdevice *misc)
     
    misc_device是特殊字符设备。注册驱动程序时采用misc_register函数注册,此函数中会自动创建设备节点,即设备文件。无需mknod指令创建设备文件。因为misc_register()会调用class_device_creat或者device_creat().
    杂项字符设备和一般字符设备的区别:
    1.一般字符设备首先申请设备号。  但是杂项字符设备的主设备号为10次设备号通过结构体struct miscdevice中的minor来设置。
    2.一般字符设备要创建设备文件。 但是杂项字符设备在注册时会自动创建。
    3.一般字符设备要分配一个cdev(字符设备)。  但是杂项字符设备只要创建struct miscdevice结构即可。
    4.一般字符设备需要初始化cdev(即给字符设备设置对应的操作函数集struct file_operation). 但是杂项字符设备在结构体truct miscdevice中定义。
    5.一般字符设备使用注册函数 int cdev_add struct (cdev *p,devt_t dev, unsigned)(第一个参数为之前初始化的字符设备,第二个参数为设备号,第三个参数为要添加设备的个数) 而杂项字符设备使用int misc_register(struct miscdevice *misc)来注册
     
    驱动调用的实质:
    就是通过 设备文件找到与之对应设备号的设备,再通过设备初始化时绑定的操作函数硬件进行控制
     
     内核态
    #include <linux/miscdevice.h>
     
    static unsigned long led_table [] =
    {
    S3C2410_GPB(5),
    S3C2410_GPB(6),
    S3C2410_GPB(7),
    S3C2410_GPB(8),
    };
     
    static unsigned int led_cfg_table [] =
    {
    S3C2410_GPIO_OUTPUT,
    S3C2410_GPIO_OUTPUT,
    S3C2410_GPIO_OUTPUT,
    S3C2410_GPIO_OUTPUT,
    };
    static long phy_ioctl (struct file *pstFilp, unsigned int Cmd, unsigned long ulArg)
    {
       ulret
    = copy_from_user(&data, (phy_data_s *)ulArg, sizeof(phy_data_s)); switch(Cmd) { case PHY_READ: ulret = ReadPagedPhyReg(data.slot, data.port, data.page, data.addr, &(data.data)); if(ulret != ERROR_SUCCESS) { DEBUG_PRINT(KERN_EMERG "Reading phy reg failed. "); return ulret; } break; } ulret = copy_to_user((phy_data_s *)ulArg, &data, sizeof(phy_data_s));    return 0; }
     
     
    static struct file_operations dev_fops = {
      .owner = THIS_MODULE,
      .unlocked_ioctl = phy_ioctl ,
    };
     
    static struct miscdevice misc = {
      .minor = MISC_DYNAMIC_MINOR,
      .name = "misc_phy",,
      .fops = &dev_fops,
    };
     
    static int __init dev_init(void)
    {
    int ret;
     
    int i;
    for (i = 0; i < 4; i++)
    {
    s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
    s3c2410_gpio_setpin(led_table[i], 0);
    }
     
    ret = misc_register(&misc);
     
    printk (DEVICE_NAME" initialized ");
     
    return ret;
    }
     
    static void __exit dev_exit(void)
    {
    misc_deregister(&misc);
    }
     
    module_init(dev_init);
    module_exit(dev_exit);
     
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("www.e-online.cc");
    MODULE_DESCRIPTION("LEDS control for GT2440 Board");
     用户态
    int main(int argc, char *argv[])
    {
    int op;
    int ret = 0;
    char *s_op = "rd";
    int tmp = 0;
    int i;
    
    if(argc == 4 )
    {
      if(!strcmp(argv[1], "link"))
      {
        op = PHY_link_status;
      }
    
      ret = sscanf(argv[2], "%d", &tmp);
    
      if(1 != ret)
      {
        printf("%s:%d argv[2] error
    ",__FUNCTION__,__LINE__);
        return -1;
      }
      stPhyInfo.slot = (unsigned char)tmp;
    
      ret = sscanf(argv[3], "%d", &tmp);
      if(1 != ret)
      {
        printf("%s:%d argv[3] error
    ",__FUNCTION__,__LINE__);
        return -1;
      }
      stPhyInfo.port = (unsigned char)tmp;
    
      fd = open("/dev/misc_phy",O_RDWR);
      if(fd < 0)
      {
        printf("%s:%d open fail
    ",__FUNCTION__,__LINE__);
        return -1;
      }
    
      ret = ioctl(fd, op, (unsigned long)&stPhyInfo);
      if(ret != ERROR_SUCCESS)
      {
        printf("%s:%d . Ioctl fail.
    ",__FUNCTION__,__LINE__);
        return ret;
      }
      close(fd);
    
      return 0;
    
    }
     
    引用http://blog.sina.com.cn/s/blog_966f8e8501010xhw.html。
  • 相关阅读:

    卖了5个月水果之后再看互联网思维
    实时流式计算框架Storm 0.9.0发布通知(中文版)
    Top100Summit全球案例研究峰会第一天总结——云计算和大数据
    [若有所悟]提升工作效率的一些小技巧——资源管理器篇
    [若有所悟]主持会议的八大戒条
    惊魂36小时,一次生产事故,动态磁盘删除卷分区丢失,数据恢复案例实战
    一个不用的域名到期导致整个服务器上其他网站都无法访问的线上事故
    guava cache大量的WARN日志的问题分析
    IDEA下运行 mybatis报错 Parameter 'arg0' not found. Available parameters are [autoRecharge, id, param1, param2]
  • 原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/12894883.html
Copyright © 2020-2023  润新知