海思SDK驱动部分

合集下载

Hi3536外围设备驱动 操作指南

Hi3536外围设备驱动 操作指南

产品版本
与本文档相对应的产品版本如下。
产品名称 Hi3536
产品版本 V100
读者对象
本文档(本指南)主要适用于以下工程师: z 技术支持工程师 z 软件开发工程师
修订记录
修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新 内容。
修订日期 2015-06-09
2015-03-04
1.1 操作示例......................................................................................................................................................... 1 1.2 操作中需要注意的问题 ................................................................................................................................. 2 1.3 IPv6 说明 ......................................................................................................................................................... 3
邮编:518129
外围设备驱动 操作指南
前言
初稿,仅供 参 考 !
前言
概述
本文档主要是指导使用 GMAC、USB 2.0 Host/USB3.0 Host 和 EMMC 卡等驱动模块的 相关人员,通过一定的步骤和方法对和这些驱动模块相连的外围设备进行控制,主要 包括操作准备、操作过程、操作中需要注意的问题以及操作示例。

Hi3559V100/Hi3556V100 SDK版本发布包 使用指南

Hi3559V100/Hi3556V100 SDK版本发布包 使用指南

1.2 目录结构
版本发布包目录结构,如图 1-1 所示。 图1-1 Hi3559V100 版本发布包 目录结构
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
您购买的产品、服务或特性等应受海思公司商业合同和条款的约束,本文档中描述的全部或部分产 品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,海思公司对本文档内容不做 任何明示或默示的声明或保证。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指 导,本文档中的所有陈述、信息和建议不构成任何明示或暗示的担保。
深圳市海思半导体有限公司
地址: 网址: 客户服务电话: 客户服务传真: 客户服务邮箱:
深圳市龙岗区坂田华为基地华为电气生产中心 +86-755-28788858 +86-755-28357515 support@
邮编:518129
1.3.1 Hardware................................................................................................................................................. 4 1.3.2 Software .................................................................................................................................................. 4 1.3.3 Only for references.................................................................................................................................. 5 1.3.4 交付件清单............................................................................................................................................ 5 1.3.5 版本描述文件........................................................................................................................................ 5 1.4 使用指引......................................................................................................................................................... 5

海思2232sensor调试

海思2232sensor调试

调试sc2232总结1、驱动调试方法:(1)首先,sc2232这款sensor厂家提供了3个配置文件config_entry.ini、sc2232_1080p25.ini、sc2232_1080p25_2lane.ini,另外两个驱动代码文件sc2232_cmos.c、sc2232_sensor_ctl.c等。

其中,sc2232_cmos.csc2232_cmos.c主要实现ISP 需要的回调函数,这些回调函数中包含了sensor 的适配算法,如注册了3a库回调函数,ae初始化参数,增益、帧率等初始化算法。

sc2232_sensor_ctl.c用于底层驱动控制,主要实现sensor的读写和初始化动作,也就是读写寄存器,主要是根据datasheet文档进行的代码开发。

(2)其次,讲讲3个配置文件,其中config_entry.ini是所有配置的入口,内容如下:首先设置UserMode参数,该参数用于选择哪一种模式,0表示mode.0;1表示mode.1;这里刚开始我都不知道,后来慢慢研究才明白的。

然后,sc2232_1080p25.ini这个文件代表的是datasheet里面的DVP并行视频端口模式,也就是CMOS模式,这种模式是12-bit并行数据。

sc2232_1080p25_2lane.ini这个文件代表的是datasheet里面的MIPI模式,也就是串行视频端口模式,只是8/10bit,1/2lane串行输出。

(lane解释:用于连接发送端和接收端的一对高速差分线,既可以是时钟lane,也可以是数据lane。

)可以使用beyondcompare对比这两个文件,只有个别参数配置不一样。

(3)stream工具的使用方法Stream工具需要上面说到的3个ini配置文件,当配置好参数之后,在stream的configs目录下建立一个sc2232目录,把ini配置文件放到目录下。

还需要复制两个自适应配置文件,分别是普通模式和wdr模式的,当然如果厂家提供有的话就不用复制其他方案的了。

Hisi3520+USBWIFI(RT3070)做路由器移植过程

