字符设备驱动函数解析(学习总结)

makefile
obj -m
表示一个模块
obj -y
表示编译进内核

 

在学习驱动设备的时候,虽然各个模块知道大体是什么意思,但是具体到各个功能模块函数里面的一些定义,就感觉有些头疼

dev_t devno = MKDEV(mem_major, 0)

dev_t 是设备这种类型
MEDEV
是宏构造主次设备号

静态分配 if(mem_major)为大于0
如果mem_major==0则动态分配

静态分配:
使用register_chrdev_region函数

动态分配:
由内核去找设备号
使用alloc_chrdev_region分配设备号

缺点:无法再安装驱动前创建设备文件。

注销设备号:
使用函数:unregister_chrdev_region

手动创建

mknod  filename typle major minor

设备文件起桥梁的作用譬如read的时候传达给驱动程序
驱动程序再执行到硬件中然后返回到设备文件中。

liNUX字符设备驱动设计中有三种很重要的数据结构
struct file:
代表一个打开的文件。系统中每个打开的文件在内核空间中都有一个关联的
stuct file.
struct inode:用来记录文件的物理信息。
struct file_operations:
由函数指针构成。
右边是函数指针=左边函数名字。
找驱动函数去执行。绑着驱动程序。

2.6内核中字符设备用struct cdev来描叙。其注册分三步:
分配cdev初始化cdev添加cdev

分配使用cdev_alloc函数:
初始化使用cdev_init函数:
添加使用 cdev_add函数:

完成驱动程序的注册后下一步 file_operation的函数需要我们去实现。

 open方法:打开
 read write:
读和写都完成类似的工作:从设备中读取数据到用户空间;
将数据传递给驱动程序。

size_t loff_t char_user 都是类型。


read
write方法的buff  参数是用户空间指针,因此它都不能被内核代码直接引用:
用户空间指针在内核空间时可能根本是无效的没有那个地址映射。
内核提供了专门的函数访问用户空间的指针:

copy_from_user  copy_to_user两个函数。我们的read write是站在用户的角度来看的
用户需要读则要到用户。分析数据的流向。

字符设备的注销 cdev_del函数来完成。


设备号作用:主设备号用来标识与设备文件相连的驱动程序;
           
次设备号被驱动程序用来辨别操作哪个设备。
           
主设备号用来反映设备类型次设备号用来区分同类型的设备。

内核中如何描述设备号:
dev_t
实质为unsigned int32 位整数高12位为主设备号低20位为此设备号
如何从dev_t中分解出主次设备号:
MAJOR(dev_t dev)
MINOR(dev_t dev)

 

mem_fops是操作里的 file_option
设备号》初始化》字符设备注册三步(直接定义的就需要分配)

为设备分配内存:
为设备描述结构分配内存:

 

反汇编(转成汇编语言)工具
       arm-linux-dump -D -S hello >log(
输入到log)


ELF
文件查看器
arm-linux-readelf  -d hello

内核中##表示连接的作用
  hello(name)   _NR_##name 
如果前面hello(name)nameread则后面name也取read

BOOTLOADER移植
流程两个阶段:
阶段1:硬件的初始化(CPU内部的寄存器内存)
     
为加载2阶段准备RAM空间
     
拷贝BOOTLOADERstage2RAM
     
设置好堆栈(原因:因为第二阶段C也需要堆栈,局部变量需要用到堆栈)
     
跳转到stage2C入口点(第二阶段是C语言第一阶段汇编语言)


 
第一阶段运行在FLASH中第二阶段运行在内存中

阶段2
      
硬件(串口网卡等)初始化
      
将内核映像和根文件系统从FLASH读到RAM
      
调用内核

 自动创建设备文件:

在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用 class_device_create创建对应的设备。大致用法如下:
struct class *myclass = class_create(THIS_MODULE, “my_device_driver”);
class_device_create(myclass, NULL, MKDEV(major_num, 0), NULL, “my_device”);
这样的module被加载时udev daemon就会自动在/dev下创建my_device设备文件。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值