linux驱动
酸菜鱼的鱼
Linux rtos 驱动应用开发 本博客主要用于工作学习的总结和备份,欢迎大家留言评论交流,谢谢
展开
-
Android Camera驱动开发入门必备知识
camera驱动开发所需要具备基础知识,如果你还没有了解过camera模块,那么这些基础必备的知识,将会对你比较有用,俗话说“磨刀不误砍柴工”,基本功配置好了,相信你在做camera驱动开发过程中肯定得心应手。1.硬件相关首先,要学会看datasheet,datasheet文档包含了IC芯片的工作原理。在porting驱动之前,你总得了解IC芯片的时序图,传输数据的一些协议接口和时序图,大概有几路电压,GPIO管脚和clk时钟控制之类的吧。其次,driver工程师不需要去专研很深的硬件知识,驱.转载 2020-10-31 22:05:48 · 6415 阅读 · 0 评论 -
树莓派通过配置config.txt文件使用片上外设
config.txt的说明文档:https://www.raspberrypi.org/documentation/configuration/config-txt/README.md树莓派是使用一个配置文件config.txt代替pc机中的BIOS的功能。这个配置文件会在arm_cpu以及Linux初始化之前被GPU读取。如果相对应的外设使用到了gpio接口,那么gpio的引脚复用的功能,可以先通过gpio readall读取相应的引脚的复用信息。以cm3+的40 41两个引脚输出双通道的pwm...翻译 2020-05-16 22:04:00 · 2002 阅读 · 1 评论 -
树莓派(Linux系统)gpio 基于wiringPi输出pwm信号
本文介绍了树莓派的gpio引脚输出pwm波用以控制led灯亮度的方法,使用的是基于树莓派官方系统中自带的wiringPi库函数实现的。转载 2020-05-06 23:07:59 · 2493 阅读 · 0 评论 -
在树莓派(Linux)上使用FTDI的usb转串口芯片ft232两种驱动方式(VCP和D2xx)
FTDI的芯片ft232芯片提供VCP和D2xx两种方式的驱动。目前的树莓派系统中提供的主要还是VCP的驱动方式。但是有的代码是基于D2xx的驱动方式的API编写的,这时候就需要将系统中的VCP驱动方式替换成D2xx的驱动方式。默认情况下是VCP的方式驱动。直接插入USB转接板的现象如下:驱动设备:所以直接将ft232芯片的转接板的usb插入到树莓派,可以查看到如下的设备...原创 2020-04-10 22:35:22 · 9562 阅读 · 0 评论 -
linux中USB鼠标的驱动和应用代码示例
USB驱动的基本注册等操作可以参考:https://blog.csdn.net/u010299133/article/details/103741672USB驱动:参考:https://blog.csdn.net/weixin_30580341/article/details/98156443note:要使用这个请配置这两个选项。需要取消内核中自带的USB驱动。#include ...转载 2019-12-29 22:44:35 · 1057 阅读 · 0 评论 -
linux中USB驱动的注册方式
linux中USB模块的注册方式分为两种:1.按照常规驱动的注册方式注册2.使用内核提供的宏:module_usb_driver注册#if 1 //常规模块注册方式static int __init usb_drv_init(void){ /*3、注册usb_driver驱动*/ usb_register_driver(&usb_driver,THIS_...原创 2019-12-28 10:40:21 · 1394 阅读 · 0 评论 -
树莓派Raspberry PI 编译内核模块(KO)文件
这里需要注意一下,官方的镜像,分为2019-09-26-raspbian-buster,2019-09-26-raspbian-buster-full,2019-09-26-raspbian-buster-lite这三个版本。笔者先用的是lite版本的,但是一直不成功,驱动编译不了,会一直报错,详细如下说明。使用2019-09-26-raspbian-buster-full版本的镜像,能够顺利的编...原创 2019-10-31 19:10:46 · 2872 阅读 · 0 评论 -
基于arm 内核芯片的Linux的WiFi驱动的移植
需求:需要在一块基于arm内核的处理器的Linux系统移植WiFi驱动。先手上有一块开发板,一个360的无线USB 接口的WiFi。1.到这个WiFi的生产厂家的官网或者设备的供应商获取Linux的WiFi驱动源码。2.将驱动复制到Linux系统中解压[root@localhost 360_wifi2]# lsDPO_MT7601U_LinuxSTA_3.0.0.4_2013...原创 2019-07-31 20:57:48 · 1589 阅读 · 0 评论 -
linux内核驱动llseek接口,以及应用层lseek系统调用的介绍
驱动的文件操作 llseek 接口,对应系统调用接口 lseek 函数.如果实现这个接口,驱动中的write,read接口函数也需要考虑文件指针。系统调用接口原型:off_t lseek(int fd, off_t offset, int whence);参数:fd文件描述符号 offset:偏移量,可以正数,也可以负数 whence:移动方式: SEE...原创 2019-08-05 22:20:15 · 2062 阅读 · 0 评论 -
linux驱动模块加载时出现与内核不匹配的问题
参考:https://blog.csdn.net/hbcbgcx/article/details/88194321安装模块时出现:[root@FriendlyARM nfs]# insmod key2.kokey2: version magic '2.6.32.2 mod_unload modversions ARMv4 ' should be '2.6.32.2-FriendlyARM ...转载 2019-08-06 21:27:17 · 3191 阅读 · 0 评论 -
linux内核之tasklet使用
内核微线程 ---- tasklet和工作队列一样,可以用于推后执行的代码。tasklet(小任务)机制是中断处理下半部分最常用的一种方法,其使用也是非常简单的。一个使用tasklet的中断程序首先会通过执行中断处理程序来快速完成上半部分的工作,接着通过调用tasklet使得下半部分的工作得以完成。在中断处理程序中,除了完成对中断的响应等工作,还要调用tasklet。1、 数据结构...原创 2019-08-31 22:05:35 · 4657 阅读 · 0 评论 -
linux设备驱动标准ioctl接口
ioctl的驱动接口一般是作用在一些标准接口无法实现的功能。如和主控芯片链接的很多外设ic,主控对这些芯片的功能设置以及状态的获取等。所以 ioctl 接口可以看成是系统给我们进行功能扩展的的专用接口。系统调用接口原型: int ioctl(int d, int request, ...);这个函数是一个可变参数函数,最少需要2个参数参数:d: 是文件描述符号 reque...原创 2019-08-04 12:41:11 · 833 阅读 · 0 评论 -
Linux内核驱动字符设备-linux 2.6设备驱动模型
和misc杂项设备以及早期经典设备模型比较,有如下的特征:1. 安装后, 不会自动创建/dev/设备文件节点, 需要手动使用 mknod 命令创建。可以使用设备类的方法自动创建设备节点。2. 调用一个 cdev_add 注册后, 指定数量的次号被占用完了。 数量可以自己指定,一个主设备可以使用cdev_add 函数注册多次。3. 设备号使用前需要先申请: register_chrdev_...原创 2019-06-29 16:53:16 · 341 阅读 · 0 评论 -
Linux内核驱动早期经典字符设备模型介绍
早期经典字符设备模型和杂项设备字符模型的最大区别是没有一个核心的结构。并且安装设备驱动后不会像杂项设备那样自动的在dev目录下为app创建设备节点。需要手动的使用mknod创建设备号。设备号:主设备号:0-255(10是给杂项设备使用的)次设备号:0-255 ,当传递255的时候表示的是自动分配次设备号。调用一个 register_chrdev 注册后, 256 个次设备号就都被占...原创 2019-06-29 11:10:05 · 331 阅读 · 0 评论 -
linux内核驱动模型-miscdevice杂项设备驱动模型以及实例
杂项设备模型基本介绍设备号:主设备号:固定是 10次设备号: 0~255, 当传递 255 时候表示自动分配次设备号安装后,可以自动创建/dev/设备文件节点。注册函数: int misc_register(struct miscdevice * misc)头文件: #include <linux/miscdevice.h>功能: 注册一个杂项设备参数: mis...原创 2019-06-28 22:30:44 · 710 阅读 · 0 评论 -
linux内核空间和用户空间的数据交换
在内核驱动代码不能直接使用用户空间的指针来存取数据, 需要通过专用的函数来完成数据的复制。Uaccess.h arch\arm\include\Asm从用户空间读取数据copy_from_user 函数原型:inline unsigned long __must_check copy_from_user (void *to, const void __user *from, unsi...转载 2019-07-03 21:43:42 · 517 阅读 · 0 评论 -
linux内核模块的参数传递
模块安装时候可以给模块中的变量传递数值,安装后,模块中变量的值就是安装时所传入的值 ,没有传递的变量,则使用代码中默认值。带参数的模块安装后会生成目录:/sys/module/模块名/parameters/示例:如果安装 了名字为 hello_model_param 的模块,则会生成/sys/module/hello_model_param/parameters/这个文件夹下会生成...原创 2019-06-26 22:33:02 · 4150 阅读 · 0 评论 -
u-boot启动第二阶段的梳理
u-boot启动第二阶流程梳理:本 阶 段 主 要 有 两 个 核 心 函 数 , 分 别 是 board_init_f( ) 和 board_init_r() , 这 两 个 函 数 都 是 在arch\arm\Lib\Board.c 中。1.board_init_f()1) gd_t 数据结构空间分配2) 回调一组初始化函数3) 对 gd_t 数据结构进行初始化Glob...转载 2019-06-23 11:14:39 · 728 阅读 · 0 评论 -
linux内核驱动中通用GPIO函数使用
ARM体系芯片 IO口实际上是4G内存空间中的一部分地址空间,所以,本质上就是操作内存,它和其他的片上外设没有区别。这类 IO 称为 IO内存。在芯片还有一类称IO端口,这一类要配置就不是通过ioremp这种方式。这种形态IO,一般出现在X86芯片 。实际应用中,IO内存操作可以使用ioremap映射再使用指针操作对应的寄存器,但是比较少使用,一般 使用内核提供GPIO操作函数。内核提供的通用...转载 2019-08-24 18:32:53 · 1667 阅读 · 0 评论 -
linux内核驱动中断编程的接口使用方法
1.中断顶半部,中断底半部分概念中断顶半部:响应中断,启动底半部(作用相当于裸机设置标志 )。 一般用来做响应,以及耗时短的,比较紧急的事件,不太紧急的事件就把它拆出来写在中断底半部。 中断底半部:发生中断时应该执行主体代码。耗时的代码。这部分代码会在适合时候,被内核执行。只要延后...转载 2019-08-24 23:46:26 · 2603 阅读 · 0 评论 -
嵌入式中linux系统对eeprom芯片at24c02的操作实例(包括驱动层和应用层代码)
应用层代码示例/* app.c at24c08读写测试应用程序 */#include <stdio.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> ...转载 2019-09-15 17:32:12 · 1557 阅读 · 0 评论 -
Linux i2c 设备驱动程序框架详解
I2C子系统由上到下分为3层:,这一层需要客户实现。I2C设备驱动层、I2C核心层和I2C适配器驱动层。I2C设备驱动层:真正实现具体设备的时序的代码。使用核心层提供API接口写,有特定编写框架。I2C核心层:由内核提供,代码不用修改,提供了设备驱动层和适配器驱动层需要API接口,以及实现收发数据管理功能。起到一个连接上下两的作用。I2C适配器驱动层:由芯片厂家提供,但需要移植。通...转载 2019-09-11 22:24:22 · 2065 阅读 · 0 评论 -
linux 中input子系统介绍及使用案例
1. input概念linux下可以对输入设备使用普通字符设备驱动模型编写,如果每个设备都需要自己注册杂项设备 自己编写文件操作方法,这会造成代码重复,重复工作很多。比如:写一个程序是鼠标---USB,PS/2 ,触摸板。一个键盘,种类很多,不可能每一个都去写读写接口。内核专门为输入类设备编写一个子系统:Input子系统 (输入子系统)其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬...转载 2019-09-08 15:45:25 · 1339 阅读 · 2 评论 -
linux中在应用层lcd显示的操作
在Linux 系统中LCD的应用程序有特定编写模板。1.打开/dev/fbXfp = open ("/dev/fb0",O_RDWR);2.获取可变参数,固定参数ioctl(fp,FBIOGET_VSCREENINFO,&vinfo) 可变参数ioctl(fp,FBIOGET_FSCREENINFO,&finfo) 固定参数3.内存映射(mmap)...转载 2019-09-07 22:27:35 · 4025 阅读 · 3 评论 -
嵌入式linux开发lcd设备驱动的学习
嵌入式系统中使用的linux OS的话,lcd的开发主要内容就是LCD设备驱动的移植,使用芯片SDK中现有的LCD框架做修改,在linux版本3.10之前没有使用dts和这之后使用的dts,还是有些区别的。主要修改调试的地方如:平台设备文件或者是dts节点内容,这需要根据具体使用的操作系统而定。以完成对LCD的驱动工作。但是在这起之前还是有很多的基本概念需要清楚。以下来自网络。Fram...转载 2019-09-05 21:55:56 · 931 阅读 · 0 评论 -
linux内核信号量和互斥锁使用
信号量概念Linux 内核的信号量在概念和原理上与用户态的 System V 的 IPC 机制信号量是一样的,但是它绝不可能在内核之外使用,因此它与 System V 的 IPC 机制信号量毫不相干。信号量在创建时需要设置一个初始值,表示同时可以有几个任务可以访问该信号量保护的共享资源,初始值为 1 就变成互斥锁(Mutex),即同时只能有一个任务可以访问信号量保护的共享资源。一个任务要想...原创 2019-09-01 11:29:08 · 2117 阅读 · 2 评论 -
linux内核原子操作使用简介
驱动开发住常见的一个问题:就是一个驱动可以被多个进程同时打开,使用,这样会导致驱动功能混乱。./app & ./app & ./app 可以同时打开这个设备,可通过文件描述符调用驱动的其他接口操作这个设备。如果想只一个进程使用这个设备,只需要在open接口函数做打开判断。示例:static int open_flag = 0;//打开设备时候执行的程序sta...原创 2019-09-01 09:09:47 · 2021 阅读 · 1 评论 -
linux内核工作队列以及内核共享延时工作队列以及container_of 宏使用方法
在linux中断编程中,需要中断程序分成中断顶部和中断底部两部分,顶部负责做中断标志,然后耗时的事情在中断底部执行。顶部不能被其他进程中断,而底部可以被其他进程中断,也可以被硬中断事件中断。底部分代码实现可以通过内核共享工作队列实现。1)核心结构Workqueue.h include\Linuxstruct work_struct { atomic_long_t data; ...原创 2019-08-31 21:37:32 · 558 阅读 · 0 评论 -
linux内核中延迟执行的机制之内核定时器介绍
linux 内核定时器、linux 内核共享工作队列、linux 内核tasklet机制以上的3中方法都可以吧工作推后执行。下面介绍linux内核定时器:内核定时器本质是使用一个硬件定时器实现。相当于裸机程序编写的一个定时器中断程序,在中断程序中有一个变量,每进一次中断增加1 。上面所说全局就是就是 jiffies ,这个值从开机开始,一直在变量 。内核定时器定时使用一个结构体表示...原创 2019-08-31 21:09:49 · 755 阅读 · 0 评论 -
linux内核驱动休眠和唤醒机制(select系统调用的内核驱动poll实现)
阻塞与非阻塞的概念:阻塞IO: 当数据不可读或不可写,进程休眠,直到得到数据可读或可写时才返回。阻塞效率高,实时性比较好。非阻塞IO:不管数据是否可读可写,都马上返回。应用程序是否能实现阻塞或非阻塞是取决于驱动程序。实际驱动中应该把阻塞和非阻塞这种选择权交给应用程序来选择。要实现这个效果 ,就必须让驱动程序知道应用程序的选择。这个信息是通过 file 结构来传递的。struct f...转载 2019-08-25 18:44:55 · 2408 阅读 · 0 评论 -
Linux中内核模块的单独编译以及makefile的模板介绍
Linux内核模块在编译的时候可以通过命令编译:make -C 内核源码绝对路径 M=模块源码文件所在的绝对路径 modules 此命令的解释:1)进入到内核源码目录2)读取内核源码目录的Makefile3)执行内核源码Makefile中的 modules 目标4)根据 modules 目标的命令编译M所指向的文件路径 Makefile指定 的 C文件如:ARM板的内核...原创 2019-06-25 22:05:22 · 3776 阅读 · 1 评论 -
基于arm内核芯片的Linux dhcp移植
ARM 开发板网络自动获取IP:1.移植DHCP工具。(1)下载源码:http://gd.tuwien.ac.at/infosys/servers/isc/dhcp/ ,选中dhcp-3.1-history,会进http://gd.tuwien.ac.at/infosys/servers/isc/dhcp/dhcp-3.1-history/这个页面,在这个页面中找到 dhcp-3.1.3...原创 2019-06-11 21:26:41 · 1171 阅读 · 0 评论 -
Linux内核i2c子系统的宏module_i2c_driver详解
在文件/include/linux/i2c.h中:根据解释宏module_i2c_driver可以分解成相应驱动模块的init和exit接口。文件include/linux/device.h中有对module_driver的分解: 综上所述,如果代码中出现 :module_i2c_driver(ov4689_i2c_driver);经过上述宏的作用之后,就成为如下形式...原创 2019-01-24 15:11:32 · 6846 阅读 · 0 评论 -
使用ioremap内核接口时出现的错误assignment makes integer from pointer without a cast [enabled by default],解决方法
使用内核借口ioremap入下:u32BaseAddr0 = ioremap(0x20060000, 0x4000);编译出现入下的编译错误信息: assignment makes integer from pointer without a cast [enabled by default]查看代码发现是因为 u32BaseAddr0 返回值的类型不对,写成了sta...原创 2018-12-19 10:15:36 · 3482 阅读 · 0 评论 -
Linux内核中添加驱动模块到menuconfig中
Linux中驱动模块的加载有两种方法:1.编译成.ko文件在内核启动后,动态的加载到内核中。2.在内核编译的时候同时编译驱动模块。现主要介绍第二种方案:希望将内核驱动加载到内核模块中,需要在menuconfig菜单中选择配置。首先在kernel/drivers/char/目录下新建一个目录用以存放自己驱动模块的源文件。源文件存放好了之后,还需要添加并修改相应的Kconfig和M...原创 2018-12-15 16:24:36 · 2501 阅读 · 0 评论 -
rk3288 SDK概览
瑞芯微的芯片rk3288的SDK的相关内容:解压SDK后,初步看到的文件目录:直接进入Doc目录,先从文档开始:第一个要看的文档,当然是从Doc/目录下的rockchip Linux软件开发指南.pdf开始。此SDK是基于buildroot的软件开发包,包含了基于Linux系统开发用到的驱动,工具和应用等软件包。 ...原创 2018-12-13 19:02:51 · 3482 阅读 · 1 评论 -
基于rv1108的双系统的实现方法
背景:产品需要实现双系统,在开机之前将开关拨到不同的位置,系统启动时在loader阶段就会去检测开关按键的状态,根据按键的状态,去不同的偏移地址加载不同的kernel,并且启动相应的rootfs,实现不同的应用。loader:此阶段需要检测案件的io管脚的状态,涉及到基于rv1108的裸机程序的编写,检测io口的电平的高低。不同的电平,赋予不同的kernel的加载地址。...原创 2019-03-20 19:31:35 · 1544 阅读 · 8 评论 -
Linux中的平台设备驱动模型
在 Linux 的设备驱动模型中,关心总线、设备和驱动这 3 个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。 平台设备匹配的依据是: 1)根据平台设备结构和平台驱动结构中的name成员进行匹配。-- 一个设备对应一个驱动 2)根据平台设备结构中的n...原创 2018-11-11 11:45:48 · 2256 阅读 · 0 评论 -
dtc使用,将dtb文件编译出dts的文件
dtc的使用:将dtb文件编译出dts的文件:dtc -I dtb -O dts kernel/arch/arm/boot/dts/rv1108-evb-v12.dtb -o ../../../share-2018xyw/f08/rv1108-evb-v12-new.dts原创 2018-10-25 16:39:28 · 3055 阅读 · 0 评论 -
boot对Linux内核的启动
boot:读取kernel到内存设置tag参数 kernel:匹配机器id(从R1读出)能否支持该机器单板。调用开发板相关的初始化函数。不同的开发板有不同的板级外设,所以初始化内容就不同。当启动内核时首先从环境变量中读取机器ID,如果没有就使用默认的机器ID。2.读出R2的值(是boot设置的tag参数的首地址),并解析tag参数。3.加载驱动程序。如:flash,emmc...原创 2018-10-28 14:56:48 · 467 阅读 · 0 评论