Hisi3520+USBWIFI(RT3070)做路由器移植过程

Hisi3520+USBWIFI(RT3070)做路由器移植过程硬件平台:Hisi3520开发板Linux内核:linux-3.0.y说明:这是一个Hisi3520+RT3070WIFI作为路由器的移植过程!在做下面的过程中,我认为你是有个有点嵌入式开发经验的人,内核源码已经可以编译通过运行等!特别要强调,usb总线驱动一定要是好的。

下面的步骤也描述了如何利用sdk安装交叉编译器。

如需帮助,请联系孙怀亚。

第一步、下载Hi3520A_SDK_V1.0.2.0.tgz,这是海思的开发SDK,可以将第二步、解压缩海思SDK#tar -zxvf Hi3520A_SDK_V1.0.2.0.tgz修改sdk.Unpack文件#vim sdk.unpack将第一行的#!bin/sh改为#!bin/bash,如下图#./sdk.unpack解压完成后目录多出如下目录osdrv,mpp目录:进入osdrv目录#cd osdrv在osdrv目录下,有文件系统工具busybox,内核kernel,交叉编译工具toolchain,uboot 等,目录结构详细说明请看目录的readme_en.txt。

第三步、安装交叉编译器:进入toolchain目录进入arm-hisiv100-linux运行#./cross.install 安装脚本将自动帮你将交叉编译器安装到/opt目录下,同时在/etc/profile文件的最后一行加入环境变量,你可以看一下这两个地方的变动:可以看到/opt目录下多出了hisi-linux目录可以看到/etc/profile文件最后多出了如下几行:运行一下环境变量配置:#Source /etc/profile 这个将重新配置环境变量在中端中输入#arm-hisiv100-linux-gcc –v如果看到如上图信息说明你的交叉编译已经安装完毕,可以使用了!如果没有,你需查找原因,一般会解决的,如果实在不行,请联系孙怀亚。

海思方案 HI3518E平台ISP调试环境搭建

海思方案 HI3518E平台ISP调试环境搭建

3518E平台的搭建海思的SDK提供了ISP调试的相关工具,降低了IPC开发ISP调试的难度。

初次搭建ISP调试环境,记录一下。

SDK版本:Hi3518_MPP_V1.0.A.0硬件平台:HI3518E_OV9732工具包:PQ_TOOL (Hi3518E_V100R001C01SPC0A0\01.software\pc\PQ_TOOL)文件说明:Hi3518_ITTB_MPP2_V1.0.A.0_B030.tgz 设备端工具; PQTools_V3.7.5.zip PC端工具环境搭建步骤:(1)将Hi3518_ITTB_MPP2_V1.0.A.0_B030.tgz拷贝至nfs共享目录名,解压后运行HiIspTool.sh脚本倘若用海思自带的工具出图像并调节ISP运行:#./HiIspTool.sh -a -p ov9732_720p_line.inips一下可以看到两个进程696 adminlvj 58488 S ./ittb_stream -p ov9732_720p_line.ini699 adminlvj 19676 S ./ittb_control倘若运行自己的工程出图像了,这时只需要运行一下命令即可。

ps一下可以看到一个进程699 adminlvj 19676 S ./ittb_control(2)PC端直接解压PQTools_V3.7.5.zip,运行HiPQTools.exe,输入选择sdk版本Hi3518_MPP_V1.0.A.0 ,输入设备IP,就可以连接上摄像头倘若运行了ittb_stream,可以PC端软件上打开视频图像窗口连接成功,至此,最简单的ISP调试环境搭建就完成了。

复杂的就是后面的ISP调节过程了。

备注:运行脚本的时候可能会报错,查看相关打印信息,将错误消除。

