自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 高级字符驱动程序操作之异步通知IO(实践篇)

<br />1. async.c 主要展示异步通知机制在驱动程序中的实现<br />#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h> /* everything... */#include <linux/types.h> /* size_t */#include <linux/cdev.h>#include <linux/fcntl.h>#include <asm/uaccess.

2010-12-29 13:49:00 795

原创 高级字符驱动程序操作之异步通知IO(理论篇)

<br />1. 上一节我们已经学习了用poll轮询数据,来避免不必要的休眠,但是事实上,轮询的直接负面作用就是效率低下,这样一节我们学习如何使用异步通知IO来提高效率<br /> <br />2. fcntl系统调用<br />int fcntl(int fd, int cmd, long arg);<br />fcntl的作用是改变一个已打开文件的属性,fd是要改变的文件的描述符,cmd是命令罗列如下:<br />F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL,

2010-12-29 10:28:00 609

原创 高级字符驱动程序操作之poll(实践篇)

1. scull.h 驱动程序由scullpipe改过来的#ifndef _SCULL_H_#define _SCULL_H_#ifndef SCULL_P_NR_DEVS#define SCULL_P_NR_DEVS 2 /* scullpipe0 through scullpipe3 */#endif#ifndef SCULL_P_BUFFER#define SCULL_P_BUFFER 4000#endifextern int scull_p_buffer

2010-12-28 14:32:00 744

原创 高级字符驱动程序操作之poll(理论篇)

<br />1. poll系统调用<br /> <br />int poll(struct pollfd *fds, unsigned int nfds, int timeout);<br />poll由System V引入,作用是查询用户进程是否可以对一个或者多个打开的文件做非阻塞的读取或写入<br /> <br />那poll到底有什么用呢?举个例子说,当一个进程中有两个输入流,一个叫做A,一个叫做B;再假设A没有数据了,而B有充足的数据;这时候会发生什么?聪明的你一下就明白了,进程被阻塞在输入流A上面

2010-12-28 12:25:00 647

原创 高级字符驱动程序操作之休眠(实践篇)

1. scull_pipe.c #include #include #include /* printk(), min() */#include /* kmalloc() */#include /* everything... */#include #include /* error codes */#include /* size_t */#include #include #include #include struct scull_

2010-12-27 14:33:00 600

原创 高级字符驱动程序操作之休眠(理论篇)

1. 休眠的原则第一条: "永远不要在原子上下文中进入休眠" (LDD3 p149)第二条: 当线程被唤醒时,应当检查等待的条件是否为真第三条: 确保即将休眠的线程一定会被唤醒2. 简单休眠wait_event(queue, condition) // 不可中断的休眠,不符合休眠的原则(第二条)不推荐wait_event_interruptible(queue, condition) // 接受终端的休眠,推荐wait_event_timeout(queue, condition, timeout) //

2010-12-27 11:55:00 792

原创 高级字符驱动程序操作之ioctl(实践篇)

为了简单,我在“字符设备驱动程序(实践篇)”的基础上进行修改,来掩饰ioctl的用法。1. scull.h 其中添加ioctl用到的命令#ifndef _SCULL_H_#define _SCULL_H_#ifndef SCULL_MAJOR#define SCULL_MAJOR 0 /* dynamic major by default */#endif#ifndef SCULL_NR_DEVS#define SCULL_NR_DEVS 4 /* scull0 t

2010-12-24 13:48:00 914

原创 高级字符驱动程序操作之ioctl(理论篇)

<br />1. 驱动程序中ioctl函数:<br /> <br />int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);<br />其中inode和filp对应于应用程序传递的文件描述符fd,cmd是控制命令,应用程序既可以传递数据指针也可以传递值,在驱动程序里都表现为unsigned long类型的arg<br /> <br />如果应用程序传递了一个ioctl中找不到的命令

2010-12-24 12:10:00 856 1

原创 并发和竞态(实践篇)

1. complete.c 只是一个简单的字符驱动,但是我加进去了completion来同步读写操作#include #include #include /* everything... */#include /* size_t */#include #include MODULE_AUTHOR("victorsummer");MODULE_LICENSE("Dual BSD/GPL");static int complete_major = 0;

2010-12-23 16:44:00 464

原创 并发和竞态(理论篇)

1. 信号量信号量是为了解决共享资源问题而生的,通过著名的P/V操作可以获取和释放信号量,只有获得信号量的线程才可以访问共享资源,从而防止竞态的发生。其中P操作有三种情况:void down(struct semaphore *sem); // 如果信号量可以获得,信号量减一; 如果信号量不可以获得则阻塞进程并不可中断int down_interruptible(struct semaphore *sem); // 如果信号量可以获得,信号量减一,函数返回零; 如果信号量不可以获得则阻塞进程但可以被中断,如

2010-12-23 16:25:00 478

原创 字符设备驱动程序(实践篇)

<br />1. scull.h<br /> <br />#ifndef _SCULL_H_#define _SCULL_H_#ifndef SCULL_MAJOR#define SCULL_MAJOR 0 /* dynamic major by default */#endif#ifndef SCULL_NR_DEVS#define SCULL_NR_DEVS 4 /* scull0 through scull3 */#endif#ifndef SCU

2010-12-22 17:17:00 603

原创 字符设备驱动程序(理论篇)

