linux下如何开发sdio设备驱动?

linux下如何开发sdio设备驱动?,第1张

以LinuxKernelSdioMx28 / LinuxKernelSdioMx53项目代码为例:

- module_init(DibBridgeTargetModuleInit)

驱动模块初始化入口

- DibBridgeTargetModuleInit():模块初始化函数

1.调用sdio_register_driver()注册sdio接口驱动,

2.调用register_chrdev()注册驱动模块为字符设备

- sdio_register_driver():向系统注册sdio接口驱动,调用以后,系统会触发sdio设备id检测,如果设备id和接口驱动里.id_table里定义的id一致,则系统调用probe函数。

1. 可以在DibBridgeTargetModuleInit()里调用,这样insmod之后,驱动接口即被注册(设备id被注册),有相应设备插入则probe会被调用(此种做法参考LinuxKernelSdioMx28)

2. 也可以在sdio初始化时调用,这样设备插入时,probe不会被调用,只有在sdio初始化,sdio_register_driver()被调用时,系统才会重新检测设备id,并调用probe。(此种做法好处是,模块初始化不涉及何种设备,具有更好的通用性。参考LinuxKernelSdioMx53)

- static struct sdio_driver Dib_sdio_driver

是sdio接口驱动的结构体,包括.id_table, .probe()函数等,如下

static struct sdio_driver Dib_sdio_driver = {

.name = "Dib_sdio",

.id_table = Dib_sdio_ids,

.probe = Dib_sdio_probe,

.remove = __devexit_p(Dib_sdio_remove),

}

其中.id_table很重要,它里面定义了此sdio驱动模块关心的sdio设备id号,只有插入的sdio设备的id号和这里面定义的id对应上,系统才会调用.probe函数。

- register_chrdev()

将驱动模块向系统注册为字符设备,并将 *** 作该设备的接口函数file_operations也一起注册了。

1.可以在DibBridgeTargetModuleInit()里调用。(参考LinuxKernelSdioMx53/LinuxKernelSdioMx28代码)

2.也可以在probe函数里调用,即只有在系统检测到硬件设备时才去注册字符设备(参考sdk8remote代码)

- struct file_operations

包含如下最基本的文件 *** 作函数,

struct file_operations fops =

{

.ioctl = DibBridgeTargetModuleIoctl,//控制命令传输或数据传输

.open= DibBridgeTargetModuleOpen,

.read= DibBridgeTargetModuleReadData, //数据传输

.write = DibBridgeTargetModuleWriteData

.release = DibBridgeTargetModuleRelease,

}

- .ioctl/.read 等等

user space和kernel space的传输通道,通过使用copy_from_user和copy_to_user这样的函数来实现数据传递

Linux方面的想相关知识可以百度搜索《Linux就该这么学》进行学习了解

static struct pxamci_platform_data luther_mci_platform_data = {

.detect_delay= 20,//检测到sd设备插入之后,延时detect_delay个tick之后,执行函数

.ocr_mask= MMC_VDD_32_33|MMC_VDD_33_34,

.init = luther_mci_init,

.setpower= luther_mci_setpower,

.exit= luther_mci_exit,

}

在luther_init()->

//luther_mmc_slot[0].gpio_cd = mfp_to_gpio(MFP_CFG_PIN(GPIO8_GPIO_MMC_DETECT))

所以设置GPIO8作为sd卡插入的中断检测IO

//pxamci_probe()->该函数是和platform的设备匹配上之后,会立即调用的probe

//host->pdata->init(&pdev->dev, pxamci_detect_irq, mmc)将mmc作为devid的传递参数

//就是调用设备函数luther_mci_platform_data->luther_mci_init()

//request_irq(cd_irq, luther_detect_int,IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,"MMC card detect", data)

//这样将中断注册到了物理硬件系统

当GPIO8检测到电平变化,将触发pxamci_detect_irq()中断处理函数,

该函数会继续调用mmc_detect_change()->mmc_schedule_delayed_work(&host->detect, delay)调度该host的自动检测函数