当前产品我们用的是HI3518E+OV9732,SDK中并没有提供相关的sensor库和相关的config文件,所以运行报错了!解决:将OV9732sensor库拷贝至Hi3518_ITTB_MPP2_V1.0.A.0/libs/下,将ov9732_720p_line.ini拷贝至Hi3518_ITTB_MPP2_V1.0.A.0/configs/下附录:ov9732_720p_line.ini[plain]view plaincopyprint?1.[sensor]2.Sensor_type =ov9732 ;the type of sensor3.Mode =0 ;LINE mode,mode = 0 ,WDR mode,mode =14.DllFile =libs/libsns_ov9732.so ;LineDllFile path5.6.[vi_dev]7.Input_mod =2 ;VI_INPUT_MODE_BT656 = 08. ;VI_INPUT_MODE_BT601,9. ;VI_INPUT_MODE_DIGITAL_CAMERA10.11.Work_mod =0 ;VI_WORK_MODE_1Multiplex = 012.13. ;VI_WORK_MODE_2Multiplex,14.15. ;VI_WORK_MODE_4Multiplexbine_mode =0 ;Y/C composite or separation mode18.19. ;VI_COMBINE_COMPOSITE = 0 /*Composite mode */20.21. ;VI_COMBINE_SEPARATE, /*Separate mode */22.p_mode =0 ;Component mode (single-component or dual-component)24.25. ;VI_COMP_MODE_SINGLE = 0, /*single component mode */26.27. ;VI_COMP_MODE_DOUBLE = 1, /*double component mode */28.29.Clock_edge =1 ;Clock edge mode (sampling on the rising or falling edge)30.31. ;VI_CLK_EDGE_SINGLE_UP=0, /*rising edge */32.33. ;VI_CLK_EDGE_SINGLE_DOWN, /*falling edge */34.35.Mask_num =2 ;Component mask37.Mask_0 =0xFFC0000038.39.Mask_1 =0x040.41.Scan_mode = 1;VI_SCAN_INTERLACED = 042.43. ;VI_SCAN_PROGRESSIVE,44.45.Data_seq =2 ;data sequence (ONLY for YUV format)46.47. ;----2th component U/V sequence in bt112048.49. ; VI_INPUT_DATA_VUVU = 0,50.51. ; VI_INPUT_DATA_UVUV,52.53. ;----input sequence for yuv54.55. ; VI_INPUT_DATA_UYVY = 0,56.59. ; VI_INPUT_DATA_YUYV,60.61. ; VI_INPUT_DATA_YVYU62.63.64.65.Vsync =1 ; vertical synchronization signal66.67. ;VI_VSYNC_FIELD = 0,68.69. ;VI_VSYNC_PULSE,70.71.VsyncNeg=0 ;Polarity of the vertical synchronization signal72.73. ;VI_VSYNC_NEG_HIGH = 0,74.75. ;VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E76.77.Hsync =0 ;Attribute of the horizontal synchronization signal78.81. ;VI_HSYNC_PULSE,82.83.HsyncNeg =0 ;Polarity of the horizontal synchronization signal84.85. ;VI_HSYNC_NEG_HIGH = 0,86.87. ;VI_HSYNC_NEG_LOW88.89.VsyncValid =0 ;Attribute of the valid vertical synchronization signal90.91. ;VI_VSYNC_NORM_PULSE = 0,92.93. ;VI_VSYNC_VALID_SINGAL,94.95.VsyncValidNeg =0;Polarity of the valid vertical synchronization signal96.97. ;VI_VSYNC_VALID_NEG_HIGH = 0,98.99. ;VI_VSYNC_VALID_NEG_LOW101.Timingblank_HsyncHfb =0 ;Horizontal front blanking width102.103.Timingblank_HsyncAct =1280 ;Horizontal effetive width104.105.Timingblank_HsyncHbb =0 ;Horizontal back blanking width106.107.Timingblank_VsyncVfb =0 ;Vertical front blanking height108.109.Timingblank_VsyncVact =720 ;Vertical effetive width110.111.Timingblank_VsyncVbb=0 ;Vertical back blanking height112.113.Timingblank_VsyncVbfb =0 ;Even-field vertical front blanking height(inter lace, invalid progressive)114.115.Timingblank_VsyncVbact=0 ;Even-field vertical effetive width(interlace, i nvalid progressive)116.117.Timingblank_VsyncVbbb =0 ;Even-field vertical back blanking height(inte rlace, invalid progressive)118.121.;----- only for bt656 ----------122.FixCode =0 ;BT656_FIXCODE_1 = 0,123.124. ;BT656_FIXCODE_0125.126.FieldPolar=0 ;BT656_FIELD_POLAR_STD = 0127.128. ;BT656_FIELD_POLAR_NSTD129.130.DataPath =1 ;ISP enable or bypass131.132. ;VI_PATH_BYPASS = 0,/* ISP bypass */133.134. ;VI_PATH_ISP = 1,/* ISP enable */135.136. ;VI_PATH_RAW = 2,/* Capture raw data, for debug */ 137.138.InputDataType=1 ;VI_DATA_TYPE_YUV = 0,VI_DATA_TYPE_RGB = 1, 139.142.143.[vi_chn]144.145.CapRect_X =0146.147.CapRect_Y =0148.149.CapRect_Width=1280150.151.CapRect_Height=720152.153.DestSize_Width=1280154.155.DestSize_Height=720156.157.CapSel =2 ;Frame/field select. ONLY used in interlaced mode158. ;VI_CAPSEL_TOP = 0, /* top field */159. ;VI_CAPSEL_BOTTOM, /* bottom field */160. ;VI_CAPSEL_BOTH, /* top and bottom field */162.PixFormat =19 ;163.164.165.166.SrcFrameRate=-1 ;Source frame rate. -1: not controll 167.168.FrameRate =-1 ;Target frame rate. -1: not controll169.170.171.[vpss_group]172.Vpss_DrEn =FALSE173.174.Vpss_DbEn =FALSE175.176.Vpss_IeEn =TRUE177.178.Vpss_NrEn =TRUE179.180.Vpss_HistEn =TRUE181.182.Vpss_DieMode=0 ;Define de-interlace mode183.184. ;VPSS_DIE_MODE_AUTO = 0,185.186. ;VPSS_DIE_MODE_NODIE = 1,187.188. ;VPSS_DIE_MODE_DIE = 2,189.190.[vpss_chn]191.Vpss_W =1280192.Vpss_H =720193.194.[isp_image]195.196.Isp_W =1280197.198.Isp_H =720199.200.I sp_FrameRate=30201.202.Isp_Bayer =3 ;BAYER_RGGB=0, BAYER_GRBG=1, BAYER_GBRG=2, BAYER_ BGGR=3203.205.[isp_timing]206.207.Isp_WndMode=0 ;WIND_NONE= 0,WIND_HOR= 1,WIND_VER= 2,WIND_A LL= 3,208.209.I sp_HorWndStart=0210.211.Isp_HorWndLength=1280212.213.Isp_VerWndStart=0214.215.Isp_VerWndLength=720216.217.[vb_conf]218.219.VbCnt=8220.221.222.[venc]223.224.RcMode =VENC_RC_MODE_H264CBR226.Gop =30227.228.StatTime =1229.230.ViFrmRate =30231.232.TargetFrmRate=25233.;----- only for VENC_RC_MODE_H264CBR ----------234.BitRate=4096235.FluctuateLevel=1236.;----- only for VENC_RC_MODE_H264VBR ----------237.MaxBitRate =10000238.239.MaxQp=32240.241.MinQp=24242.;----- only for VENC_RC_MODE_H264FIXQP ----------243.IQp=20244.245.PQp=23 246.247.[bind]248.249.V iDev =0 250.251.ViChn =0 252.253.VpssGrp =0 254.255.VpssChn = 0 256.257.VencGrp =0 258.259.VencChn =0 260.261.VoDev =0 262.263.VoChn =0 264.265.V iSnapChn =0266.267.VpssSnapGrp=0 268.269.V pssSnapChn=1 270.271.VencSnapGrp=1 272.273.VencSnapChn=1。

