精华内容
下载资源
问答
  • linux下查看设备节点 节点号

    千次阅读 2020-08-19 22:24:47
    查看加载的设备 ls /dev 查看加载设备模块 lsmod 查看设备号(主设备) cat /proc/devices 查看设备节点 ls /proc/device-tree

    查看加载的设备
    ls /dev

    查看加载设备模块
    lsmod

    查看设备号(主设备)
    cat /proc/devices

    查看设备树节点
    ls /proc/device-tree

    展开全文
  • 生成设备节点

    2016-07-21 17:23:13
    生成设备节点 一部分驱动要和上层通信,都需要生成设备节点,上层应用通过一套标准的接口函数调用设备节点就可以控制底层以及和底层通信。最简单易用的杂项设备节点如何生成。 ##**为什么引入杂项设备** 在exynos...

    一部分驱动要和上层通信,都需要生成设备节点,上层应用通过一套标准的接口函数调用设备节点就可以控制底层以及和底层通信。最简单易用的杂项设备节点如何生成。

    为什么引入杂项设备

    在exynos4412开发板,在超级终端中输入命令“cat /proc/misc”可以查看对应的杂项设备。主设备号只有256 个,设备又非常多,所以引入了子设备号。其中杂项设备的主设备号是10,在任何Linux 系统中它都是固定的。一般将Linux驱动分为字符设备、块设备、网络设备,但是这个分类不能包含所有的设备,所以将无法归类的设备统称为杂项设备,杂项设备可能用到字符设备、快设备、网络设备中的一项或者多项设备。
    在linux虚拟机上在内核源码文件下,ls drivers/char可以看到misc.c和misc.o,可见它被编译进内核,使用vim drivers/char/Makefile打开杂项设备文件的编译文件。
    obj-y +=misc.o,该文件被强制编译进内核
    杂项设备设备部分完全制作好了,只需要添加子设备,非常方便。
    这样杂项设备的引入即解决了设备号数量少的问题,又降低了使用难度,还能防止碎片化,一举多得。

    杂项设备注册函数以及结构体

    杂项设备的头文件在“include/linux/miscdevice.h”

    struct miscdevice  {
        int minor;//设备号,赋值为MISC_DYNAMIC_MINOR,这个宏定义可以查到为10
        const char *name;//设备名称
        const struct file_operations *fops;//file_operations 结构体
        struct list_head list;
        struct device *parent;
        struct device *this_device;
        const char *nodename;
        mode_t mode;
    };
    
    extern int misc_register(struct miscdevice * misc);
    extern int misc_deregister(struct miscdevice *misc);

    Cextern int misc_register(struct miscdevice * misc);
    杂项设备注册函数;一般在probe 中调用,参数是miscdevice
    Cextern int misc_deregister(struct miscdevice *misc);
    杂项设备卸载函数;一般是在hello_remove 中用于卸载驱动。

    file_operations结构体

    file_operations 结构体的成员函数属于驱动开发的主体内容,里面的函数和Linux 系统给应用程序提供系统接口一一对应。
    file_operations结构体在内核源码“include/linux/fs.h”中,使用命令vim /include/linux/fs.h打开

    struct file_operations {
        struct module *owner;
        loff_t (*llseek) (struct file *, loff_t, int);
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
        ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
        ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
        int (*readdir) (struct file *, void *, filldir_t);
        unsigned int (*poll) (struct file *, struct poll_table_struct *);
    /* remove by cym 20130408 support for MT660.ko */
    #if 0
    //#ifdef CONFIG_SMM6260_MODEM
    #if 1// liang, Pixtree also need to use ioctl interface...
        int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
    #endif
    #endif
    /* end remove */
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
        long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
        int (*mmap) (struct file *, struct vm_area_struct *);
        int (*open) (struct inode *, struct file *);
        int (*flush) (struct file *, fl_owner_t id);
        int (*release) (struct inode *, struct file *);
        int (*fsync) (struct file *, int datasync);
        int (*aio_fsync) (struct kiocb *, int datasync);
        int (*fasync) (int, struct file *, int);
        int (*lock) (struct file *, int, struct file_lock *);
        ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
        unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
        int (*flock) (struct file *, int, struct file_lock *);
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
        int (*setlease)(struct file *, long, struct file_lock **);
        long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);
    /* add by cym 20130408 support for MT6260 and Pixtree */
    #if defined(CONFIG_SMM6260_MODEM) || defined(CONFIG_USE_GPIO_AS_I2C)
        int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
    #endif
    /* end add */
    };

    该结构体中参数非常之多,介绍常用的的参数

    struct module *owner;一般是THIS_MODULE。
    int (*open) (struct inode *, struct file *);//对应上层的open 函数,打开文件。
    int (*release) (struct inode *, struct file *);//对应上层的close 函数,打开文件操作之后一般需要关闭。
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//读函数,上层应用从底层读取函数。
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//写函数,上层应用向底层传输数据。
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);//这个函数功能和写函数稍微有点重合,但是这个函数占用的内存非常小,主要针对IO 口的控制。

    定义一个DEVICE_NAME,将其赋值为”hello_ctl123”,理解这个设备节点名称和前面介绍的注册设备名称是不同的。
    示例代码

    linux_misc.c
    #include <linux/init.h>
    #include <linux/module.h>
    
    /*驱动注册的头文件,包含驱动的结构体和注册和卸载的函数*/
    #include <linux/platform_device.h>
    /*注册杂项设备头文件*/
    #include <linux/miscdevice.h>
    /*注册设备节点的文件结构体*/
    #include <linux/fs.h>
    
    #define DRIVER_NAME "hello_ctl"
    #define DEVICE_NAME "hello_ctl123"
    MODULE_LICENSE("Dual BSD/GPL");
    MODULE_AUTHOR("chenmiaohong");
    
    static long hello_ioctl( struct file *files, unsigned int cmd, unsigned long arg){
    
    
        printk("cmd is %d,arg is %d\n",cmd,arg);
        return 0;
    }
    
    static int hello_release(struct inode *inode, struct file *file){
        printk(KERN_EMERG "hello release\n");
        return 0;
    }
    
    static int hello_open(struct inode *inode, struct file *file){
        printk(KERN_EMERG "hello open\n");
        return 0;
    }
    
    static struct file_operations hello_ops = {
        .owner = THIS_MODULE,
        .open = hello_open,
        .release = hello_release,
        .unlocked_ioctl = hello_ioctl,
    };
    
    static  struct miscdevice hello_dev = {
        .minor = MISC_DYNAMIC_MINOR,
        .name = DEVICE_NAME,
        .fops = &hello_ops,
    };
    
    
    static int hello_probe(struct platform_device *pdv){
    
        printk(KERN_EMERG "\tinitialized\n");
        misc_register(&hello_dev);
    
        return 0;
    }
    
    static int hello_remove(struct platform_device *pdv){
    
        printk(KERN_EMERG "\tremove\n");
        misc_deregister(&hello_dev);
        return 0;
    }
    
    static void hello_shutdown(struct platform_device *pdv){
    
        ;
    }
    
    static int hello_suspend(struct platform_device *pdv,pm_message_t pmt){
    
        return 0;
    }
    
    static int hello_resume(struct platform_device *pdv){
    
        return 0;
    }
    
    struct platform_driver hello_driver = {
        .probe = hello_probe,
        .remove = hello_remove,
        .shutdown = hello_shutdown,
        .suspend = hello_suspend,
        .resume = hello_resume,
        .driver = {
            .name = DRIVER_NAME,
            .owner = THIS_MODULE,
        }
    };
    
    
    static int hello_init(void)
    {
        int DriverState;
    
        printk(KERN_EMERG "HELLO WORLD enter!\n");
        DriverState = platform_driver_register(&hello_driver);
    
        printk(KERN_EMERG "\tDriverState is %d\n",DriverState);
        return 0;
    }
    
    
    static void hello_exit(void)
    {
        printk(KERN_EMERG "HELLO WORLD exit!\n");
    
        platform_driver_unregister(&hello_driver);  
    }
    
    module_init(hello_init);
    module_exit(hello_exit);

    编译完成后通过TFTP服务器下载到exynos4412开发板中,使用insmod加载linux_misc.ko文件,然后使用ls /dev查看出现了新的设备hello_ctl123,

    展开全文
  • 查看所有设备节点名称

    千次阅读 2017-04-27 19:00:06
    #include #include #include #include #include #include MODULE_LICENSE("Dual BSD/GPL"); MODULE_DESCRIPTION("a simple driver example!...static int mymodule_init... // 获取设备树首节点并遍历 struct d
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/version.h>
    #include <linux/of.h>
    #include <asm/io.h>
    
    MODULE_LICENSE("Dual BSD/GPL");
    MODULE_DESCRIPTION("a simple driver example!");
    
    static int mymodule_init(void)
    {
    	// 获取设备树首节点并遍历
    	struct device_node *node = of_allnodes;
    	while(node) 
    	{
    		printk("%s\n", node->name);
    		node = node->allnext;
    	}
    
    	printk("module install\n");
    	return 0;
    }
    
    static void mymodule_exit(void)
    {
    	printk("module release\n");
    }
    
    
    module_init(mymodule_init);
    module_exit(mymodule_exit);
    

    展开全文
  • Linux 设备节点

    2015-12-21 10:31:41
     通过 cat/proc/devices 可以查看你的设备节点是否创建成功。可以看到主设备号,和设备名。  通过 ls /dev/ 可以看到设备文件是否存在。如果没有,需要手动进行创建,创建方法如下:  mknod /dev/设备名 设备类型...

    1)按照上节的最简单Linux驱动框架,写的程序。在应用层调用时,发现文件打开失败。出现的问题是没有创建设备文件。

        通过 cat/proc/devices 可以查看你的设备节点是否创建成功。可以看到主设备号,和设备名。

      通过 ls /dev/  可以看到设备文件是否存在。如果没有,需要手动进行创建,创建方法如下:

     mknod   /dev/设备名  设备类型(c、b) 主设备号 次设备号


    2、在内核代码中之自动创建设备文件,代码如下:

           int major;
    struct class *myclass;
    major=register_chrdev(0,"memdev",&mem_fops);
    myclass = class_create(THIS_MODULE, "memdev");
             device_create(myclass, NULL, MKDEV(major, 0), NULL, "memdev");

    展开全文
  • 怎么查看DTS设备树的节点

    千次阅读 2019-10-29 10:35:04
    查看DTS设备树的节点 插上串口线,板子上电稳定运行以后,进入proc目录。在proc里面记录着系统信息 当前进程、当前设备树注册,文件系统,内存大小,CPU信息等) [root@rk3288:/]# cd proc [root@rk3288:/proc]# ls ...
  • 由于开发板上的内存空间较小,因此在开发板上内置了一块250G的硬盘,通过chroot的方式进行开发,在chroot的/dev下显示NULL,想要使用系统设备节点需要提前挂载,再进入chroot...2、查看设备节点 ls /dev/ v4l2-ctl --
  • Android 设备节点权限说明 文章目录Android 设备节点权限说明selinux 权限1. 临时关闭selinux(重启后失效)2. 源码selinux改成警告模式(无法关掉整个selinux)设备节点文件权限1. 临时加权限(重启后失效)2. 源码修改...
  • 自动创建设备节点

    2013-04-18 17:04:34
    驱动程序编写好后,还需要创建设备节点,有两种方式,一是通过mknod命令去手动创建,例如:mknod...使用mknod手动创建设备节点不够灵活,如果是动态分配的设备号怎么办,难道每次加载驱动后去查看/proc/devices文件中查
  • (六) 生成设备节点

    2016-09-25 13:13:31
    1.杂项设备节点 一部分驱动需要和上层应用进行通信,一般需要生成设备节点,上层应用通过一套标准的借口函数调用设备节点就可以控制底层以及底层通信。下面就简单易用的杂项设备节点生成做一下简单介绍:  在...
  • 2. 自动创建设备节点

    2018-06-29 22:26:00
    上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看...第一种是使用mknod手工创建:mknod filename type major minor第二种是自动创建设备节点:自动创建设备节点是利用udev(mdev)来实现设备文件的自动...
  • 上层应用通过设备节点访问对应的设备。 部分驱动要和上层通信,都需要生成设备节点,上层应用通过一套标准的接口函数调用设备节点就可以控制底层以及和底层通信。本文就给大家介绍最简单易用的杂项设备节点如何...
  • 使用mknod手动创建设备节点不够灵活,如果是动态分配的设备号怎么办,难道每次加载驱动后去查看/proc/devices文件中查看它的主设备号,利用**udev(mdev)**来实现设备节点的自动创建,**udev(mdev)**存在于应用层。...
  • mknod_创建设备节点

    2012-07-17 10:47:19
    查看设备主设备号和次设备号: ls -l    创建快设备节点 :b    mknod mtdblock0 b 31 0  mknod mtdblock1 b 31 1 mknod mtdblock2 b 31 2   创建字符设备节点:c   mknod dev/null c 1 3 mknod ...
  • 这样我们就不需要在开发板上查看主设备号,然后手动创建设备节点了!在开发板上:ls /sys/class/会看到我们创建的类,ls /sys/class/led_class/会看到我们在类下创建的设备!不过真正的设备节点在/dev目录下面,通过...
  • emmc设备节点创建时间太晚导致启动挂载emmc脚本中判断设备节点不存在挂载失败,后面被hotplug的tf_mount挂载。 分析 1、查看emmc的VCCQ上电时间,经过测量发现上电开机时就被单片机拉上电,这里正常没有问题。 ...
  • 创建设备节点 1.使用mknod手工创建:mknod filename type major minor 2.自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。在驱动用加入对udev 的支持...
  • cat /proc/bus/input/devices
  • 对U盘、SD卡、硬盘、操作的时候,需要对设备热拔插以及设备自动挂载自动卸载进行处理。有些时候我们需要对设备名进行固定,比如:SD卡卡槽1插入的设备固定它的设备名为sd_...udev的详细介绍可以上维基百科查看:ht...
  • 编译工具:source insight 4.0 ...怎样查看系统设备节点,在project window中查找major.h就行 自动创建设备节点的方法 #define MINORBITS20 #define MINORMASK((1U #define MAJOR(dev)((unsigne
  • 字符设备是一种以字节流来存取的设备查看正在使用的设备驱动可用命令:cat /proc/devices;字符设备文件第一个为c开头,可使用命令:ls –l /dev/* 如下图示: 在老版的Linux内核中,注册一个Linux字符设备需要...
  • 第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。 具体udev相关知识这里不详细阐述,可以移步Linux 文件系统与设备文件系统 —— udev 设备...
  • 关于杂项设备 杂项设备(设备号10) 对一部分字符设备的封装,还有一部分不好归类驱动也归到了杂项设备 为什么引入杂项设备 节省主设备号 如果所有的驱动都是用字符设备,那么所有的... 生成设备节点:为了让应用...
  • 1.将串口设备插入USB口,先查看生成的默认设备节点:/dev/ttyUSB0 2.通过指令查看节点的sys信息 udevadm info --attribute-walk --name=/dev/ttyUSB0 3 在/etc/udev/rules.d/下10_a40i_input.rules增加识别规则...
  • 一、列出设备所有属性,用来编写udev规则 # udevadm info -a -n [device name] 将 [device name] 替换为系统...查看video设备节点所有属性 # udevadm info -a -n /dev/video16 root:/ # udevadm info -a -n /de
  • 查看设备树platform总线上的所有节点

    千次阅读 2017-04-27 19:03:07
    #include #include #include #include #include #include #include MODULE_LICENSE("Dual BSD/GPL"); MODULE_DESCRIPTION("a simple driver example!...int showdevice(struct device *devp, void *data)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 897
精华内容 358
关键字:

查看设备节点