【IT168 专稿】这款Zaurus SL-6000L是Sharp(夏普)最新发布的一款基于linux *** 作系统的多功能PDA。它配备了400 MHz Intel XScale PXA255处理器,内存为64MB SDRAM可用空间为25MB。

#$[*168665.jpg*#a*#0*#0*#center*]$#

从某些方面来看这款Zaurus SL-6000L就象是之前发布的Zaurus SL-5600和Zaurus SL- C750/760/860的混合产物。在Zaurus SL-6000L上最主要的特点是配备了更好的显示屏、内置了Wi-Fi和蓝芽无线模块和增强了扩展性。在机身的底部还有一个Mini A USB连接器,此外还有一支长的触控笔。我测试的这款是Zaurus SL-6000L是面向普通的消费群所以只内置了Wi-Fi无线模块。

除了SL-6000L之外SL-6000系列还包括其它的两个机型:只内置了蓝芽的SL-6000N和内置了蓝芽和802.11b无线模块的SL-6000W。我在测试这款Zaurus SL-6000的时候使用了一个Viking 512 MB Compact Flash卡和一个Sandisk 64 MB Secure Digital卡。使用中没有出现兼容问题。在关闭蓝芽的情况下,我还用一个Aerlink NPC卡把SL-6000连接到我的Sony Ericsson T610手机上而且顺利的接入了互联网。

包装:

Zaurus SL-6000L的包装盒非常的简单。只是一个上面印有蓝色图案的白色硬纸板盒,上面没有现在包装盒上非常流行的可以看到里面产品的透明塑料窗口。重量很轻而且非常环保。在包装盒里PDA被放在一个隔开的另外的空间里,其它还有USB连接线、塑料底座、电源连接器、CD-ROM、快速上手向导和一本104页的使用指南。

设计:

Zaurus SL-6000L的表面材质较为粗糙,这样的设计可以有效的防止PDA在使用中从手中滑落。SL-6000L的屏幕翻盖d力很大打开/关闭时感觉有点费力,而且也限制了触控笔的使用。我还是比较喜欢SL-5600的屏幕翻盖。SL-6000L和SL-5600的底座非常类似都比较大。

#$[*168690.JPG*#a*#0*#0*#center*]$#

SL-6000L的机身右侧没有任何的按钮和端口。

#$[*168691.JPG*#a*#0*#0*#center*]$#

在机身的左侧的顶部是一个开/关按钮、IR端口和一个银色的录音按钮,它可以启动录音功能你可以方便的录制声音日记或会议记录。按钮下面是一个非标准的2.5mm音频插孔,如果你想使用标准的3.5mm耳机必需得有一个转接器。

#$[*168699.JPG*#a*#0*#0*#center*]$#

在SL-6000L机身的顶端是一个支持CF(type I或 II)卡和SD卡的内存卡插槽(不能支持SDIO)。机身的后面可以看到一个内置喇叭和不同于早先的Zaurus机型的电池。

#$[*168702.JPG*#a*#0*#0*#center*]$#

机身的底部是DC电源插孔、标准的Zaurus I/O端口、扩充连接器和一个Mini-A USB接口。在USB接口的下面是麦克风插孔。用来连接底座的塑料附件可以取下来,所以SL-6000L也可以允许你把它直接插在底座的扩充接口上。

显示屏:

#$[*168712.jpg*#a*#0*#0*#center*]$#

这款Zaurus SL-6000L配备的是一个480×640分辨率,65536色的4英寸背光显示屏。清晰度和对比度都非常出色,是我在掌上电脑上所见过的最好的显示屏。明显要比Zaurus SL- C750/760/860上的显示屏好的多,尽管它们的显示屏已经非常好了。屏幕上的彩色应用程序图标非常的漂亮,并且网页的显示也非常精细就象是在图片浏览器中打开的照片。我认为SL-6000L的屏幕的显示质量完全可以与桌面电脑的显示器媲美。先前的SL- C860的屏幕亮度虽然非常出色,但是在高亮度设置下对比度较差图像显得非常虚。SL-6000L的屏幕在高亮度设置下则仍然可以保持极好的对比度和色彩深度。屏幕背光的亮度可以在设置页中使用工具进行多种设定,但是不能象SL- C750那样用键盘的快捷键设置。在测试中手写区响应灵敏精确给我留下了非常深的印象。