Hi3518_ISP_3A版本使用指南

Hi3518_ISP_3A版本使用指南
2.2.1 Sensor 注册 ISP 库............................................................................................................................... 10 2.2.2 Sensor 注册 3A 算法库........................................................................................................................ 14
邮编:518129
文档版本 02 (2013-09-25)
海思专有和保密信息 版权所有 © 深圳市海思半导体有限公司
ii
Hi3518_ISP_3A 版本 使用指南
前言
前言
概述
本文档描述 Hi3518_ISP_3A 的功能、如何使用与开发。3A 功能包括 AE、AWB、AF。
产品版本
与本文档相对应的产品版本如下。
2 使用者指南......................................................................................................................................6
2.1 软件流程......................................................................................................................................................... 6 2.2 Sensor 对接.................................................................................................................................................... 10

芯片sdk手册

芯片sdk手册

芯片sdk手册芯片SDK(Software Development Kit)是指为特定芯片或硬件平台提供的软件开发工具包,它包括了编程接口、驱动程序、库文件、示例代码等,用于帮助开发者设计和开发应用程序。

以下是对芯片SDK手册的详细介绍:一、SDK概述1. SDK是Software Development Kit的缩写,意为软件开发工具包。

2. 芯片SDK是为特定芯片或硬件平台提供的开发工具包,包含了开发该平台所需的各种软件组件。

