嵌入式开发完整体系课程(含项目) 扫二维码继续学习 二维码时效为半小时

(170评价)
价格: 598.00元

释放设备号

unregister _chrdev_region

linux字符设备驱动的四个重要的数据结构

struct file

描述文件打开以后的状态属性

open打开成功内核创建

close关闭内核销毁

int (*release) (struct inode *, struct file *); 

struct inode

描述一个文件的物理属性

文件存在,内核创建 

文件销毁,内核销毁对应的inode

dev_t   i_rdev存放设备号

struct  cdev  *i_cedv

表示一个字符设备驱动

const struct file_operations *ops

dev_t dev

一个文件只有一个inode,可以有多个file

struct file如何找到cdev中的file_operation

应用程序调用open,最终调用sys_open

sys_open创建file结构体,描述文件的打开信息

通过主设备号找到对应的cdev

将cdev中的file_operations成员赋值给file中的file_operations成员

分配初始化文件操作集

cdev_init(&cdd_cev,&cdd_fops);

将cdev添加到内核

cdev_add(&cdd_cdev,设备号,设备个数)

[展开全文]
余嘉俊STB · 2017-03-07 · 0

Linux设备驱动分类

字符设备

按字节流访问,能够顺序访问,也能够指定位置访问

块设备

Unix系统下,块设备按一定的数据块进行访问,数据块为512bytes,1k

Linux下,快设备既可以按数据块的方式访问,也可以按字节流访问

数据结构和操作方法不一样

应用程序通过设备文件找到对应的硬件驱动

主设备号相同使用同一个驱动

次设备号用于找到具体要访问的设备个体

dev_t32位保存设备号

设备号操作宏

MAJOR

MINOR

MKDEV

设备号属于系统资源

实现驱动和设备号的绑定,首先必须向内核申请设备号资源

静态分配

查看主设备号是否被使用

cat /proc/devices

内核同意驱动申请设备号

次设备号区分同类型的具体设备

调用register_chardev_region向内核申请

[展开全文]
余嘉俊STB · 2017-03-06 · 0

一、申请GPIO资源

gpio_requst();

二、释放

gpio_free();

三、LED的设置

gpio_direction_output() //默认高电平

s3c_gpio_setpull() //s3x_gpio_pull_none 禁止上下拉

gpio_set_voule()//设置亮灭

ioctl函数来控制

[展开全文]
zune · 2016-11-28 · 0

流程:

1.申请一个设备号之后

实例化一个cdev结构,file_operations结构里面的成员都要去单独的编写功能

2.cedv_init初始化

3.cdev_add 添加

 

4.注销:unregster_chrdev_region

5.创建设备文件

静态 mknod cdd c 251 0

 

[展开全文]
zune · 2016-11-28 · 0

一、动态分配设备号:

调用alloc_chardev_rigoon();

二、数据结构

1.struct file

2.file_operations

3.struct inode 文件信息的物理结构

4.struct cdev  字符设备驱动

[展开全文]
zune · 2016-11-28 · 0

一、linux设备驱动分类

1、字符设备:按字节流访问,能够顺序访问,也能够指定位置访问

2、块设备

在unix中,块设备按一定的数据块进行访问,数据块为512bytes、1k等

在Linux中,块设备即可以按数据块的方式访问,也可以按字节流访问,它与字符设备的区别是数据结构和操作方法的不同

 

二、字符设备驱动

1、驱动程序的作用:

A.管理对应的硬件

B.给用户提供访问硬件的操作的接口

2.应用程序通过系统调用/dev/下的设备文件来访问硬件

3.主设备号使用时需要向内核申请,有静态(cat  /proc/devices查看)和动态分配。

调用register_chrdev_region向内核申请

 

[展开全文]
zune · 2016-11-28 · 0

一、linux内核模块编程特点:

1.不能使用C库和C标准头文件

2.必须使用GNU规范

3.不能处理浮点运算

4.注意同步和并发的问题(资源有限)

5.注意可移植性

 

二、加载函数固定的格式:

int xx(void)

{

return 0;//成功

return -1 //失败

}

 

三、卸载函数固定的格式:

void yy(void)

{

}

另外:要使用module_init(xx)和module_exit(yy)来修饰加载和卸载函数

 

四、Makefile的编写:

//1.内核的路径

KERNELDIR ?=/内核路径

//

obj-m += hello.o

 

 //3.使用内核中的MAKE -C路径 M=(编译的路径) modules命令

defule:

$(MAKE) -C $(KENELDIR) M=(pwd) modules

五、添加GPL开源

MODULE_LICENSE("GPL v2");

[展开全文]
zune · 2016-11-28 · 0

struct net_device *virnet_card = NULL;

init __init virnet_init(void)

{

//申请net_device

virnet_card = alloc_etherdev(0);

 

}

[展开全文]
吃星星的老妖 · 2016-10-08 · 0

等待队列头

1.数据结构:wait_queue_head_t

2.存放休眠的进程

等待队列:

数据类型 wait_queue_t

 

[展开全文]
张振东 · 2016-10-04 · 0

C库open将open对应的系统调用号保存到寄存器中

open的实现会调用软中断swi(svc)触发一个软中断异常

进程跳转到内核实现定义的一个位置

vector_swi会根据系统调用号,在系统预先定义的一个系统调用表中找到open函数对应的内核实现sys_open

arch/arm/kernel/sys_arm.c添加系统调用内核实现

arch/arm/inluce/asm/unistd.h添加系统调用号

arch/arm/kernel/calls.S系统调用表添加新条项

syscall

[展开全文]
余嘉俊STB · 2016-09-25 · 0

sys/module/模块名/paramters

模块参数文件

模块依赖

内核符号表

导出符号

modprobe检查依赖信息

[展开全文]
余嘉俊STB · 2016-09-25 · 0

模块安装

模块加载

printk输出级别必须大于内核的输出级别

无法修改内核启动时的输出信息

通过uboot的环境变量bootargs传递打印级别的参数 debug级别10 quiet级别4 loglevel指定级别

内核模块参数

module_param

module_param_array

文件权限linux/stat.h

[展开全文]
余嘉俊STB · 2016-09-22 · 0

编译进内核

编译成模块(linux2.6版本)

动态加载/卸载

内核编译方法

modprobe加载模块

modinfo

需要模块信息文件的支持modules.dep

modprobe还会检查模块的依赖,自动加载依赖的模块

[展开全文]
余嘉俊STB · 2016-09-20 · 0

OPEN→sys_open(创建file结构体)

主设备号→cdev

cdev.file_operations 复制给file.file_operations

 

[展开全文]
梁永欣STB · 2016-07-06 · 0

内核设备-总线-驱动模型

[展开全文]
ccc515 · 2016-03-25 · 0