硬件驱动_硬件驱动开发 - CSDN
  • 本课程为uboot学习的第10部分,主要讲解uboot中的硬件驱动部分。主要以SD/MMC驱动为例详细分析了SD/MMC卡的初始化函数、读写函数等的逻辑,目的是让大家对驱动框架有所了解,进而通过此初步学习到linux驱动的思想。
  • 如果您遇到了计算机故障,则可能是硬件驱动程序造成的。 这些是计算机操作系统用来与其硬件对话的软件。 从Windows到Android的每个操作系统都使用硬件驱动程序。 驱动程序就像计算机的翻译器 从根本上讲,两个主要...

    如果您遇到了计算机故障,则可能是硬件驱动程序造成的。 这些是计算机操作系统用来与其硬件对话的软件。 从Windows到Android的每个操作系统都使用硬件驱动程序。

    驱动程序就像计算机的翻译器

    从根本上讲,两个主要组件构成一台计算机-软件和硬件。 软件是您的操作系统(OS)以及已安装在其上的所有程序和应用程序。 主板,RAM,鼠标,键盘,打印机以及连接到计算机的其他任何物理设备组成了硬件。

    没有任何帮助,该软件将不会与您的硬件对话,反之亦然。 硬件驱动程序是一些软件,可以教您的OS,程序和应用程序如何与设备一起使用。 想象一下,您的操作系统说英语,而硬件说德语。 然后,硬件驱动程序是语言解释器,将英语转换为德语,然后再次转换为德语。

    制造商制造驱动; 软件开发人员使用它们
    由于驱动程序处理硬件翻译,您可能会认为这意味着制造硬件的制造商会制造驱动程序。 有时候是这样; 例如,制造商可能会制造您的图形驱动程序。 但这并非总是如此。

    Microsoft(和某些制造商)提供任何人都可以使用的通用驱动程序。 这些驱动程序可节省成本,并在整个设备上实现性能一致性。 跳过驱动程序创建过程,使制造商可以将其硬件调整为符合公司需求的,经过全面测试的著名驱动程序。 例如,您的鼠标,键盘和USB驱动器可能使

    用Microsoft制造的通用驱动程序。

    某些设备可以使用通用驱动程序,但在特定于设备的驱动程序下可能会表现更好。 例如,您的计算机的图形卡(GPU)可以使用通用驱动程序将您的桌面输出到显示器,但是为了获得最佳3D游戏性能,它需要其制造商NVIDIA,AMD或Intel的驱动程序。

    无论由谁来制作驱动程序,软件开发人员都可以利用和使用它们。 您的文本编辑器或文字处理器会调用打印驱动程序来与打印机一起使用,并调用图形驱动程序来显示文本。 没有这些驱动程序,您的程序将不知道如何与打印机或显示器对话以完成诸如打印和更改字体大小之类的基本功能。 硬件驱动程序可以使软件开发人员有所收获。 他们无需学习硬件语言的来龙去脉即可使用硬件。

    更多内容,参阅http://viadean.com

    展开全文
  • Android 标准的硬件驱动分为两个部分,一个是运行在linux内核里的硬件驱动,而另外一部分是运行在用户空间的硬件抽象层。采用这种方法,就可以使系统具有硬件无关性,也保护了部分厂商的利益。在 Android 从硬件到...

           Android 标准的硬件驱动分为两个部分,一个是运行在linux内核里的硬件驱动,而另外一部分是运行在用户空间的硬件抽象层。采用这种方法,就可以使系统具有硬件无关性,也保护了部分厂商的利益。在 Android 从硬件到应用:一步一步向上爬 1 -- 从零编写底层硬件驱动程序 中已经有了编写硬件驱动到linux内核里的步骤,下面就要接着这个工程去看看怎么在硬件抽象层增加硬件模块和我们的内核驱动程序进行交互,完成硬件控制。

    进入hardware/libhardware/include/hardware目录,新建gpio.h:

    #ifndef ANDROID_GPIO_INTERFACE_H  
    #define ANDROID_GPIO_INTERFACE_H  
    #include <hardware/hardware.h>  
          
    __BEGIN_DECLS  
          
    /*module ID*/  
    #define GPIO_HARDWARE_MODULE_ID "gpio"  
    /*module struct*/  
    struct gpio_module_t {
    	struct hw_module_t common;  
    };       
    /*interface struct*/  
    struct gpio_device_t {
    	struct hw_device_t common;  
    	int fd;  
    	int (*set_val)(struct gpio_device_t* dev, int val);  
    	int (*get_val)(struct gpio_device_t* dev, int* val);  
    }; 
    __END_DECLS
    #endif  
    其中set_val和get_val是HAL层向上层应用提供的API接口。

    cd到hardware/libhardware/modules目录,新建gpio目录,在里面新建gpio.c文件:

    #include <hardware/hardware.h>  
    #include <hardware/gpio.h>  
    #include <fcntl.h>  
    #include <errno.h>  
    #include <cutils/log.h>  
    #include <cutils/atomic.h>  
    #define DEVICE_NAME "/dev/AdrIO"  
    #define MODULE_NAME "Gpio"  
    
    //open and close
    static int gpio_device_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device);  
    static int gpio_device_close(struct hw_device_t* device);  
    //device access
    static int gpio_set_val(struct gpio_device_t* dev, int val);  
    static int gpio_get_val(struct gpio_device_t* dev, int* val);  
    
    static struct hw_module_methods_t gpio_module_methods = {  
        open: gpio_device_open  
    };  
    
    struct gpio_module_t HAL_MODULE_INFO_SYM = {  
        common: {  
            tag: HARDWARE_MODULE_TAG,  
            version_major: 1,  
            version_minor: 0,  
            id: GPIO_HARDWARE_MODULE_ID,  
            name: MODULE_NAME,  
            author: "HAL",  
            methods: &gpio_module_methods, }  
    }; 
    
    static int gpio_device_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device) 
    {  
    	struct gpio_device_t* dev;
    	dev = (struct gpio_device_t*)malloc(sizeof(struct gpio_device_t));  
    	memset(dev, 0, sizeof(struct gpio_device_t));  
    	dev->common.tag = HARDWARE_DEVICE_TAG;  
    	dev->common.version = 0;  
    	dev->common.module = (hw_module_t*)module;  
    	dev->common.close = gpio_device_close;  
    	dev->set_val = gpio_set_val;
    	dev->get_val = gpio_get_val;  
    	if((dev->fd = open(DEVICE_NAME, O_RDWR)) == -1) {  
    		LOGE("gpio: failed to open /dev/AdrIO -- %s.", strerror(errno));
    		free(dev);  
    		return -EFAULT;  
    	}  
    	*device = &(dev->common);  
    	return 0;  
    }  
    
    static int gpio_device_close(struct hw_device_t* device) 
    {  
    	struct gpio_device_t* gpio_device = (struct gpio_device_t*)device;  
    
    	if(gpio_device) {  
    	    close(gpio_device->fd);  
    	    free(gpio_device);  
    	}    
    	return 0;  
    }  
    
    static int gpio_set_val(struct gpio_device_t* dev, int val) 
    {  
    	LOGI("gpio: set value %d to device.", val);  
    	write(dev->fd, &val, sizeof(val));  
    	return 0;  
    }  
    
    static int gpio_get_val(struct gpio_device_t* dev, int* val) 
    {  
    	return 0;
    }
    为了防止调用时出现 Permission denied的情况:

    打开am335xevm文件系统根目录rootfs,打开ueventd.rc添加:

    /dev/AdrIO  0666 root root

    该文件并不会创建设备节点,而是当有设备节点产生的时候,eventd 会根据这个数据库设置设备的权限。

    修改hardware/libhardware/modules目录下Android.mk在harware_modules :=后面加上“gpio”

    在gpio目录中继续添加Android.mk文件:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := optional
    LOCAL_PRELINK_MODULE := false
    LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
    LOCAL_SHARED_LIBRARIES := liblog
    LOCAL_SRC_FILES := gpio.c
    LOCAL_MODULE := gpio.default
    include $(BUILD_SHARED_LIBRARY)

    编译HAL层:

    make TARGET_PRODUCT=am335xevm_sk -j8 OMAPES=4.x

    如果出现错误,参考:

    没有规则可以创建 /lib/liblog.so 

    如果成功,就可以生成 gpio.default.so

    out/target/product/am335xevm_sk/obj/lib/gpio.default.so
    
    这个就是我们需要的硬件抽象层模块,这一步完成之后,还要接着向上走,最终完成硬件调用。

    展开全文
  • 上层APP调用底层硬件驱动过程解析

    千次阅读 2011-11-09 10:55:03
    APP应用程序->应用框架层->硬件抽象层-> 硬件驱动程序 一、硬件驱动层  进入kernel/drivers文件夹中,创建一文件夹,放入驱动程序。包括头文件,C文件,Makefile,Kconfig。同时对drivers下的Makefile跟Kconfig...
     APP应用程序->应用框架层->硬件抽象层-> 硬件驱动程序
    

    一、硬件驱动层

                进入kernel/drivers文件夹中,创建一文件夹,放入驱动程序。包括头文件,C文件,Makefile,Kconfig。同时对drivers下的Makefile跟Kconfig进行相应的添加,这样配置编译选项后,即可编译。编译完后,可以在/dev,/proc,/sys/class中得到相应的文件,其中dev下的文件即为该设备文件。

    二、硬件抽象层

                进入源码根目录下的hardware/libhardware/include/hardware新建头文件,在hardware/libhardware/modules中新建目录,在该目录下放入C文件调用设备文件(open函数打开/dev/XXX设备文件),最后在该目录下创建Android.mk文件,编译后得到XXX.default.so文件。重新打包后,system.img就包含我们定义的硬件抽象层模块XXX.default。

    三、应用框架层

                进入frameworks/base/services/jni目录,创建com_android_server_XXXService.cpp文件(#include <hardware/hello.h> 以此调用抽象层方法 ),实现jni方法。com_android_server前缀表示的是包名,表示硬件服务XXXService是放在frameworks/base/services/java目录下的com/android/server目录的。对同目录下的onload.cpp文件进行修改,这样,在Android系统初始化时,就会自动加载该JNI方法调用表。同时修改该目录下的Android.mk。

               进入到frameworks/base/core/java/android/os目录,新增IXXXService.aidl接口定义文件,该文件提供功能函数。在frameworks/base目录下的Android.mk添加该aidl文件。进入frameworks/base/services/java/com/android/server目录,新增XXXService.java(主要是通过调用JNI方法来提供硬件服务),修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码。

              这样,重新打包后的system.img系统镜像文件就在Application Frameworks层中包含了我们自定义的硬件服务XXXService了,并且会在系统启动的时候,自动加载XXXService。这时,应用程序就可以通过Java接口来访问Hello硬件服务了。

    四、APP应用层

               用eclipse编写应用层的APP。程序通过ServiceManager.getService("XXX")来获得XXXService,接着通过IXXXService.Stub.asInterface函数转换为IXXXService接口。然后把出R文件的其他文件都拷到/packages/experimental下,在该APP目录下创建Android.mk文件。编译后安装该生成的apk即可使用该程序调用底层硬件驱动。

            

              大概整个过程就这样,上层app调用框架层的java接口,java接口通过jni调用硬件抽象层,硬件抽象层则通过打开设备文件调用底层硬件驱动。
    展开全文
  • Mac 硬件驱动 kext 安装方法

    千次阅读 2019-04-24 12:32:45
    Mac 硬件驱动 kext 安装方法
                   

    转载自:http://l24317.blog2.cnool.net/Article/2007/09/24/13541.html

    一、Mac驱动程序的概念

    我想用我所理解的系统概念为各位稍微的介绍一下在Mac上的驱动程序概念,基本上,Mac OS X Tiger是一个UNIX架构的核心的系统,所以如果有一些UNIX系统概念其实在底层的架构会很容易了解,系统核心,通常会有包含了硬件支持的程序在内,也就是说有一些需要在系统核心启动就跟着支持的基础硬件组件(例如CPU 指令集支持、内存管理...),大多放在核心中,不过Mac是一种经由APPLE公司自行订制化的核心,基础的硬件支持大多也以APPLE计算机为主,但是,并不会把所有的驱动程序都放在核心中,通常只有『必要的』才会放在核心,不然核心可能会过度肥大,整个系统执行效率就更差。

    那么还有许多硬件驱动怎么办呢?通常会把他作成模块程序,然后在核心本身支持模块加载功能,在Linux 中叫做 Kernel Loadable Modules(KLM) 的架构,而在Mac OS X 中,称为 Mac OS X Kernel Extension,其实就把他想成是『驱动程序』就可以了,也就是Mac OS X系统中许许多多的 .kext 文件名的程序集,大多放在 /System/Library/Extensions/ 中,当核心有需要就去找到相应的设备ID然后叫起那个程序来支持硬件。

    而现在的MAC OSX86 中其实问题比较多就是在硬件没有驱动支持,也就是没有相应的驱动程序可以使用,相关的HCL (硬件兼容列表)可以到 http://wiki.osx86project.org/wiki/index.php/HCL 下找到,进而可以找到相应可使用的驱动程序。


    看了第一部分,假设您已经有简单的概念后,我们知道,其实Mac的驱动程序就是 Kernel Extension,也就是硬件相对应的 .kext 档案,我无法告诉妳哪里一定找的到兼容的kext可以用,但是可以提供个下载驱动的地址http://www.weiphone.com/thread-1918-1-1.html
    因为,kext 档案不一定每一种硬件都有人为他制作驱动,所以还是请您自己去查 相关的HCL (硬件兼容列表),先确定有支持,如果不在内建的系统中,应该都有下载kext的连结和说明,所以以下程序我都假设已经找到了kext的档案,


    三、实例:安装T43网卡:


    我当初找到了 T43 用的 Broadcomd 5751 的kext档案 AppleBCM5751Ethernet.kext
    我以他为例安装入系统内的步骤如下:

    1. 打开终端:
    打开终端,执行:

    sudo -s

    然后键入你的密码,做好切换管理员的动作。
    PS. sudo 是一个安全为考虑的执行管理指令的方法,这边不多做介绍。

    2. 复制kext 到相应目录:
    相应目录是 " /System/Library/Extensions/ " ,
    只要把你找到的驱动 .kext 档案复制到 /System/Library/Extensions/ 中,
    方法一:直接进入" /System/Library/Extensions/ "目录中,将自己的驱动 .kext 档案复制到里面,中途可能要输入密码;
    方法二:假设你的驱动叫AppleBCM5751Ethernet.kext,并放在桌面的,
    指令如下:

    cp ~/Desktop/AppleBCM5751Ethernet.kext /System/Library/Extensions/

    注意:请把AppleBCM5751Ethernet.kext 换成你自己要安装的.kext驱动名

    3. 更改文件权限:
    文件权限是UNIX系统中蛮重要的一个观念,在Unix为基础的Mac OS X中也一样,就是要把这些复制到系统内的文件的权限切换成系统(管理员)拥有与使用,指令如下:

    sudo chown -R root:wheel /System/Library/Extensions/AppleBCM5751Ethernet.kext
    sudo chmod -R 755 /System/Library/Extensions/AppleBCM5751Ethernet.kext

    注意:请把AppleBCM5751Ethernet.kext 换成你自己要安装的.kext驱动名

    4. 清除 kext 的快取:
    要清除已经安装并制作快取的kext 快取内容,不然可能下次重启之后系统还是去读取快取,就不会读到新放进去kext 驱动
    指令如下:

    rm /System/Library/Extensions.kextcache
    rm /System/Library/Extensions.mkext
    kextcache -k /System/Library/Extensions


    5. 系统重启:
    硬件驱动后基本上是需要重启才会加载,可以点选右上角的苹果点选重启系统,或是使用指令 reboot 重启,接下来就是祈祷重启后系统一切正常,硬件支持良好啦!


    驱动程序其实安装并不难,找不找的到驱动(kext)才是问题。


               
    展开全文
  • 一些服务器的硬件驱动程序可能在ESXi原生的ISO安装文件里并没有提前包含,因此需要在安装ESXi之前加载相关驱动。例如RAID,NIC等驱动。 所需文件: VMware PowerCLI VMware vSphere 镜像离线包(offline bundle) 相关...
  • 硬件平台:TI AM335X Starter ... 这次写《Android 从硬件到应用》是想尝试从底层的最简单的GPIO硬件驱动开始,一步一步的向上走,经过硬件抽象层HAL、JNI方法等,最终编写出APP,达到硬件调用的目的,期间会增加一些
  • 开发Android硬件驱动程序

    千次阅读 2014-06-08 20:23:49
    一、 1、实现内核驱动程序模块  驱动程序freg的目录结构如下:  ~/android-2.3_r1/kernel/goldfish  ----drivers  ----freg  ----freg.h  ----freg.c
  • uboot之uboot中的硬件驱动

    千次阅读 2018-05-28 08:54:35
    一、uboot和linux驱动 1、uboot本身是裸机程序,裸机程序是没有驱动概念的 2、裸机程序是直接操控硬件的,操作系统中必须通过驱动来操控硬件。这两个的区别在于分层。 3、uboot的虚拟地址对硬件操作的影响 (1)...
  • android平台硬件驱动原理学习(总)

    千次阅读 2016-01-22 17:17:13
    Android的硬件驱动调用流程分为以下几层: 1、内核驱动; 2、硬件抽象层(HAL层); 3、通过JNI方法提供java调用接口; 4、在应用程序框架层()增加硬件服务接口供应用程序使用; 5、app层最终调用硬件; ...
  • Linux-uboot-学习笔记(9):uboot硬件驱动 一、uboot与linux驱动 1、驱动是什么? 驱动的狭义概念:操作系统中用来具体操控硬件的那部分代码。裸机程序中是直接操控硬件的,而操作系统中必须通过驱动来操控硬件。 ...
  • 问题描述:我用USB-CAN转换器连接到电脑时,开始会弹出找到新硬件,需要安装硬件驱动的对话框。开始并没找到驱动,所以点了几个“下一步”就完事了。后面下载到驱动后需要再之前的那个弹出对话框中按提示步骤安装时...
  • 有道云笔记地址: ...amp;amp;sub=4AB866DB577940FF8B1F4D8DCB9F7869 一.uboot与linux驱动. 1.uboot与linux驱动 1.1、uboot本身是裸机程序 ...(1)裸机本来是没有驱动的概念的(狭义的驱动的概...
  • 跪求 QT 驱动连接实例,例如用QT写的窗口软件点击某一按钮可以启动摄像头!新手一枚,跪求大神围观!
  • 开发DSP硬件驱动程序的一种方法

    千次阅读 2011-06-07 21:08:00
    开发DSP硬件驱动程序的一种方法 张 行,雷 勇 (四川大学电气信息学院 四川 成都610065) l 引 言 传统的DSP程序开发包含两方面程序:即配置、控制、中断等管理DSP片内外设、接口的硬件相关程序和基于应用的算法程序...
  • 联想笔记本硬件驱动官网下载地址

    千次阅读 2012-09-15 00:00:22
    联想笔记本硬件驱动官网下载地址 http://support1.lenovo.com.cn/lenovo/wsi/ 联想官网出了个工具叫 联想驱动一键安装 我试用了下,发现其要联网才能安装,而我们装系统时,常常没有装网卡的驱动, 用其是更新...
  • 简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中。接着,在Ubuntu上为Android系统编写Linux内核驱动程序一文中举例子说明了如何在Linux内核编写驱动程序。在这一篇文章中,...
  • debian 安装时硬件驱动缺失怎么办?

    千次阅读 2017-04-09 17:39:36
    搜索到自己需要的驱动包,然后下载到U盘根目录下,插入安装系统的电脑上,一般就会自动识别并驱动。 实例:安装时debian8.7时,无线网卡驱动无法正常 提示:iwlwifi-3945-2.ucode 缺失操作步骤 > 登陆...
  • RTThread的串口驱动文件浅析

    千次阅读 2019-04-22 14:48:39
    设备无关层的作用为:一、向下为硬件驱动层提供:需要被实现的操作底层硬件的基本函数、需要被实现的结构体和注册函数,二、内部调用操作底层硬件的基本函数实现更为复杂的驱动功能,三、向上提供标准的驱动接口。...
  • 应用程序,操作系统,驱动程序的关系

    千次阅读 多人点赞 2018-07-18 15:39:17
    硬件和软件  计算机资源分为硬件资源和软件资源,硬件资源包括cpu,内存,显卡,网卡,声卡,硬盘等等。... 系统软件就是包各种硬件驱动程序,它们的任务就是用来驱动各种硬件,使硬件完成正常的功能。...
1 2 3 4 5 ... 20
收藏数 358,915
精华内容 143,566
关键字:

硬件驱动