3. 芯片SDK通常由芯片制造商提供,以帮助开发者快速开发出适用于该芯片的应用程序。

二、SDK内容1. 编程接口:SDK提供了编程接口,开发者可以通过这些接口来访问芯片的硬件功能,如传感器、控制器等。

2. 驱动程序:SDK包含了芯片的驱动程序,用于控制和管理芯片的硬件组件。

3. 库文件:SDK提供了各种库文件,这些库文件包含了常用的功能实现,如数据处理、网络通信等。

4. 示例代码:SDK提供了示例代码,用于指导开发者如何使用SDK开发应用程序。

5. 文档:SDK包含了详细的文档,描述了SDK的使用方法、接口定义、功能说明等。

三、SDK使用1. 安装SDK:开发者需要根据芯片平台下载并安装相应的SDK。

2. 学习文档:开发者应该仔细阅读SDK提供的文档,了解SDK的使用方法和功能。

3. 编写代码:开发者可以使用SDK提供的编程接口和库文件来编写应用程序代码。

4. 调试测试:开发者需要使用调试工具来测试和调试应用程序,确保其正常运行。

5. 部署应用:完成应用程序的开发和测试后,开发者可以将应用程序部署到相应的芯片平台。

四、SDK优势1. 提高开发效率:SDK提供了预编译的组件和函数,可以节省开发者的时间和精力。

2. 降低开发难度:SDK提供了详细的接口定义和示例代码,降低了开发者对硬件的了解要求。

3. 优化性能:SDK通常由芯片制造商提供,可以充分利用芯片的硬件特性,优化性能。

海康威视设备网络SDK编程指南(CVR)

海康威视设备网络SDK编程指南(CVR)
设备网络 SDK 编程指南
声明
非常感谢您购买我公司的产品,如果您有什么疑问或需要请随时联系我们。 我们已尽量保证手册内容的完整性与准确性,但也不免出现技术上不准确、与产品功能及操作不相
符或印刷错误等情况,如有任何疑问或争议,请以我司最终解释为准。 产品和手册将实时进行更新,恕不另行通知。 本手册中内容仅为用户提供参考指导作用,请以 SDK 实际内容为准。
II 设备网络 SDK 编程指南
目录
声 明 ............................................................................................................................................................................... I 目 录 .............................................................................................................................................................................. II 1 SDK 简介................................................................................................................................................................... 1 2 SDK 版本更新........................................................................................................................................................... 4 3 函数调用顺序 .......................................................................................................................................................... 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1,1 inux驱动程序介绍1.1 linux驱动程序在系统中的角色Linux分为用户态和内核态,一般应用程序是在用户态执行,他们通过一系列的系统调用同内核态进行交互。

驱动程序是内核与硬件的接口,它把系统调用映射到具体设备对于实际硬件的特定操作上,关系如下图所用户空间 ----- ----------内栈空间通过这种方法,应用程序就可以像操作普通文件一样操作硬件设备,用户程序只需要关心这个抽象岀来的文件,而一切同硬件打交道的工作都交给了驱动程序。

1.2 linux驱动的类型linux系统将设备分为3类:字符设备、块设备、网络设备,摄像机常用的外围设备(如I2C,串口,SPI, GPIO, PWM等)均属于字符设备,tf卡驱动属于块设备,网卡相关驱动属于网络设备。

字符设备与块设备的区别:1、字符设备是面向流的,最小访问单位是字节;而块设备是面向块的,最小访问单位是512字节或2的更高次幕。

2、字符设备只能顺序按字节访问,而块设备可随机访问。

3、块设备上可容纳文件系统,访问形式上,字符设备通过设备节点访问,而块设备虽然也可通过设备节点访问,但一般是通过文件系统来访问数据的。