<br />1. 设备编号<br /> <br />"主设备号标识设备对应的驱动程序" 而 "次设备号用于正确确定设备文件所指的设备"(LDD3 p48)<br />也就是说:主设备号对应驱动程序;次设备号对应使用同个驱动程序的设备;一般一个驱动程序可以被多个设备共享<br /> <br />一个主设备号和一个次设备号 合在一起 可以唯一确定一个设备文件,Linux内核使用一个叫做dev_t的类型来保存主设备号和次设备号,我们称dev_t类型的数据为设备编号。<br />要通过设备编号获取主次设备号,可以用

2010-12-22 17:00:00 675

原创 构造和运行模块

1. "可在运行时添加到内核中的代码被称为 模块" (LDD3 p13 可装载模块)  2. 在root权限下 使用insmod module_name.ko装载模块; 使用rmmod module_name卸载模块3. Hello World模块#include #include MODULE_LICENSE("Dual BSD/GPL"); // 如果没有这行,编译器会产生抱怨static int hello_init(void){ printk(KERN_AL

2010-12-22 10:51:00 491

原创 构造嵌入式Linux系统----准备交叉编译器

第一: 去下面的链接下载一个可用的交叉编译器。http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite第二: 查看datasheet,如果编译器默认的不是支持ARMv4T,在编译器bin/目录下建立若干个arm-linux-xxx(对应arm-none-linux-gnueabi-xxx中的xxx)脚本,在其中添加对ARMv4T的支持。第三: 制作fs时所需要的交叉编译器的lib文件放在arm-none-linu

2010-11-02 15:15:00 1098 1

原创 构造嵌入式Linux系统----文件系统篇

<br />环境: Ubuntu9.10 arm-linux-gcc-4.3.2 busybox-1.17.0<br /> <br />1. 修改busybox根目录下Makefile, ARCH修改为arm, CROSS_COMPILE修改为arm-linux-<br />2. 配置菜单项, make menuconfig<br />    主要记得勾选上 Build BusyBox as a static binary(no shared libs)<br />3. 编译make, 安装make ins

2010-07-12 13:10:00 567 1

原创 构造嵌入式Linux系统----内核篇

环境:Ubuntu 9.10 arm-linux-gcc-4.3.2 linux-2.6.34 s3c24401. 修改内核代码根目录下的Makefile    ARCH改为arm, CROSS_COMPILE改为arm-linux-2. 修改arch/arm/mach-s3c2440/mach-smdk2440.c 函数__init smdk2440_map_io    s3c24xx_init_clocks(16934400);改为s3c24xx_init_clocks(12000000);    (这

2010-07-12 11:16:00 507

原创 tslib-1.3编译

<br />1. 确保已安装autoconf automake libtool<br />2. ./autogen.sh生成configure<br />3. echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.cache<br />4. ./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$PWD/build --enable-inputapi=no<br />5. 修改pl

2010-06-23 14:12:00 550

原创 在Ubuntu9.10上搭建svn+hudson环境

1.  安装Ubuntu 9.10。在真机上和虚拟机上安装都可以,安装进行到80%的时候显示install apt,没动静的话点击skip跳过就行了。 2.  如果是在Windows下用Vmware安装的Ubuntu, 可能需要创建共享文件夹。这里以VMware-workstation-full-7.0.1.227600为例,在Vmware的菜单栏点VM->Settings->Option

2010-03-18 16:26:00 1734

原创 Install mplayer in ubuntu 9.10

Preparation: Update source                     sudo apt-get updateFirst Step: Install mplayer and mplayer-fonts                 sudo apt-get install mplayer mplayer-fonts Second Step: Config

2010-02-03 15:03:00 516

原创 在VC6.0下创建自己的C函数库

1.       创建类型为Win-32 Static Library的工程:(1)填写工程名称,工程名称不与已经存在库名相同即可,如mylib;(2)默认配置,直接点击完成、确定;(3)在这个工程下新建一个类型为C/C++ Header File的文件,文件名为liwenying.h;(4)在liwenying.h下面输入代码        #ifndef LIWENYING

2009-08-18 15:50:00 1713 1

原创 wince5.0下S3C2412SD卡驱动分析

网上对SD驱动总体结构的分析已经很多了,SD卡驱动一般采用微软的三层结构,最上层是Client层,可以有多个SD卡或者MMC卡调用;最下层是硬件控制层,直接读写寄存器;中间层是Bus层,Bus层作为Client层和HC层的中间桥梁,传输读写等命令。幸运的是,微软已经为我们编写好了Client层和Bus层,我们一般不要去修改,我们主要分析HC代码。不同的板子有不同的HC,我们看看S3C2413的HC

2009-08-04 10:37:00 1364

原创 wince5.0电池驱动样本分析

       battdrvr驱动是分层驱动,battdrvr.c是MDD层的,微软已经为我们搭好了构架,我们一般不需要修改,我们要实现的是PDD层的代码,PPD层的代码在sbattif.c里面实现。       首先分析MDD层的代码。首先定义了一个BATTERY_CONTEXT结构来存储电池信息,其中,dwPollTimeout是循环更新电池信息线程的最大阻塞时间,iPriority是这个

2009-07-15 08:53:00 1760 1

原创 wince5.0中es1371声卡单层驱动源码分析

     刚刚进入公司就要做WINCE驱动,实话是我从来没有接触过着东西。只好硬着头皮学习,不管学得怎么样我努力,还是记录下自己的一点心得,今天闲来分析下wince5.0自带的声卡驱动。源代码在%_WINCEROOT%/PUBLIC/Common/OAK/DRIVER/WAVEDEV下面。其中UNDEFINED是单层驱动,我就先学习这个。先看看wavmain.cpp,wavmain.cpp的第

2009-07-11 15:53:00 2693 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除