Linux Device Driver
www.wowothink.com
分享!!!
展开
-
Linux Kernl添加spidev的设备节点
一、spidev介绍如果在内核中配置spidev,会在/dev目录下产生设备节点,通过此节点可以操作挂载在该SPI总线上的设备。用户空间通过该节点可以访问内核空间。二、配置spidev设备步骤在i.MX6,Kernel 4.1.15上配置spidev的支持。1、配置dts支持spi根据spi的连接原理图配置对应的imx6qp-xxx.dts,如:&ecspi1 { compatible =原创 2017-04-26 22:46:43 · 27207 阅读 · 1 评论 -
poll() 的用法
需求在某个xxxservice 里要持续读 /dev/sample_dev 节点。也就是在while循环里面,先poll是否可读,如果可读的话就去调用read,如果不可读的话就继续调用poll,如此循环。但是,如果与 /dev/sample_dev 节点相关的设备已不再提供数据了(比如说设备拔掉)。那么每次调用poll会timeout,如此循环,空耗CPU资源。此时底层驱动可以给应用层返回特定的值告原创 2017-11-25 21:46:32 · 6901 阅读 · 2 评论 -
创建设备节点问题
在原先的文章中将了怎样创建一个设备节点供读写使用,Linux用户空间与内核空间交互方法,现在回过头去看,发现当时很多代码写法都有问题,在此作为一个反面教材来讲一讲。原先代码static int sample_init(void) { /* 初始化 sample_dev 结构体 */ sample_dev = kzalloc(sizeof(struct sample), GFP_原创 2017-11-25 21:29:39 · 1581 阅读 · 0 评论 -
怎么查看调用栈关系
前言最近在学习Linux USB Composite Framework的内容,经常看到函数指针跳转来跳转去。比如说会看到很多结构体中的.bind函数指针,但又不知道他们之间的调用关系。此时,就可以用dump_stack()这个函数来追踪函数调用关系。当然,还是要自己尝试学习理解这个框架结构,不然纯粹的知道函数调用关系意义不大。另外,dump_stack()可用来定位Kernel Panic和Oop原创 2017-08-06 17:59:01 · 3098 阅读 · 1 评论 -
Androidadb的编译配置及常见问题
Androidadb驱动的代码在以下两个文件中实现,这部分的内容属于Linux USB Gadget的范畴了。<Kernel_Dir>/drivers/usb/gadget/androidadb.c<Kernel_Dir>/drivers/usb/gadget/f_adb.c关于Androidadb驱动的实现原理可以参照我的另外一篇文章:应用层的实现代码在以下目录: <Project_Dir>/原创 2017-07-22 23:13:32 · 6513 阅读 · 0 评论 -
Androidadb驱动实现原理
Androidadb的驱动由androidadb.c和f_adb.c实现,androidadb.c的开头会#include “f_adb.c”,最终编译出来的是g_androidadb.ko文件。这里涉及到Linux USB Composite Framework的知识,下次再整理一下这方面的知识。创建struct usb_composite_driverAndroidadb属于USB复合设备,注册原创 2017-07-23 18:36:23 · 4840 阅读 · 3 评论 -
Linux Kernel gpio export功能
一、前言在正常情况下,假设我们在控制usb使能相关gpio脚的时候,代码中通常我们会做如下调用:#define USB_EN_GPIO 11gpio_request(USB_EN_GPIO, "usb_en");gpio_direction_output(USB_EN_GPIO, 1);gpio_export(USB_EN_GPIO, false);上述执行完毕之后就可以给 GPI原创 2017-06-28 23:33:18 · 12745 阅读 · 0 评论 -
全志A31编译环境搭建
平台:全志A31 内核版本:linux-3.3 gcc版本:arm-linux-gnueabi-gcc 4.6.1 操作系统:Ubantu 2.6.32-38-generic项目中需要编译A31平台的驱动并在pad上面运行,运行的环境如上所说的。此处只涉及到内核的编译问题,至于模块的配置以及boot的编译并不在此范围内。全志会提供两个压缩的内核文件,分别为android.tar.gz和lich原创 2015-07-28 18:39:19 · 4562 阅读 · 0 评论 -
MTK平台TP驱动详解
MTK平台tp驱动详解本博文将讲解基于goodix9157触控芯片的tp驱动程序。这里有对应的驱动程序。初始化static int __init tpd_driver_init(void){ GTP_INFO("MediaTek gt91xx touch panel driver init\n");#if defined(TPD_I2C_NUMBER) i2c_register原创 2016-05-10 11:52:58 · 19123 阅读 · 4 评论 -
全志平台TP驱动
全志各平台的TP驱动移植可以参照全志A20平台CTP模块开发说明文档V2.0-20130628.pdf其中全志平台编译环境的搭建可以参照此为全志A31编译环境搭建原创 2016-06-14 20:39:59 · 4571 阅读 · 0 评论 -
Rockchip平台TP驱动详解
本文描述在RK3126平台上添加一个新的TP驱动(gslx680驱动)以及详细的驱动代码信息。修改dts,添加新的i2c设备。在 arch/arm/boot/dts/rk312x-sdk-v2.2.dtsi中添加i2c设备的相关信息:ts@40 { compatible = "gslX680"; reg = <0x40>; wake-gpio = <&原创 2016-06-15 16:10:26 · 13721 阅读 · 6 评论 -
Linux i2c子系统
一、前言因为自己在研发过程中经常要涉及到tp驱动程序,而tp驱动就涉及到i2c驱动。经常可以看到在驱动程序中会定义一个struct i2c_driver的数据结构,并实现里面的某些成员,比如probe、resume、suspend、remove、id_table,之后会在module_init()中调用i2c_add_driver()添加这个驱动。比如说像下面这个样子:static const st原创 2016-06-20 20:44:07 · 5178 阅读 · 1 评论 -
调试tp驱动常用的adb命令
1、adb shell cat /proc/kmsg这条命令肯定是要放在第一位的,可以打印内核信息,对应于驱动程序中的printk语句。 如果出现以下提示,说明权限不够,可以通过adb root获取root权限。 /system/bin/sh: cat: /proc/kmsg: Permission denied另外,也可以将kmsg的内容重定向写入一个log文件中。可以依次执行下面命令原创 2016-08-16 11:40:38 · 14763 阅读 · 1 评论 -
Linux 查看usb设备信息
下面的信息都是在VMware中运行Ubuntu12-04系统上执行的。同样该命令也支持在嵌入式系统中进行调试USB。一、cat设备节点获取信息在一些嵌入式开发中需要调试USB功能,经常会cat /sys 下的相关设备节点来查看某些信息,比如说我们可以进入 /sys/bus/usb/devices 目录下可以看到以下目录。进入到对应的目录也可以看到usb设备更加详细的信息(可以理解为设备描述符)。1、原创 2016-12-15 23:49:13 · 59119 阅读 · 0 评论 -
Linux 驱动常见错误返回值
在Linux驱动开发中,经常要根据返回值来判断何种错误。现将常见的错误编号列举如下。errno-base.h// include/uapi/asm-generic/errno-base.h#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /* No such file or directory原创 2016-12-15 23:58:10 · 5346 阅读 · 0 评论 -
Linux GPIO驱动结构
GPIO驱动结构 根据上图,在Linux中,会在gpiolib.c中定义一个 ARCH_NR_GPIOS 大小的数组static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];。每个元素对应于当前CPU上各个GPIO接口的信息,记录各个GPIO的描述符,即对应struct gpio_desc结构体。struct gpio_desc内的成员gpio_chip又指原创 2016-12-31 15:30:39 · 10693 阅读 · 2 评论 -
ioremap_nocache() 函数的使用
本篇文章主要是在ioremap_nocache函数说明的基础上进行整理,加入该函数的用法简介。函数原型void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);/* * ioremap - map bus memory into CPU space * @offset: bus addr原创 2017-01-31 11:03:35 · 18058 阅读 · 0 评论 -
Linux用户空间与内核空间交互方法
用户空间通常是打开某一特定的设备节点,然后通过write()/read()/ioctl()方法向内核空间进行数据的交换。这里主要使用两种方法实现。 1、sysfs文件系统; 2、在 /dev 目录下创建设备节点;一、sysfs介绍在 documentation/filesystems/sysfs.txt 对sysfs的介绍中,一上来就说: sysfs is a ram-base原创 2017-03-31 23:00:05 · 6746 阅读 · 0 评论