而网络设备没有设备节点,是因为网络设备是面向报文的,很难实现相关read、write等文件读写函数。

所以驱动的实现也与字符设备和块设备不同。

1.3 linux驱动的一些重要概念设备号把所有设备都当作文件,为了管理这些设备,系统为它们各自都编了号,而每个又分为和。

主设备号用来区分不同类型的设备,而次设备号用来区分同一类型内的多个设备(及其设备分区)。

在建立字符驱动时需要做的第一件事是获取设备号。

设备号的分配方式一般有2种,静态分配和动态分配,静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。

对于一部分常用的设备,linux内核开发者已经为其分配了设备号。

这些设备号可以在内核源码documentation/devices.txt 文件中找到。

如果只有开发者自己使用这些设备驱动程序,那么其可以选择一个尚未使用的设备号。

当添加新硬件时,很可能造成设备号冲突,影响设备的使用。

为了解决手动分配设备号存在冲突的问题,内核开发者提出动态分配设备号的方法。

使用该方法驱动程序在加载的时候,通过linux内核提供的专门的函数动态获取设备号。

int alloc_chrdev_regi on( dev_t *dev, un sig ned basem inor, un sig ned count, const char *n ame)设备节点linux系统中对所有设备的访问都是基于文件的形式。

对于每一种设备,在加载驱动程序的时候都会在/dev目录下创建一个文件,这个文件就是设备节点。

对于每一个设备节点,在实际运行时,linux系统通过VFS (虚拟文件系统)来完成将文件的各种系统调用与具体的驱动程序函数之间的映射。

设备节点可以通过mknod命令在系统启动的时候手动创建,也可以通过udev自动创建。

在驱动用加入对udev的支持主要做的就是:在驱动初始化的代码里调用内核提供的API向内核注册驱动信息class_create : 创建classclass_device_create : 仓U建device驱动加载时会在/sys/class目录下生成与该模块相关的信息,同时用户空间中的udev 会自动响应device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。

驱动初始化时,需要完成以下工作:1,通过alloc_chrdev_region() 及相关函数分配主/次设备号。

2,使用device_create() 创建/dev 和/sys 节点。

3,使用cdev_init() 和cdev_add() 将自身注册为字符驱动程序。

混杂设备考虑到有的系统包含很多简单字符设备驱动,单独为这些设备分配设备号比较浪费资源,同时工作量也很大,linux系统针对这些情况推出了一种叫混杂设备模型的驱动框架(miscellaneous )。

混杂设备主要有2个特征:1)所有的misc设备被分配同一个主设备号MISC_MAJOR(10),但是可以选择一个单独的次设备号。

如果一个字符设备驱动要驱动多个设备,那么它就不应该用misc设备来实现;2 )混杂设备驱动初始化时,只需要执行简单的一个注册函数,即可自动完成设备号分配,设备节点创建,向内核注册等工作,极大的简化了驱动初始化流程。

硬件IO操作IO端口与IO内存x86体系和ARM体系的寻址方式是有差别的:在x86下,为了能够满足CPU高速地运行,内存与CPU之间通过北桥相连并通过地址方式访问,而外设通过南桥与CPU相连并通过端口访问。

因为这两种访问方式的不同,linux分出了两种不同的访问操作:以地址方式访问硬件-- 使用IO内存操作。

以端口方式访问硬件一一使用IO端口操作。

在ARM下也实现了类似的操作,通过两条不同的总线(AHB BUS和APB BUS) 来连接不同访问速度的外设。

但是它与x86不同,无论是内存还是外设,ARM 都是通过地址访问。

在ARM下,访问寄存器就像访问内存一样一一从指定的寄存器地址获取数据,修改。

所以,ARM下一般是使用IO内存的操作。

但这并不是说IO端口的操作在ARM下不能用,它们的代码差不多,只是没有使用的必要,下面也将介绍IO 内存操作。

如何使用IO内存获得硬件的地址我们不能在linux使用实际的物理地址,要对指定的物理地址进行操作,必须要先将物理地址与虚拟地址对应,通过虚拟地址访问。

