精华内容
下载资源
问答
  • 线路驱动器和缓冲器

    千次阅读 2017-02-27 23:56:04
    线路驱动器:通常说计算机有地址、数据、控制三总线,由于总线上需要驱动的负载多,CPU是大规模集成电路,不具备功率驱动能力,总线驱动器的作用就是提供功率驱动,第二个原因是,CPU总线常常是分时复用总线,就是说...
    线路驱动器:通常说计算机有地址、数据、控制三总线,由于总线上需要驱动的负载多,CPU是大规模集成电路,不具备功率驱动能力,总线驱动器的作用就是提供功率驱动,第二个原因是,CPU总线常常是分时复用总线,就是说在不同的时段,管脚上出现的信号功能不同,需要锁存器存储并分离信号,总线驱动器起锁存器的作用。

    缓冲器:缓冲寄存器又称缓冲器,它分输入缓冲器和输出缓冲器两种。前者的作用是将外设送来的数据暂时存放,以便处理器将它取走;后者的作用是用来暂时存放处理器送往外设的数据。有了数控缓冲器,就可以使高速工作的CPU与慢速工作的外设起协调和缓冲作用,实现数据传送的同步。由于缓冲器接在数据总线上,故必须具有三态输出功能。
    展开全文
  • USB总线驱动程序

    2019-09-28 19:15:37
    USB主机控制:UHCI OHCI EHCI UHCI:intel 低速(1.5Mbps)(USB1.1)/全速(12Mbps)(USB2.0,USB2.0又...USB总线驱动程序的作用:1. 识别USB设备1.1 分配地址1.2 并告诉USB设备(set address)1.3 发出命令,获取描...

    USB主机控制器:UHCI OHCI EHCI

    UHCI:intel 低速(1.5Mbps)(USB1.1)/全速(12Mbps)(USB2.0,USB2.0又分为全速和高速)
    OHCI:microsoft:低速/全速
    EHCI:高速(480Mbps)

    USB总线驱动程序的作用
    1. 识别USB设备
    1.1 分配地址
    1.2 并告诉USB设备(set address)
    1.3 发出命令,获取描述符
    描述符的信息可以在include\linux\usb\ch9.h中看到

    2. 查找并安装对应的设备驱动程序
    3. 提供USB读写函数

    在程序中是如何调用的,简单的看一下:

    在drivers/usb/core/hub.c文件中:
    每一个USB控制器都自带有一个hub

    hub_irq
      kick_khubd
        hub_thread
          hub_events
            hub_port_connect_change
              choose_devnum //给新设备选择新的编号(地址)
              hub_port_init
                hub_set_address//把编号(地址)告诉USB设备,以后就使用这个地址了。
                usb_get_device_descriptor(udev, 8);//获取设备描述符
                retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);

              usb_new_device(udev)

                    //把device放入bus的dev链表,从bus的driver链表中取出driver,如果能够匹配,调用driver的probe
                device_add(&udev->dev);

    注意:这个中断是主机控制器里面注册的中断,不是usb设备的中断。当接上一个USB设备之后,硬件上的手脚就使得D+或D-由低电平变为高电平,硬件上就感知了有USB设备接入,里面就会产生某个中断。从而就有了上面的调用过程。

    hub_port_connect_change
      choose_devnum //给新设备选择新的编号(地址)
      /* Try to allocate the next devnum beginning at bus->devnum_next. */
      //查找下一个0位,显然某个地址用了,里面的相应的地址就会设置为1,表示这个地址正在使用。从1找到128,如果找不到,就会从头找。假设你上次插入USB设备号,它devnum=5,那么它就会从5开始找,找到128后,如果没找到,它会从1开始再找。就是找一圈后,如果没找到,再回来。从这个地方也可以看出,一个USB主机控制器最多可以接128个USB设备。
      devnum = find_next_zero_bit(bus->devmap.devicemap, 128,bus->devnum_next);

    2、分析几个重要的数据结构

    设备描述符:

    /* USB_DT_DEVICE: Device descriptor */
    struct usb_device_descriptor {
    __u8 bLength;
    __u8 bDescriptorType;

    __le16 bcdUSB; //USB版本号
    __u8 bDeviceClass;
    __u8 bDeviceSubClass;
    __u8 bDeviceProtocol;
    __u8 bMaxPacketSize0; //最大包大小,0表示端点0.每个设备都有端点0,因为是通过端点0识别出USB设备的
    __le16 idVendor; //厂家ID
    __le16 idProduct; //产品ID
    __le16 bcdDevice;
    __u8 iManufacturer;
    __u8 iProduct;
    __u8 iSerialNumber;
    __u8 bNumConfigurations;
    } __attribute__ ((packed));

    配置描述符:
    struct usb_config_descriptor {
    __u8 bLength;
    __u8 bDescriptorType;

    __le16 wTotalLength;
    __u8 bNumInterfaces;
    __u8 bConfigurationValue;
    __u8 iConfiguration;
    __u8 bmAttributes;
    __u8 bMaxPower;
    } __attribute__ ((packed));

    接口描述符:
    /* USB_DT_INTERFACE: Interface descriptor */
    struct usb_interface_descriptor {
    __u8 bLength;
    __u8 bDescriptorType;

    __u8 bInterfaceNumber;
    __u8 bAlternateSetting;
    __u8 bNumEndpoints;
    __u8 bInterfaceClass;
    __u8 bInterfaceSubClass;
    __u8 bInterfaceProtocol;
    __u8 iInterface;
    } __attribute__ ((packed));

    端点描述符
    /* USB_DT_ENDPOINT: Endpoint descriptor */
    struct usb_endpoint_descriptor {
    __u8 bLength;
    __u8 bDescriptorType;

    __u8 bEndpointAddress;
    __u8 bmAttributes;
    __le16 wMaxPacketSize; //从端点中一次写入或读出多少数据
    __u8 bInterval;用查询的方式实现实时性的,此变量就表示查询的时间间隔。

    /* NOTE: these two are _only_ in audio endpoints. */
    /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
    __u8 bRefresh;
    __u8 bSynchAddress;
    } __attribute__ ((packed));

    它们的关系:

    每一个USB设备,都有一个设备描述符,可以发出某些命令,得到USB设备描述符。一个硬件里面有一个设备描述符,
    一个设备描述符里面还有配置描述符,一个设备描述符里面可能有多个配置描述符。

     

     本节只是进行了简单的分析,并没有进行深入分析。需看《linux内核源码代码情景分析》

    转载于:https://www.cnblogs.com/-glb/p/11568992.html

    展开全文
  • 尤其是快速连接在冷却系统性能和可靠性方面发挥了不可或缺的作用。  长久以来,形成经济有效的安全冷却系统来消除余热,对数据中心来说是个日益严重的问题。过去的十年里,由于服务器机架的功率密度上升,服务器...
  • 越来越多的人在问关于 EIA/TIA-485(俗称 RS-485 数据传输标准)基本概念的一些问题,这一事实表明未来数年 RS-485 仍会在各种工业接口中起到举足轻重的作用
  • I2C总线在Linux系统中的驱动设计,介绍I2C总线的...在以S3C2410为微控制,ZLG7290为I2C总线扩展器件基础上,介绍通过I2C总线读取键盘硬件、软件设计,该系统设计体现了I2C总线在嵌入式系统设计应用中重要作用
  • 驱动程序之_13_字符设备_USB设备_2_总线驱动程序 USB主机控制有三种规范 其中 USB1.1支持低速(1.5Mbps) USB2.0支持全速/高速(12Mbps...USB总线驱动的作用: 1、识别USB设备 2、查找、安装USB设备驱动 ...

    驱动程序之_1_字符设备_13_USB设备_2_USB总线驱动_分析

    USB主机控制器有三种规范
    在这里插入图片描述

    其中
    USB1.1支持低速(1.5Mbps)
    USB2.0支持全速/高速(12Mbps/480Mbps)
    目测最新的USB3.0最高传输速度是USB2.0的10倍(4.8Gbps),并且更节能

    S3C2410的USB规范使用的是OHCI

    USB总线驱动的作用:
    1、识别USB设备
    2、查找、安装USB设备驱动
    3、提供USB设备的读写接口

    在识别USB设备过程中:
    1、分配地址,告诉USB设备
    2、发出命令,获取设备描述符

    第一次接入设备,提示
    在这里插入图片描述
    拔出时提示
    在这里插入图片描述
    第二次:
    在这里插入图片描述

    在内核的drivers目录下搜索"USB device using"

    grep "USB device using" * -nR
    

    找到总线驱动程序所在文件drivers/usb/core/hub.c(hub是USB主机自带的一个USB设备)
    设备检测信息在hub_port_init函数中被打印
    hub_port_init由hub_port_connect_change调用
    hub_port_connect_change由hub_events调用
    hub_events由hub_thread调用
    hub_thread中进程进入休眠,在kick_khubd唤醒
    kick_khubd由usb_kick_khubd调用
    usb_kick_khubd由hub_irq调用

    在hub_port_connect_change
    1、choose_address,为设备分配地址,地址最大分配到127(1~127)
    2、hub_port_init,设置端口地址,读取、解析描述符(先读取前8字节,得到最大包大小)
    3、usb_new_device,将设备添加到总线链表,从总线driver链表中取出成员与之比较,若匹配,则建立联系

    static void hub_port_connect_change(struct usb_hub *hub, int port1, u16 portstatus, u16 portchange)
    {
    /*********************************/
    	choose_address(udev);
    /*********************************/
    	status = hub_port_init(hub, udev, port1, i);
    /*********************************/	
    	status = usb_new_device(udev);
    /*********************************/	
    }
    
    static void choose_address(struct usb_device *udev)
    {
    	int		devnum;
    	struct usb_bus	*bus = udev->bus;
    
    	/* If khubd ever becomes multithreaded, this will need a lock */
    
    	/* Try to allocate the next devnum beginning at bus->devnum_next. */
    	devnum = find_next_zero_bit(bus->devmap.devicemap, 128,
    			bus->devnum_next);
    	if (devnum >= 128)
    		devnum = find_next_zero_bit(bus->devmap.devicemap, 128, 1);
    
    	bus->devnum_next = ( devnum >= 127 ? 1 : devnum + 1);
    
    	if (devnum < 128) {
    		set_bit(devnum, bus->devmap.devicemap);
    		udev->devnum = devnum;
    	}
    }
    
    
    static int hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, int retry_counter)
    {
    /*********************************/
    	for (j = 0; j < SET_ADDRESS_TRIES; ++j) {
    			retval = hub_set_address(udev);
    			if (retval >= 0)
    				break;
    			msleep(200);
    	}
    /*********************************/
    	retval = usb_get_device_descriptor(udev, 8);	
    /*********************************/
    }
    
    struct usb_device_descriptor {
    /**************前8字节*******************/
    	__u8  bLength;
    	__u8  bDescriptorType;
    
    	__le16 bcdUSB;
    	__u8  bDeviceClass;
    	__u8  bDeviceSubClass;
    	__u8  bDeviceProtocol;
    	__u8  bMaxPacketSize0;
    /**************前8字节*******************/
    	__le16 idVendor;
    	__le16 idProduct;
    	__le16 bcdDevice;
    	__u8  iManufacturer;
    	__u8  iProduct;
    	__u8  iSerialNumber;
    	__u8  bNumConfigurations;
    } __attribute__ ((packed));
    
    int usb_new_device(struct usb_device *udev)
    {
    /*********************************/
    	err = device_add(&udev->dev);
    /*********************************/	
    }
    
    int device_add(struct device *dev)
    {
    /*********************************/	
    		/* tie the class to the device */
    		list_add_tail(&dev->node, &dev->class->devices);
    		/* notify any interfaces that the device is here */
    		list_for_each_entry(class_intf, &dev->class->interfaces, node)
    			if (class_intf->add_dev)
    				class_intf->add_dev(dev, class_intf);		
    /*********************************/	
    }
    

    一个设备具有一个设备描述符,设备描述符下面有接口描述符,接口描述符又有端点描述符
    描述符规范位于include/linux/usb/Ch9.h

    展开全文
  • 其在很多电路中都有着较为重要的作用,比如在微机测控系统中的功率接口电路就涉及到光耦。本文将对光耦的功率接口设计方案进行介绍。感兴趣的朋友快来看一看吧。  光电耦合是以光为媒介传输电信号的一种电一光一...
  • 如电源线、显示线、打印机电缆、网线、音箱线、鼠标线、键盘线以及各种各样USB接口线,常常计算机后面凌乱不堪。随着无线技术迅速发展。计算机各种附属设备也有无线化趋势。其中最典型是无线键盘和...
  • 越来越多的人在问关于EIA/TIA-485(俗称RS-485数据传输标准)基本概念的一些问题,这一事实表明未来数年RS-485仍会在各种工业接口中起到举足轻重的作用
  • 基于一款超扭曲阵列液晶显示(STN-LCD)控制驱动器的专用集成电路(ASIC)的设计与实现,从功耗管理、时钟规划和总线仲裁三个方面阐述了低功耗系统规划方法;并分析了门控时钟、重定时和逻辑优化等低功耗技术在指令译码...
  • 驱动_Platform平台总线

    2019-05-28 17:21:00
    作用:实现硬件操作方法和设备信息分离,便于SOC控制器驱动的升级 <结构体> platform_driver {  struct platform_driver {  int (*probe)(struct platform_device *); //实现初级驱动中...

    platform

     

    作用:实现硬件的操作方法和设备信息的分离,便于SOC控制器驱动的升级

     

     

     

     

    <结构体>

    platform_driver {

      struct platform_driver {

      int (*probe)(struct platform_device *); //实现初级驱动中加载函数中的代码

      (1.实例化全局对象-----kzalloc)

      (2.申请设备号 --- register_chrdev)

      (3.自动创建设备节点 ---- class_create,device_create)

      (4.拿到pdev中的资源)

      (5.初始化硬件------ ioremap)

      (6.实现file_opretions)

      int (*remove)(struct platform_device *); //实现初级驱动中卸载函数中的代码

      void (*shutdown)(struct platform_device *);   // 电源管理

      int (*suspend)(struct platform_device *, pm_message_t state);    // 电源管理

      int (*resume)(struct platform_device *);      // 电源管理

      struct device_driver driver;

      const struct platform_device_id *id_table; //与pdev中的名称匹配

    }

     

    platform_bus_type {

      const char *name;

      struct bus_attribute *bus_attrs;

      struct device_attribute *dev_attrs;

      struct driver_attribute *drv_attrs;

      int (*uevent)(struct device *dev, struct kobj_uevent_env *env);

      int (*probe)(struct device *dev);

      int (*remove)(struct device *dev);

      void (*shutdown)(struct device *dev);

      int (*suspend)(struct device *dev, pm_message_t state);

      int (*resume)(struct device *dev);

      const struct dev_pm_ops *pm;

      struct subsys_private *p;

      int (*match)(struct device *dev, struct device_driver *drv); // 匹配方法-------------↓

    }                                                              ↓            

    static int platform_match (struct device *dev, struct device_driver *drv){
        struct platform_device *pdev = to_platform_device(dev);
        struct platform_driver *pdrv = to_platform_driver(drv);

        /* Attempt an OF style match first */
        if (of_driver_match_device(dev, drv))
        return 1;

        /* Then try to match against the id table */
        if (pdrv->id_table)
        return platform_match_id(pdrv->id_table, pdev) != NULL;

        /* fall-back to driver name match */
        return (strcmp(pdev->name, drv->name) == 0);
      }

     

     

    platform_device {

      const char * name; //名字,用于与pdrv匹配

      int id; //表示不同寄存器组的编号,一般可以填:-1

      struct device dev; //父类    ——————>  void *platform_data;    /指向自定义数据的指针

      const struct platform_device_id *id_entry;/* MFD cell pointer */

      struct mfd_cell *mfd_cell;/* arch specific additions */

      struct pdev_archdata archdata;

      u32 num_resources; //资源的个数

      struct resource * resource; //资源的详细信息----描述中断或者内存地址————↓

    }                                      ↓

    struct  resource {
      resource_size_t start; //如果资源为地址,则为起始地址,如果是中断,则表示中断号
      resource_size_t end; //如果资源为地址,则为最后一个字节的地址,如果是中断,则表示中断号
      const char *name;
      unsigned long flags;
      struct resource *parent, *sibling, *child;

    };

     

     

    <函数>

      注册:
       int platform_driver_register(struct platform_driver *);
       void platform_driver_unregister(struct platform_driver *);

     

       代码示例:https://www.cnblogs.com/panda-w/p/10991957.html

     

     

    <笔记>

    1. 总线匹配成功自动调用pdrv中的probe方法;

    2. pdrv可以一对多,只要名字相同均可匹配

    3. 什么时候用平台总线:------将操作和数据(资源,自定义数据)分离

      1,只要有设备地址和中断都可以用
      2,如果驱动需要咋多个平台总升级使用  

    4. 查看平台总线:ls /sys/bus/platform/devices/  (内核启动自动调用,开机批量注册pdev)

    5. 因为probe 和 remove都在pdrv实现,卸载驱动时,要先卸载pdev,然后再卸载pdrv

    6. gpio口的寄存器初始化操作方式:   

        看原理图 ----> 看芯片手册 ------> 寄存器地址 --------> ioremap(地址映射)
        *gpc0_conf &= ~(0xff<<12);
        *gpco_conf |= 0x11<<12;

        

      1, 直接地址操作
        volatile unsigned long *gpc0conf;
        volatile unsigned long *gpc0data;

        gpc0conf = ioremap(地址, 长度);
        gpc0conf = gpc0data + 1; 

      2, 内核提供的库函数操作
        __raw_readl(地址)       __raw_writel(value, 地址);

        unsigned long value = __raw_readl(led_reg_base);
        value &= ~(0xff<<12);
        value |= (0x11<<12); //配置成输出功能
        __raw_writel(value, led_reg_base);

     

     

    7. 内核提供的接口: readl/writel ------ __raw_readl       __raw_writel   

        static unsigned int __raw_readl(unsigned int ptr) //参数: ptr ----- 地址:address
        {
          return *((volatile unsigned int *)ptr);
        }

        

        static void __raw_writel(unsigned int value, unsigned int ptr) //参数: value--写入的数据,ptr---地址:address
        {
          *((volatile unsigned int *)ptr) = value;
        }

    8. 编程思想:      

    第一步:设计自定义数据类型:                        
      struct led_platdata{      //设计一个平台总线的自定义数据类型
       char *name;
       int shift; //移位数
       int conf_reg_data; //配置寄存器的值
       int conf_reg_clear; //配置寄存器的值清空
       int data_reg; //数据寄存器的值
      };
    第二步:在pdev中初始化自定义数据
      struct led_platdata led_pdata = {
       .name = "gpc0_3/4",
       .shift = 3,
       .conf_reg_data = 0x11,
       .conf_reg_clear = 0xff,
       .data_reg = 0x3,

      };
    第三步:
      struct platform_device led_pdev = {
       .name = "s5pv210_led",
       .id = -1,
       .num_resources = ARRAY_SIZE(led_resource),
       .resource = led_resource,
       .dev = {
       .platform_data = &led_pdata, //将自定义数据赋给pdev的父类中的:platform_data
       .release = led_dev_release,
      },

    9. 平台总线默认内核就自动帮我们创建,使用平台总线编写驱动,将一个驱动分成两个模块:pdev,pdrv

    10.  杂项设备的注册: 默认的主设备号是10  

      struct miscdevice {
       int minor; //次设备--自由定义--0-255之间
       const char *name; //设备节点的名字
       const struct file_operations *fops; //文件操作接口
       struct list_head list; //链表
      };

     

    转载于:https://www.cnblogs.com/panda-w/p/10922753.html

    展开全文
  • 高压侧前置场 FET 驱动器和功率 FET 组合被广泛地用于负载控制,例如:车载电子白炽灯泡、继电器螺线管和传输螺线管等。这种组合还可能被应用于那些要求通过串行总线通信或者并行输入控制来实现负载控制工业和...
  • 本文首先介绍了总线驱动器的作用,接着详述了74LS245的功能特点及推荐工作条件,依据74LS245的逻辑功能编制了Proteus仿真电路并设计了驱动程序,最后对本文的实验仿真效果进行了总结。
  • 磁盘控制器的作用是参与底层的总线初始化、仲裁等过程以及指令传输过程、指令传输状态机、重传、ACK确认等,将这些太过底层的机制过滤掉,从而向驱动程序提供一种简洁的接口。驱动程序只要将读写的设备号、起始地址...
  •  MAX7348 是美国MAXIM 公司生产的2 线接口、低EMI 键盘开关和发声控制器,可监控多达40 个按键,可对按键去抖并保存在FIFO 中,去抖时间用户可在9 ~ 40ms 之间任意设置,MAX7348 自带的音调发生器在控制器的作用下...
  •  MAX7348 是美国MAXIM 公司生产的2 线接口、低EMI 键盘开关和发声控制器,可监控多达40 个按键,可对按键去抖并保存在FIFO 中,去抖时间用户可在9 ~ 40ms 之间任意设置,MAX7348 自带的音调发生器在控制器的作用下...
  • 这里,介绍 CAN总线结构特点及常用 CAN总线驱动器 PCA82C250结构特点和传输导线特点并对 二者建立了各自数学模型。最后依据 CAN总线物理层结构特点和驱动器模型、导线模型建立了物理层 数学模型。
  • 运动控制系统是以机械运动的驱动设备—电动机为控制对象, 以控制为核心, 以电力电子、功率变换装置为执行机构, 在自动控制理论指导下组成电气传动控制系统。在电气时代, 电动机一直在现代化生产和生活中起着...
  • 总线协议CANOPEN

    2018-07-21 18:07:01
    can总线,打家学习学习学习学装备、机器人、电动汽车,过程工业,集成电路制造工业等领域发挥着日趋重要的作用。 为了适应瞬息多变的市场需求并且保持良好的市场竞争力,提出了装备研发制造定制 化、标准化、模块...
  •  运动控制系统是以机械运动的驱动设备—电动机为控制对象, 以控制为核心, 以电力电子、功率变换装置为执行机构, 在自动控制理论指导下组成电气传动控制系统。在电气时代, 电动机一直在现代化生产和生活中起着...
  • CAN的2.0规范和几种功能典型且流行的CAN控制器和驱动器的详细资料;在作者实验和开发应用CAN技术的成果基础上,详细介绍了CAN的应用开发技术,从硬件的设计到各个基本软件功能模块的编写,其中包括CAN控制器与单片机...
  • 在发展过程中电厂无疑起着巨大作用,我国发电厂越来越多,其中火电厂数量位居第一。火电厂是我国最主要废气排放源,也是废气污染问题治理重点。这些废气不仅对大气有一定污染,还给周围居民生活带来不便,...
  • 1. I2C子系统架构 1.1 I2C核心 I2C总线和I2C设备驱动的中间枢纽,有两个作用: 1)提供了I2C总线驱动和设备驱动的注册、注销方法等。...对I2C控制器的驱动实现,控制器可以在CPU外部,也可以集成在CPU内部(I2...
  • 8086学习(二)总线IO

    2020-05-09 15:05:02
    而缓冲呢,主要起到信号加强的作用,感觉很鸡肋啊,其实不是,信号衰减到不可测是很寻常的事情,不能说缓冲没用。缓冲多用在总线上,提高总线驱动能力。 关于IO总线这一方面的确是比较散,先讲一些IO芯片...
  • 嵌入式驱动中的驱动编写工作,...也就是将之前单一驱动工作的拆分成三部分,USB控制器的总线控制驱动,中间桥梁作用的核心层驱动,以及设备层的设备驱动。 这样总线驱动和核心层驱动为重复性工作,不需改动,所以工...
  • 为防止信息相互干扰,要求凡挂在总线寄存器或存储器等,它传输端不仅能呈现0、1两个信息状态,而且还应能呈现第三种状态——高阻抗状态(又称高阻状态),即此时好像它们输出被断开,对总线状态不起作用,...
  • PCI驱动

    2012-11-12 22:36:16
    外围设备互连(PCI)是一种将系统中...PCI总线和PCI-PCI桥接在连接系统中设备到上起关键作用,在这个系统中CPU和视频设备被连到PCI bus 0上,它是系统中主干PCI总线。而PCI-PCI桥接这个特殊PCI设备将主干总线PCI b
  • 通过动力电池组荷电状态SOC逻辑门限控制策略,当动力电池组SOC低于门限值后,APU开启,起到增程器的作用。整车控制器以瑞萨科技的32位微控制器uPD70F3380为核心,实现数字I/O、模拟量的采集以及CAN总线通信、多能源管理...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 143
精华内容 57
关键字:

总线驱动器的作用