自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 服务器中判断客户端socket断开连接的方法

原文:http://blog.csdn.net/god2469/article/details/8801356下面来罗列一下判断远端已经断开的方法:法一:当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应

2014-08-05 23:15:45 942

原创 如何在linux写USB驱动

1、分配、设置注册usb_driver结构体。(usb_device结构体在USB总线会帮我们完成,具体见前面)设置usb_driver主要有哪些要设置:id_table--------USB总线匹配驱动和设备时候就依靠获取的设备接口描述符和驱动的id_table进行匹配来判断是否支持;probe----------USB总线匹配成功会通过usb_probe_interface(dri

2013-10-05 16:04:18 1066

原创 从总线模型看USB架构

1、模型USB总线:struct bus_type usb_bus_type = {.name = "usb",.match = usb_device_match,.uevent = usb_uevent,#ifdef CONFIG_USB_SUSPEND.pm = &usb_bus_pm_ops,#endif};USB设备模型:us

2013-10-05 14:42:27 855 1

原创 如何驱动一款USB设备

当我们把USB设备接入Hub接口的时候,设备地址初始化为0,那么主机控制器就要开始往地址为0的USB设备发送一个事物,实现获取设备描述符的功能(建立过程:SETUP(注)+DATA0(主)+ACK(从),数据过程:批量传输格式,状态过程:省略)。由于我们使用现在的处理器都有USB接口芯片,所以对于这些包来说不需要我们去解析然后判断是什么包。例如6410就可以判断当前接到的包是不是SETUP包。

2013-10-03 23:55:28 893

原创 谈USB硬件设备

1、接入USB设备怎么知道有USB设备接入了?我们的USB设备有D+或者D-引脚,都有1.5K欧姆上拉电阻接到VCC,而集线器(HUB)接口的D+和D-相反,是接下拉电阻接到GND。所以没有设备接入时候,Hub的D+,D-就是低电平,这样就表示没有设备接入,但是如果有设备接入,那么构成通路,并且HUB的D+或者D-引脚的电压刚好是VCC的一半,此时为高电平,通过对这个电平的勘测就知道有设备接入

2013-10-03 22:31:15 1326

原创 MMC/SD子系统里驱动工程师负责的部分

对于SD驱动子系统里,只有一部分和硬件挂钩,就是Host主机控制层,对于block块设备层存软件的,就是实现一个块设备结构体,然后注册一个请求处理函数而已(这个函数会最终会调用到主机控制器层的请求函数),这个共性的不需要我们考虑。而对于Core核心层来说,和SD卡是紧密相关,但是这是协议层,仅仅实现协议,例如初始化卡的需要哪几部分,读取卡需要几步骤等,这里只是实现协议层,没有硬件操作。但是这协议层

2013-10-03 16:57:22 907

原创 研究ALSA的DMA使用

对于DMA的介绍,网上资料很多。我们重点关注我们如何使用DMA。在声卡里,我们负责音频数据传输的就是DMA通道,这个属于DMA传输的外设和内存传输。看看内核如何实现,而我们又如何使用?先看看DMA在ALSA的角色:struct snd_soc_platform s3c24xx_soc_platform = {.name = "s3c24xx-audio",.pcm_

2013-10-03 16:23:21 3304

原创 从硬件层看SD/MMC(SPI模式)

现在讨论SD卡的硬件驱动:1、首先对于SD卡,采取的是一答一应的模式(主机没发一次命令,SD卡就回应一次)。而对于SD卡的操作基于两方面:命令+内部寄存器,并且对于寄存器的操作也还是通过命令,所以命令是SD卡的心脏。SD卡只有几个寄存器而已,不过这些寄存器很重要,具体如下:名字 宽    度 描    述CID128 卡识别号,每张卡都有唯一的识别号RCA1

2013-10-02 21:06:28 2848

原创 从块设备角度谈MMC数据传输过程

有块设备知道,实际块设备就是把对设备的操作先存到请求队列里,然后在执行请求队列,以实现相同的请求可以一次性操作完,提高效率。MMC卡分为了:         块设备层:用户操作MMC卡,文件系统就会转化为对ll_wr_block的调用,把操作封装为BIO结构体,然后放到请求队列,最后调用用户提供的请求队列处理函数来统一操作。         核心层:实现MMC协议相关内存,如卡

2013-10-01 21:50:43 3255

原创 详谈块设备的内部框架

块设备提出原因:对于块设备的操作:读取块->修改读出的数据-->擦除块-->把数据写入块。为了提高效率,我们对于块设备采取一种措施:先合并请求,然后在根据合并后的请求来操作块设备,这样可以使得块设备的操作次数降到最低。例如对同一块的不同扇区读取N此,通过和并就变为1次,那么对于前面提到的四个步骤可以得到很高的效率。块设备框架:用户层-->文件系统--->块设备驱动。基于块设备提

2013-10-01 15:40:29 972

原创 从硬件层次驱动网卡

1、对于网卡命令可以直接使用drivers/net/dm9000.h文件,里面包含了各个寄存器。2、要确定板子和DM9000的接线,确定网卡寄存器的起始地址,我的是接在6410的静态存储区域的BANK2,端口起始地址为0x18000000,这样就可以度确定DM9000的地址端口是0x18000000,数据(地址)端口是0x18000004。对于DM9000寄存器操作就是基于这两个端口

2013-10-01 12:59:30 997

原创 网卡如何和上层进行交互的

1、TCP/IP一般分为4层:应用层、传输层、网络层、网络接口层。网卡就属于最底层了(网络接口层,从七层协议就是物理层+数据链路层),那么网卡的上一层应该就是网络层,也就是IP层。2、我们知道上层会通过dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)函数吧sk_buff 传给网卡驱动程序,那么这个函数怎么被调用的??

2013-10-01 12:01:39 1568

原创 从硬件操作到内核来谈网卡驱动

DM9000任务:1、把上层传下来的数据sk_buff,抽取有效数据通过DM9000转为二进制发送出去;2、接收来自其他设备的二进制数据,通过DM9000得到这些数据,然后封装为sk_buff格式,然后提交给上一层。我们需要对网卡驱动做的主要任务:1、网卡初始化,然网卡运行起来;2、注册接收中断函数,中断处理函数负责接收来自其他设备数据,以及当发送完成也会产生中断等。

2013-09-30 23:52:18 1110

原创 从总线模型看IIC架构

struct bus_type i2c_bus_type = {.name= "i2c",.match= i2c_device_match,.probe = i2c_device_probe,.remove = i2c_device_remove,.shutdown = i2c_device_shutdown,.pm = &i2c_device_pm_o

2013-09-29 21:03:38 1017

原创 从总线模型谈SD/MMC架构

mmc总线:mmc_bus_typemmc驱动结构体注册:mmc_register_driver函数。mmc设备结构体注册:mmc_alloc_card和mmc_add_card函数。1、匹配问题:由于总线的匹配函数mmc_bus_match直接返回1,根据总线模型知道,其实就是把驱动和设备的匹配任务扔给了驱动来完成:really_probe函数调用总线的probe函数,返回0就会

2013-09-29 17:03:59 1825

原创 platform简单研究

设备模型:1、平台设备结构体:platform_device,通过platform_device_register注册,通过platform_device_unregister卸载;2、平台驱动结构体:platform_driver,通过platform_driver_register注册,通过platform_driver_unregister卸载;3、平台总线结构体:platfor

2013-09-28 18:14:48 958

原创 输入子系统架构

输入子系统有三层组成:核心层、事件处理层、设备层。其中后两者实现向核心层注册。核心层: input_init(void)err = class_register(&input_class);register_chrdev(INPUT_MAJOR, "input", &input_fops);当我们打开设备文件的时候那么就会调用input_fops操作函数:input

2013-09-28 17:10:26 685

原创 三探声卡值controls:

三论声卡值controls:首先我们操作control设备节点文件时候要先打开,看看打开函数做了什么?snd_ctl_open(struct inode *inode, struct file *file)err = nonseekable_open(inode, file);//设置filp->f_mode,这样内核就不会让lseek调用成功card = snd_lookup_m

2012-12-27 17:09:38 565

原创 再论声卡之control

control是提供给用户使用。内核实现一个file_operations结构体,供给用户调用。问题1、既然是file_operations,那么所有control会当成字符设备注册,那么内核是如何做的?答:首先是通过snd_soc_new_pcms函数里:snd_soc_new_pcms     ret = snd_card_create(idx, xid, codec->o

2012-12-18 22:05:08 749

原创 探究声卡之controls

一方面,从内核实现的角度来说,每个声卡的驱动,如wm9713.c/uda134x.c,都有一句:snd_soc_add_controls(。。。。)函数,这个函数就是用来添加control的。 另一方面,从用户空间来说,controls的实现目的就是提供给用户更好的控制和使用WM9714声卡。既然提供给用户使用,那么少不了系统调用来操作,也就是内核要实现内核操作函数。在注册cont

2012-12-18 20:02:32 1025

原创 再说声卡驱动操作实质

说说内核的ASoc架构的分层思想:1、对于内核而言,声卡Asoc架构是基于alsa架构的。在该架构里,操作声卡是最终会通过调用核心层的snd_pcm_ops函数来实现的:原因:首先无论uda1314还是wm9714,都得调用函数snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1),在这个函数里会设置pcm。其中

2012-12-17 15:42:20 1181

原创 自己建立最简单的系统(基于ok6410的)

这里包括两部分:首先建立最简单的板文件+让板文件挂在文件系统+启动系统。  声明:本文是之前写的了,在飞凌论坛发表,现在拿在这里共享一下。 转载请标明来源:http://blog.csdn.net/l_d_d/article/details/8302527 一、在arch/arm/mach-s3c64xx/目录下建立ok6410.c文件1、添加头文件:把mach

2012-12-16 20:59:01 1146

原创 移植madplay和aplay

转载请表明来源:http://blog.csdn.net/l_d_d/article/details/8302453 对于声卡驱动的应用编程,有一个是基于alsa-lib的,这个依赖的是alsa架构。还有madplay以来的就是oss架构。现在来移植这两种: 1、madplay移植:首先准备好三个安装包:两个库安装包:libid3tag-0.15.1b.tar.bz2;

2012-12-16 20:45:40 3714

原创 手写声卡驱动

转载请标明来源:http://blog.csdn.net/l_d_d/article/details/8299049 现在来手写一下声卡驱动,对于每款声卡而言,都是又共性和差异性两部分组成:在soc-core核心层会调用soc_codec_dev_wm9713.probe函数来初始化好声卡芯片。struct snd_soc_codec_device soc_codec_dev_wm

2012-12-15 21:02:39 1324

原创 wm9714的芯片资料解析

现在看看wm9714的硬件信息:芯片手册: 1、根据block diagram知道,我的开发板声卡线路:LINEL/LINER--->RECORE  SELECT/RECORE VOLUME--->ADCL/ADCR---->ALC/NOICEGET-->TONE/BASE BOOT-->DACL/DACR--->HEADPHONE MIXER---->HPL/HPR

2012-12-13 20:21:08 2096

原创 声卡的操作实质剖析1

看看snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);对于每个声卡都得调用这个函数,并且参数都是如此,所以这个函数式共性的。这个函数第一个函数ret = snd_card_create(idx, xid, codec->owner, 0, &codec->card);1、分配:struct snd_card

2012-12-09 16:06:01 757

原创 声卡驱动最简模版

#include #include #include #include #include #include #include #include #include #include #include #include #include "wm9713.h"struct snd_soc_dai           ****_dai[] = {};

2012-12-07 21:59:45 577

空空如也

空空如也

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

TA关注的人

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