于是有了以下的物理地址映射函数:函数传入两个参数,需要访问的物理内存(寄存器)的首地址phys_addr和这段内存区域的大小size,返回与该段物理地址对应的虚拟地址。

这段地址可以多次被映射,当然,每次映射的虚拟地址也不一样。

phys = 0x200f0000; 〃1、指定物理地址virt = (unsigned Iong)ioremap(phys, 0x0c); 〃2、通过ioremap 获得对应的虚拟地址//0x0c表示只要12字节的大小GPECON = (unsigned long *)(virt + 0x40); 〃3、指定需要操作的寄存器的地址*GPECON &= ~(3 << 24); // 配置GPE12为输出端口为了实现更好的移植性,上面的程序就有缺陷了。

内核建议,尽量使用内核提供的参照硬件说明,通过对寄存器的控制实现操作硬件硬件说明文档驱动的调试Linux设备模型linux系统作为开源的下系统,支持世界上大部分的硬件,导致Linux内核看上去非常臃肿、杂乱、不易维护。

为了优化,linux系统从2.6版本开始提出了全新的设备模型(也称作Driver Model)概念。

设备模型将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口。

驱动的开发,就简化为对内核所规定的数据结构的填充和实现。

1)Linux设备模型中包含四个重要概念:Bus、Class Device、Device Driver。

Bus (总线):Bus (总线)是一类特殊的设备,它是连接处理器和其它设备之间的通道(channel )。

在设备模型中,所有的设备都通过总线相连,甚至是那些内部的虚拟平台总线(platform bus).Class (类):在Linux设备模型中,Class的概念非常类似面向对象程序设计中的Class (类),它主要是集合具有相似功能或属性的设备,这样就可以抽象出一套可以在多个设备之间共用的数据结构和接口函数。

因而从属于相同Class的设备的驱动程序,就不再需要重复定义这些公共资源,直接从Class中继承即可。

Device (设备):抽象系统中所有的硬件设备,描述它的名字、属性、从属的Bus、从属的Class等信息。

Device Driver (驱动):Linux设备模型用Driver抽象硬件设备的驱动程序,它包含设备初始化、电源管理相关的接口实现。

而Linux内核中的驱动开发,基本都围绕该抽象进行(实现所规定的接口函数)。

2)Linux设备模型的运行机制配对(Match):当总线上添加了新设备或者新驱动函数的时候,内核会调用一次或者多次这个函数。

举例,如果我现在添加了一个新的驱动函数,内核就会调用所属总线的match函数,配对总线上所有的设备,如果驱动能够处理其中一个设备,函数返回0,告诉内核配对成功。

探测(probe)当配对(match)成功后,内核就会执行device_driver中的probe回调函数,而该函数就是所有driver的入口,可以执行诸如硬件设备初始化、字符设备注册、设备文件操作ops注册等动作。

所以说,真正的驱动函数入口是在probe函数中。

卸载(remove)当该驱动函数或者驱动函数正在操作的设备被移除时,内核会调用驱动函数中的remove函数调用,进行一些设备卸载相应的操作。

platform 设备针对一些可以通过CPU直接寻址的设备(比如集成在嵌入式SOC芯片上的控制器,CPU可以直接访问其寄存器),linux内核在设备模型的基础上(device和device_driver),对这些设备进行了更进一步的圭寸装,抽象出paltform bus、platform device和platform driver,以便驱动开发人员可以方便的开发这类设备的驱动。

paltform设备对嵌入式Linux驱动开发是非常重要的,因为我们编写的大多数设备驱动,都是为了驱动plaftom设备。

Other drivers由图片可知,Platform设备在内核中的实现主要包括三个部分:Platform Bus ,基于底层bus模块,抽象岀一个虚拟的Platform bus ,用于挂载Platform 设备;Platform Device ,基于底层device 模块,抽象岀Platform Device ,用于表示Platform 设备;Platform Driver ,基于底层device_driver 模块,抽象岀Platform Driver,用于驱动Platform 设备。

Linux platform_driver 机制和传统的device_driver 机制(通过driver_register 函数进行注册)相比,最大的区别在于platform 机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device 提供的标准接口进行申请并使用。

这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。

platform机制的本身使用并不复杂,由两部分组成:platform_device 和platfrom_driver 。

相关文档
最新文档