当前位置:   article > 正文

linux字符设备学习笔记(五)

linux字符设备学习笔记(五)

1.sizeof()strlen()

char buf[100] = "hello";
write(fd,buf,sizeof(buf));//代表写入了100个字节,但是我们实际上是想只写hello,
//这时就应该是
write(fd,buf,strlen(buf));//这样就是只写入hello
  • 1
  • 2
  • 3
  • 4

2.设备号的静态申请和动态申请

cat /proc/devices查看已有设备
静态申请:register_chrdev_region
可能出现该设备号被占用,注册失败
动态申请:alloc_chrdev_region
自动分配设备号

3.动态分配设备号

int alloc_chrdev_region(dev_t* dev,unsigned,unsigned,const char *)
  • 1

参数1:会自动将分配的设备号村放入第一个参数所指向的地方;
参数2:表示次设备号的起点
参数3:设备的个数
参数4:设备名,也就是在/proc/devices中显示的名字

#include<linux/modules.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/fs.h>
#include<linux/cdev.h>

static int char_major; //主设备号
static int char_minor;//次设备号的起点
static number_of_devices =1;//设备个数
 
static _init char_init(int)
{
	dev_t dev;
	//获取到的设备号存放在dev中
	alloc_chrdev_region(&dev,char_minior,number_of_devices,"char");
	char_major = MAJOR(dev); //提取主设备号
	return 0;
}
static void _exit char_exit(void)
{
	dev_t dev = MKDEV(char_major,char_minor);
	unregister_chrdev_region(dev,number_of_devices);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

4.ioctl

除了常规的读写以外,还有一些特殊的操作,ioctl就是主要用于文件的特殊读写。特殊操作比如:光驱:有弹出光盘,串口:要设置波特率,这个靠read/write无法完成。一般使用ioctl。

    应用程序中使用ioctl

    int ioctl(int fd,int request,....)//参数1:文件描述符;参数2:对该文件(设备)进行何种操作,不同的设备有不同的操作。
    
    • 1

    在这里插入图片描述

        #include <sys/types.h>
        #include <sys/stst.h>
        #include <unistd.h>
        #include <fcntl.h>
        #include <sys/ioctl.h>
        #include <stdio.h>
        #include <string.h>
        #include <char.h>
    int main()
    {
    	int fd = open("/dev/hello",O_RDWR);
    	//可以用ioctl对设备进行特殊操作
    	ioctl(fd,CHAR_ONE);//对设备进行CHAR_ONE操作
    	inctl(fd,CHAR_TWO);//对设备进行CHAR_TWO操作
    	close(fd);
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    内核中的ioctl

    struct file_operations fops = {
    ....
    unlocked_ioctl = char_ioctl;
    ....
    }
    ```c
    long char_ioctl(struct file *file,unsigned int cmd,unsigned long arg)
    {
    	int ret = 0;
    	switch(cmd)
    	case CHAR_ONE:
    		printk(KERN_INFO"char_one\n");
    		break;
    	case CHAR_TWO:
    		printk(KERN_INFO"char_two\n");
    		break;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    驱动文件和应用文件共用的头文件

    #idndef _CHAR_H_
    #define _CHAR_H_
    
    #define CAHR_ONE 0;
    #define CAHR_TWO 1;
    
    #endif  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    创建一个字符设备

    mknod  /dev/hello c 250 0
    
    • 1

    结果
    在这里插入图片描述

    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/901655
    推荐阅读
    相关标签
      

    闽ICP备14008679号