linux设备驱动
文章平均质量分 66
DyLan985
想在IT方面做点事,希望志同道合的朋友多多交流和指点
展开
-
《UNIX环境高级编程》笔记--read函数,write函数,lseek函数
1.read函数调用read函数从文件去读数据,函数定义如下:[cpp] view plaincopyprint?#include ssize_t read(int filedes, void* buff, size_t nbytes); #include ssize_t read(int filedes, void* buff, size_转载 2014-03-21 16:38:19 · 1068 阅读 · 0 评论 -
linux device drive 第六章代码示例-scullpipe的实验(poll和fasync方法的实现)之二
一 测试程序头文件 scull.h#include /* needed for the _IOW etc stuff used later *//* * Ioctl definitions *//* Use 'k' as magic number */#define SCULL_IOC_MAGIC 'k'/* Please use a different 8-bit numb原创 2012-11-23 21:16:58 · 1424 阅读 · 0 评论 -
linux device drive 第六章代码示例-scullpipe的实验(poll和fasync方法的实现)之一
一 scullpipe的代码 1 scull.h #ifndef _SCULL_H_#define _SCULL_H_#include /* needed for the _IOW etc stuff used later *//* * Macros to help debugging */#undef PDEBUG /* undef原创 2012-11-23 21:12:59 · 1848 阅读 · 0 评论 -
printk及控制台的日志级别
函数printk的使用方法和printf相似,用于内核打印消息。printk根据日志级别(loglevel)对消息进行分类。日志级别用宏定义,日志级别宏展开为一个字符串,在编译时由预处理器将它和消息文本拼接成一个字符串,因此printk 函数中日志级别宏和格式字符串间不能有逗号。下面是两个printk的例子,一个用于打印调试信息,另一个用于打印临界条件信息。printk(KER原创 2012-11-23 20:26:02 · 2786 阅读 · 0 评论 -
LDD3源码分析之llseek分析
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz编译环境:Ubuntu 10.10内核版本:2.6.32-38-generic-paeLDD3源码路径:examples/scull/main.c本文分析LDD3第6章的llseek函数。 一、用户空间的lseek函数要理解驱动中llseek函数的实现,必须先清转载 2012-11-18 21:34:39 · 545 阅读 · 0 评论 -
S3C2440看门狗定时器
看门狗定时器的主要作用是在程序因为干扰而跑飞后,能够使系统复位,不至于使系统永远的死下去。它的原理与一般的定时器没有多大区别,就是先要设置好一段时间,当超过这段时间后,就从当前运行的程序中跳出进入中断处理程序中。但两者的主要差别是,一般的定时器中断是我们希望它发生的,因此我们不会在定时器中断发生前的那个时间段内干预它;而看门狗定时器中断是我们不希望它发生的,因此我们要想方设法地避免其发生。主要的方转载 2012-11-13 21:24:01 · 652 阅读 · 0 评论 -
芯片驱动问题定位思路总结之一单板重启的问题
1 可能出现原因: a 对中断处理过程没有处理好,比如:有些场景没有及时开中断,异常嵌套中断等。 b 对空地址进行读写操作。 c 初始化的情况下硬件没有及时进行复位操作。 d 没有及时喂狗,造成看门狗超时重启。 2 定位思路: a 二分法运用。首先区分是硬件出问题还是软件出问题,对待软件原创 2012-11-09 22:15:55 · 1370 阅读 · 0 评论 -
Linux驱动程序中比较重要的宏
MODULE_DEVICE_TABLE (usb, skel_table); 该宏生成一个名为__mod_pci_device_table的局部变量,该变量指向第二个参数内核构建时,depmod程序会在所有模块中搜索符号__mod_pci_device_table,把数据(设备列表)从模块中抽出,添加到映射文件/lib/modules/KERNEL_VERSION/module转载 2012-11-03 06:46:02 · 703 阅读 · 0 评论 -
linux加载驱动的两种makefile文件
加载驱动过程中,需要个Makefile文件来完成编译的命令。自己经常把把Makefile里面的命令搞混,这次,专门的研究了一下Makefile文件里面的东东,特写出来和大家分享一下一 一个简单的驱动程序例子: /*====================================================================== A kernel modu原创 2012-10-13 08:19:06 · 976 阅读 · 0 评论 -
linux设备驱动之时间,延迟及延缓操作(实践)
一 jit.函数源码/* * jit.c -- the just-in-time module * * Copyright (C) 2001,2003 Alessandro Rubini and Jonathan Corbet * Copyright (C) 2001,2003 O'Reilly & Associates * * The source code in this fi原创 2012-03-21 17:23:17 · 798 阅读 · 0 评论 -
编译LDD第三版中scullc代码时遇到的问题及解决方法
最近在学习Linux driver,按照LDD第三版书附赠的一些源代码在自己的机器上编译,由于自己的Linux系统是2.6.35的内核,而LDD书中附的代码是基于2.6.10版的,因此难免会出现一些问题,下面就是我在编译scullc代码中出现的问题和解决方法。 编译中即有error也有warning,我这里先处理error 1. *** CFLAGS was chan转载 2012-03-21 09:54:11 · 790 阅读 · 0 评论 -
linux device drive 第六章代码示例-scullpipe的实验(poll和fasync方法的实现)之三
实验测试结果[Tekkaman2440@SBC2440V4]#cd /lib/modules/[Tekkaman2440@SBC2440V4]#insmod pipe.ko[Tekkaman2440@SBC2440V4]#cat /proc/devicesCharacter devices: 1 mem 2 pty 3 ttyp 4 /dev/vc/0 4 tty原创 2012-11-23 21:17:54 · 1157 阅读 · 0 评论 -
Linux查看硬件信息及驱动设备
查看板卡信息:cat /proc/pci查看PCI信息:lspci (相比cat /proc/pci更直观)查看内存信息:cat /proc/meminfo查看USB设备:cat /proc/bus/usb/devices查看键盘和鼠标:cat /proc/bus/input/devices查看系统硬盘信息和使用情况:fdisk & disk - l & df查看各设备的中转载 2012-12-21 22:46:04 · 1115 阅读 · 0 评论 -
linux常用查看硬件设备信息命令
# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostname # 查看计算机名# lspci -tv # 列出所有PCI设备# lsusb -t转载 2014-02-28 20:36:48 · 954 阅读 · 0 评论 -
linux rtc驱动
Linux的RTC驱动相对还是比较简单的,可以将它作为一个普通的字符型设备,或者一个misc设备,也可以是一个平台设备,这都没有关系,主要还是对rtc_ops这个文件操作结构体中的成员填充,这里主要涉及到两个方面比较重要: 1. 在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。当Linu转载 2014-02-25 17:15:10 · 1342 阅读 · 0 评论 -
深入理解linux网络技术内幕--通知链
一 通知链概述: 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。通知链表是一个函数链表,链表上的每一个节点都注册了一个函数。当某个事情发生时,链表上所有节点对应的函数就会原创 2014-02-24 20:11:02 · 1833 阅读 · 1 评论 -
linux网络学习之分配net_device结构体
一 网络设备利用net_device结构体来定义,该结构体定义在头函数:kernel/linux/netdevice.h,该结构体的使用函数定义在函数:kernel/net/core/dev.c中: 该结构体是有函数:alloc_netdev_mps进行分配。二 alloc_netdev_mps函数解析: 1 函数原型:struct net_device *alloc原创 2014-02-24 08:54:04 · 6283 阅读 · 1 评论 -
linux下PCI设备驱动程序之注册详解
一 识别方式: 天朝为了方便每个人的管理,搞了一套身份识别的玩意(档案和身份证)。kernel本省就像一个社会,每个进来的设备必须要有它独特的名字和一些档案。这个工作对PCI来说,它是由pci_device_id这个结构体来进行身份信息保存的: 17 struct pci_device_id { 18 __u32 vendor, device; /* Vend原创 2014-02-22 13:33:22 · 3860 阅读 · 0 评论 -
linux的poll机制
Poll就是监控文件是否可读的一种机制,作用与select一样。应用程序的调用函数如下:int poll(struct pollfd *fds,nfds_t nfds, int timeout);Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,然后再来判断是否有文件可读转载 2013-12-09 08:26:45 · 1708 阅读 · 0 评论 -
内核宏ALIGN的含义
在linux2.6.30.4中,在include/linux/kernel.h文件中,ALIGN宏的定义如下:[cpp] view plaincopyprint?#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) #define __ALIGN_MASK(x,mask) (((x)+(mask转载 2013-10-24 13:49:33 · 1152 阅读 · 0 评论 -
深入linux设备驱动程序内核机制(第八章) 读书笔记
第八章 时间管理 驱动对时间进行操作, 典型的可以分为两大类:延时与定时. 前者是两个连续的动作A与B之间插入一段时间空 白, 即在A执行后需要等待若干时间才能执行B, 这段时间空白内, 处理哭也许是进入忙等待, 也许是切换到一 个新进程上. 后者是在一个指定的时间点到后执行某此动作, 轮询是最典型的应用. 欢迎转载本文, 请标明出处 本文转载 2013-09-29 08:18:32 · 778 阅读 · 0 评论 -
用函数printk打印内核信息的方法
Linux内核用函数printk打印调试信息,该函数的用法与C库打印函数printf格式类似,但在内核使用。用户可在内核代码中的某位置加入函数printk,直接把所关心的信息打打印到屏幕上或日志文件中。函数printk根据日志级别(loglevel)对调试信息进行分类。日志级别用宏定义,展开为一个字符串,在编译时由预处理器将它和消息文本拼接成一个字符串,因此函数printk中的日志级别和格原创 2013-05-04 22:12:04 · 1736 阅读 · 0 评论 -
Linux驱动加载实例
日志也是用户应该注意的地方之一。不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生的各种各样的事件。用户可以通过日志文件检查错误产生的原因,或者在受到攻击和黑客入侵时追踪攻击者的踪迹。日志的两个比较重要的作用是:审核和监测。配置好的Linux的日志非常强大。对于Linux系统而言,所有的日志文件都在/var/log下。默认情况下,Linux的日志文件已经足够强大,但没有记录转载 2012-12-21 23:30:16 · 807 阅读 · 0 评论 -
error: 'TASK_INTERRUPTIBLE' undeclared (first use in this function)
make -C /opt/FriendlyARM/linux-2.6.32.2 M=/opt/FriendlyARM/linux-arm-modules/plat_buttons modules make[1]: Entering directory `/opt/FriendlyARM/linux-2.6.32.2' CC [M] /opt/FriendlyARM/linux-arm-原创 2012-03-21 09:51:58 · 8316 阅读 · 0 评论 -
linux内核开发--LDD3 scull错误集合,内核版本迁移清单
由于linux内核版本的升级,往往会让能在老版本内核上编译通过的驱动程序移植到新版本内核中出现各种编译和链接错误,这里就将我遇到的一些问题做个整理,让后续开发更流畅^_^!当前内核版本为3.2.41.make[1]: Entering directory `/usr/src/linux-***' scripts/Makefile.build:49: *** CFLAGS was c原创 2012-03-19 18:31:27 · 756 阅读 · 0 评论 -
Linux中与驱动相关的ioctl函数
一: ioctl函数的作用 ioctl用于向设备发控制和配置命令 ,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据。也就是说,read/write读写的数据是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息 ,其中的数据是辅助的数据。 ioctl是设备驱动程序中对设备的I/O通道转载 2012-03-17 10:50:02 · 903 阅读 · 0 评论 -
linux串口驱动分析
linux串口驱动分析硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行I/O(SIO)端口,每个端口都可以在中断模式或 DMA 模式下操作。UART 使用系统时钟可以支持最高 115.2Kbps 的波特率。每个UART 通道对于接收器和发送器包括了 2 个 64 位的 FIFO。寄存器名原创 2012-01-09 19:55:34 · 2684 阅读 · 1 评论 -
嵌入式Linux下的LCD驱动程序设计与实现
随着嵌入式Linux的迅速发展,由于其没有昂贵的版权费,完全开放源代码,可裁减性与可移植性,因此是开发嵌入式产品的优秀操作系统平台。设备驱动程序是Linux内核的重要组成部分,运行在Linux内核底层,在内核源代码中占较大比例,驱动程序开发逐渐成为嵌入式软件开发中一项重要工作。应项目设计的需要完成了嵌入式Linux下的LCD驱动程序设计。1 Linux下设备驱动程序驱动程序从字面上可以原创 2012-01-09 16:10:00 · 1313 阅读 · 1 评论 -
高级字符驱动程序操作之异步通知IO(实践篇)基于内核2.6.35-30
1. async.c 主要展示异步通知机制在驱动程序中的实现#include #include #include /* everything... */#include /* size_t */#include #include #include /* copy user */#include /* POLL_IN */#inclu原创 2011-12-26 15:11:38 · 898 阅读 · 0 评论 -
Scull在2.6.35-30内核中的编译解决方案
LDD3作为从事驱动开发工作人员的必要参考资料,认真研究书中的附带源码具有很高的参考价值,但由于代码基于2.6.10内核,部分内核API较老,导致在2.6.35-30等较新内核上编译不能通过,由于工作需要,特花了一段时间进行整理,本篇文章对示例源码中的第一个驱动程序SCULL进行整理,供各位同仁参考:1、修改Makefile的第24行: 如果是基于PC,则KER原创 2011-12-26 14:03:35 · 1006 阅读 · 0 评论 -
linux驱动程序开发上面例子pipe.c不能在内核2.6.35加载的原因
caoyin-Lenovo:~/LDD/6$make出现下列错误> drivers/char/rtc.c:271:error: 'TASK_INTERRUPTIBLE'undeclared (first use in this function)> drivers/char/rtc.c:271: error: (Each undeclared identifie原创 2011-12-26 12:13:17 · 1527 阅读 · 0 评论 -
并发和竞态(理论篇)
1. 信号量信号量是为了解决共享资源问题而生的,通过著名的P/V操作可以获取和释放信号量,只有获得信号量的线程才可以访问共享资源,从而防止竞态的发生。其中P操作有三种情况:void down(struct semaphore *sem); // 如果信号量可以获得,信号量减一; 如果信号量不可以获得则阻塞进程并不可中断int down_interruptible(struct se转载 2011-12-26 07:49:39 · 438 阅读 · 0 评论 -
并发和竞态(实践篇)
1. complete.c 只是一个简单的字符驱动,但是我加进去了completion来同步读写操作#include #include #include /* everything... */#include /* size_t */#include #include MODULE_AUTHOR("victorsummer");MODULE_LICENSE("D转载 2011-12-26 08:44:45 · 448 阅读 · 0 评论 -
字符设备驱动程序(理论篇)
1. 设备编号 "主设备号标识设备对应的驱动程序" 而 "次设备号用于正确确定设备文件所指的设备"(LDD3 p48)也就是说:主设备号对应驱动程序;次设备号对应使用同个驱动程序的设备;一般一个驱动程序可以被多个设备共享 一个主设备号和一个次设备号 合在一起 可以唯一确定一个设备文件,Linux内核使用一个叫做dev_t的类型来保存主设备号和次设备号,我们称dev_t类型的数据转载 2011-12-21 14:29:35 · 765 阅读 · 0 评论 -
高级字符驱动程序操作之休眠(理论篇)
1. 休眠的原则 第一条: "永远不要在原子上下文中进入休眠" (LDD3 p149)第二条: 当线程被唤醒时,应当检查等待的条件是否为真第三条: 确保即将休眠的线程一定会被唤醒 2. 简单休眠 wait_event(queue, condition) // 不可中断的休眠,不符合休眠的原则(第一条)不推荐wait_event_interruptible(que原创 2012-02-08 16:53:31 · 1325 阅读 · 1 评论 -
signal_pending(current)用法
signal_pending(current)检查当前进程是否有信号处理,返回不为0表示有信号需要处理。返回 -ERESTARTSYS 表示信号函数处理完毕后重新执行信号函数前的某个系统调用。也就是说,如果信号函数前有发生系统调用,在调度信号处理函数之前,内核会检查系统调用的返回值,看看是不是因为这个信号而中断了系统调用.如果返回值-ERESTARTSYS,并且当前调度的信号具备-ER原创 2012-02-23 11:19:04 · 2051 阅读 · 0 评论 -
linux驱动中的ioctl函数
我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl, 所以就规定了我们讨论的范围。为什么要写篇文章呢,是因为我前一阵子被ioctl给搞混 了,这几天才弄明白它,于是在这里清理一下头脑。 一、 什么是ioctl。 ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道转载 2012-03-17 10:48:21 · 626 阅读 · 0 评论 -
构造和运行模块
#include #include MODULE_LICENSE("Dual BSD/GPL"); // 如果没有这行,编译器会产生抱怨static int hello_init(void){ printk(KERN_ALERT "Hello, Linux driver!"); return 0;}static void hello_exit(vo原创 2012-03-16 16:30:21 · 674 阅读 · 0 评论 -
Linux字符设备驱动程序实例
一.编译UBUNTU内核 我是通过UBUNTU11.10测试该驱动程序的,系统内核为linux-3.0.0(可使用uname -r 命令来查看当前内核的版本号) 下载安装LINUX内核,需要下载和本机一样版本的内核源码。 1,安装编译内核所需要的软件并编译内核(注:我在root下执行,如果其中有问题,换到普通用户下用sudo试试) apt-get install build原创 2012-03-13 18:07:47 · 1912 阅读 · 0 评论 -
Linux下的C编程实战(五) ――驱动程序设计
1.引言设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能:(1)初始化设备;(2)提供各类设备服务;(3)负责内核和设备之间的数据交换;(4)检测和处理设备工作过程中出现的错误。妙不可言的是,Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得Windows的设备操作犹转载 2012-02-21 10:01:25 · 768 阅读 · 0 评论