按钮:

#$[*168708.JPG*#a*#0*#0*#center*]$#

在SL-6000L的前面板上一共有九个按钮和一个导航键,Action按钮在导航键的中心。导航键的左侧是Cancel按钮右侧是OK按钮,上面有一个圆点的是Dot按钮,上面画了一个灯泡的是背光开/关按钮。

触控笔:

SL-6000L附带的是一支4英寸长的黑色塑料制成的触控笔。它只是采用翻盖设计的5000系列上触控笔的加长版。它的设计不是非常好手感太轻。在不使用时可以把它插在屏幕右侧边缘的插槽内。这对于象我这样的左撇子来说非常的不便。如果你安装了屏幕翻盖情况会更糟,你几乎不可能把它取出来。

    键盘:

#$[*168731.JPG*#a*#0*#0*#center*]$#

SL-6000L的键盘与早先的机型一样也是通过向下滑动按钮区把它露出来。键位的响应非常灵敏,但是按上去键位显得有些硬长时间的键入手指会有些疲劳。键盘上的Fn键是橙色的非常醒目但是说实话不是太好看。在直接的光照下想看清每个键非常困难,这是一个非常令人讨厌的问题。

#$[*168733.JPG*#a*#0*#0*#center*]$#

与SL- C860扁平的键盘按压式相比,SL-6000L的键盘更加真实立体但是小了许多(左侧是SL- C860右侧是SL-6000L)。与SL- C860的键盘相比除了尺寸之外,SL-6000L的键盘还少了一行数字键,这意味着你在键入数字时必须按住Fn键。除了物理键盘之外SL-6000L的主要输入方式还有屏幕键盘和手写识别。

    电池:

SL-6000L配备的是一块可抽取式1500 mAh电池。在SL-5500上倍受批评的电池寿命在SL-5600上就得到了改进。在SL-6000L上的电池采用了外形又宽又薄的全新设计。

#$[*168735.jpg*#a*#0*#0*#center*]$#

在手册上标称的电池寿命是11小时。在我的测试中,在打开Wi-Fi连接的情况下处理日常的工作SL-6000L的电池寿命比标称的下降了百分之25。在测试中把背光亮度设置成最大而且也打开Wi-Fi连接,从完全充满电到不能用只维持了几乎整整两小时。在关闭Wi-Fi连接的情况下进行与上面测试相同的 *** 作SL-6000L可以维持6到8小时。在这种情况下编辑文档和运行程序2小时以后屏幕上的电池指示器图标几乎没有移动,屏幕上显示的剩余电量在百分之90到百分之95之间。整体来看SL-6000L的电池寿命还是非常的不错。

音频:

#$[*168740.JPG*#a*#0*#0*#center*]$#   

SL-6000L的内置喇叭非常不错。音质相当于小无线电的质量,音量也足够高完全可以当闹钟来用。我甚至还可以用它来听MP3。内置麦克风的录音效果也非常不错。最初当我看到SL-6000L上的2.5mm音频插孔时感到非常惊讶,这显然是因为我以前的SL-5600的主要特点非常象一款MP3播放器的原因。我用一个手机上的耳机对它进行了测试音质非常的细腻。

结论:

这款SL-6000L外型设计漂亮,机身结实防滑,电池寿命优秀而且还配备了极好的显示屏和功能强大的 *** 作系统。整体性能超出了大多数人的预期。经过一周的使用我对这款SL-6000L的表现非常满意,它 *** 作容易机身结实但有不是太重最重要的是体积不是非常大。如果你的大部分需求只是PIM功能,那这款SL-6000L也许并不适合你。如果用它来进行办公应用、网络应用、浏览图片那它的确是一个极好的设计。整体来看尽管价格有点高但是你为它花的每一分钱都非常的值。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7283243.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存