USB Audio Class (UAC) 分析_snd_usb_audio_create-程序员宅基地

技术标签: usb  Linux设备驱动  audio  Android  

一个UAC设备插入到Ubuntu 14.04电脑上dmesg中打印的信息如下:

[ 2367.490491] usb 3-3.2: new full-speed USB device number 9 using xhci_hcd
[ 2367.580010] usb 3-3.2: New USB device found, idVendor=0d8c, idProduct=0132
[ 2367.580018] usb 3-3.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 2367.580023] usb 3-3.2: Product: USB PnP Audio Device
[ 2367.580027] usb 3-3.2: Manufacturer: C-Media Electronics Inc.
[ 2367.581679] input: C-Media Electronics Inc. USB PnP Audio Device as /devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3.2/3-3.2:1.2/0003:0D8C:0132.0004/input/input18
[ 2367.581999] hid-generic 0003:0D8C:0132.0004: input,hidraw3: USB HID v1.11 Device [C-Media Electronics Inc. USB PnP Audio Device] on usb-0000:00:14.0-3.2/input2
[ 2367.913280] usbcore: registered new interface driver snd-usb-audio

这里可以看到其驱动程序为snd-usb-audio,依据这个关键词在内核中查找到如下内容:

tony@tony-E431:~/linux-3.4.y$ grep "registered new interface driver" ./ -rn
Binary file ./vmlinux.o matches
Binary file ./.tmp_vmlinux1 matches
Binary file ./.tmp_vmlinux2 matches
Binary file ./drivers/built-in.o matches
Binary file ./drivers/usb/built-in.o matches
Binary file ./drivers/usb/core/built-in.o matches
./drivers/usb/core/driver.c:865:    pr_info("%s: registered new interface driver %s\n",
Binary file ./drivers/usb/core/driver.o matches
Binary file ./drivers/usb/core/usbcore.o matches
Binary file ./arch/arm/boot/Image matches
Binary file ./vmlinux matches
tony@tony-E431:~/linux-3.4.y$ 

以及

// file: linux-3.4.y/sound/usb/card.c
/*
 * entry point for linux usb interface
 */

static struct usb_driver usb_audio_driver = {
    .name =     "snd-usb-audio",
    .probe =    usb_audio_probe,
    .disconnect =   usb_audio_disconnect,
    .suspend =  usb_audio_suspend,
    .resume =   usb_audio_resume,
    .id_table = usb_audio_ids,
    .supports_autosuspend = 1,
};

根据probe方法snd_usb_audio_probe调用了snd_usb_apply_boot_quirksnd_card_register,查到了

// linux-3.4.y/sound/usb/card.c
/*
 * new 2.5 USB kernel API
 */
static int usb_audio_probe(struct usb_interface *intf,
               const struct usb_device_id *id)
{
    struct snd_usb_audio *chip;
    chip = snd_usb_audio_probe(interface_to_usbdev(intf), intf, id);
    if (chip) {
        usb_set_intfdata(intf, chip);
        return 0;
    } else
        return -EIO;
}


// linux-3.4.y/sound/usb/quirks.c
int snd_usb_apply_boot_quirk(struct usb_device *dev,
                 struct usb_interface *intf,
                 const struct snd_usb_audio_quirk *quirk)
{
    u32 id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),
            le16_to_cpu(dev->descriptor.idProduct));

    switch (id) {
    case USB_ID(0x041e, 0x3000):
        /* SB Extigy needs special boot-up sequence */
        /* if more models come, this will go to the quirk list. */
        return snd_usb_extigy_boot_quirk(dev, intf);

    case USB_ID(0x041e, 0x3020):
        /* SB Audigy 2 NX needs its own boot-up magic, too */
        return snd_usb_audigy2nx_boot_quirk(dev);

    case USB_ID(0x10f5, 0x0200):
        /* C-Media CM106 / Turtle Beach Audio Advantage Roadie */
        return snd_usb_cm106_boot_quirk(dev);

    case USB_ID(0x0d8c, 0x0102):
        /* C-Media CM6206 / CM106-Like Sound Device */
    case USB_ID(0x0ccd, 0x00b1): /* Terratec Aureon 7.1 USB */
        return snd_usb_cm6206_boot_quirk(dev);

    case USB_ID(0x133e, 0x0815):
        /* Access Music VirusTI Desktop */
        return snd_usb_accessmusic_boot_quirk(dev);

    case USB_ID(0x17cc, 0x1000): /* Komplete Audio 6 */
    case USB_ID(0x17cc, 0x1010): /* Traktor Audio 6 */
    case USB_ID(0x17cc, 0x1020): /* Traktor Audio 10 */
        return snd_usb_nativeinstruments_boot_quirk(dev);
    case USB_ID(0x0763, 0x2012):  /* M-Audio Fast Track Pro USB */
        return snd_usb_fasttrackpro_boot_quirk(dev);
    }

    return 0;
}

snd_usb_audio_probe

/*
 * probe the active usb device
 *
 * note that this can be called multiple times per a device, when it
 * includes multiple audio control interfaces.
 *
 * thus we check the usb device pointer and creates the card instance
 * only at the first time.  the successive calls of this function will
 * append the pcm interface to the corresponding card.
 */
static struct snd_usb_audio *
snd_usb_audio_probe(struct usb_device *dev,
            struct usb_interface *intf,
            const struct usb_device_id *usb_id)
{
    const struct snd_usb_audio_quirk *quirk = (const struct snd_usb_audio_quirk *)usb_id->driver_info;
    int i, err;
    struct snd_usb_audio *chip;
    struct usb_host_interface *alts;
    int ifnum;
    u32 id;

    alts = &intf->altsetting[0];
    ifnum = get_iface_desc(alts)->bInterfaceNumber;
    id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),
            le16_to_cpu(dev->descriptor.idProduct));
    if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum)
        goto __err_val;

    if (snd_usb_apply_boot_quirk(dev, intf, quirk) < 0)
        goto __err_val;

    /*
     * found a config.  now register to ALSA
     */

    /* check whether it's already registered */
    chip = NULL;
    mutex_lock(&register_mutex);
    for (i = 0; i < SNDRV_CARDS; i++) {
        if (usb_chip[i] && usb_chip[i]->dev == dev) {
            if (usb_chip[i]->shutdown) {
                snd_printk(KERN_ERR "USB device is in the shutdown state, cannot create a card instance\n");
                goto __error;
            }
            chip = usb_chip[i];
            chip->probing = 1;
            break;
        }
    }
    if (! chip) {
        /* it's a fresh one.
         * now look for an empty slot and create a new card instance
         */
        for (i = 0; i < SNDRV_CARDS; i++)
            if (enable[i] && ! usb_chip[i] &&
                (vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) &&
                (pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) {
                if (snd_usb_audio_create(dev, i, quirk, &chip) < 0) {
                    goto __error;
                }
                snd_card_set_dev(chip->card, &intf->dev);
                chip->pm_intf = intf;
                break;
            }
        if (!chip) {
            printk(KERN_ERR "no available usb audio device\n");
            goto __error;
        }
    }

    /*
     * For devices with more than one control interface, we assume the
     * first contains the audio controls. We might need a more specific
     * check here in the future.
     */
    if (!chip->ctrl_intf)
        chip->ctrl_intf = alts;

    chip->txfr_quirk = 0;
    err = 1; /* continue */
    if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) {
        /* need some special handlings */
        if ((err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk)) < 0)
            goto __error;
    }

    if (err > 0) {
        /* create normal USB audio interfaces */
        if (snd_usb_create_streams(chip, ifnum) < 0 ||
            snd_usb_create_mixer(chip, ifnum, ignore_ctl_error) < 0) {
            goto __error;
        }
    }

    /* we are allowed to call snd_card_register() many times */
    if (snd_card_register(chip->card) < 0) {
        goto __error;
    }

    usb_chip[chip->index] = chip;
    chip->num_interfaces++;
    chip->probing = 0;
    mutex_unlock(&register_mutex);
    return chip;

 __error:
    if (chip) {
        if (!chip->num_interfaces)
            snd_card_free(chip->card);
        chip->probing = 0;
    }
    mutex_unlock(&register_mutex);
 __err_val:
    return NULL;
}

probe依次调用了:

snd_usb_apply_boot_quirk
snd_usb_audio_create
snd_usb_create_quirk
snd_usb_create_streams
 snd_usb_create_stream
  snd_usb_parse_audio_interface 这里根据usb的信息解析成pcm参数(如声道数量,采样率等等)

snd_usb_create_mixer
snd_card_register
// linux-3.4.y/sound/core/init.c
snd_card_register调用了init_info_for_card以及snd_device_register_all。

打开DEBUG后

<6>[   58.704000] usb 1-1.1: new full-speed USB device number 5 using nxp-ehci
<6>[   58.804000] usb 1-1.1: New USB device found, idVendor=0d8c, idProduct=0132
<6>[   58.812000] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
<6>[   58.820000] usb 1-1.1: Product: USB PnP Audio Device
<6>[   58.824000] usb 1-1.1: Manufacturer: C-Media Electronics Inc.
<6>[   58.832000] ALSA sound/usb/stream.c:438 5:1:1: add audio endpoint 0x82
<6>[   58.840000] ALSA sound/usb/stream.c:438 5:1:2: add audio endpoint 0x82
<6>[   58.848000] ALSA sound/usb/mixer.c:1214 [10] FU [Mic Capture Switch] ch = 1, val = 0/1/1
<3>[   58.856000] ALSA sound/usb/mixer.c:868 10:0: cannot get min/max values for control 2 (id 10)
<6>[   58.864000] ALSA sound/usb/mixer.c:1214 [10] FU [Mic Capture Volume] ch = 2, val = 0/1/1
<3>[   58.876000] ALSA sound/usb/mixer.c:868 10:0: cannot get min/max values for control 2 (id 10)
<6>[   58.884000] input: C-Media Electronics Inc. USB PnP Audio Device as /devices/platform/nxp-ehci/usb1/1-1/1-1.1/1-1.1:1.2/input/input6
<6>[   58.896000] generic-usb 0003:0D8C:0132.0003: input,hidraw0: USB HID v1.11 Device [C-Media Electronics Inc. USB PnP Audio Device] on usb-nxp-ehci-1.1/input2
Bus 003 Device 019: ID 0d8c:0132 C-Media Electronics, Inc. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        16
  idVendor           0x0d8c C-Media Electronics, Inc.
  idProduct          0x0132 
  bcdDevice            1.00
  iManufacturer           1 C-Media Electronics Inc.
  iProduct                2 USB PnP Audio Device
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          221
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0 
      iInterface              0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength           47
        bInCollection           1
        baInterfaceNr( 0)       1
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             2
        wTerminalType      0x0201 Microphone
        bAssocTerminal          0
        bNrChannels             2
        wChannelConfig     0x0003
          Left Front (L)
          Right Front (R)
        iChannelNames           0 
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             7
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID               8
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      5 (SELECTOR_UNIT)
        bUnitID                 8
        bNrInPins               1
        baSource( 0)           10
        iSelector               0 
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                10
        bSourceID               2
        bControlSize            1
        bmaControls( 0)      0x01
          Mute Control
        bmaControls( 1)      0x02
          Volume Control
        bmaControls( 2)      0x02
          Volume Control
        iFeature                0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           7
        bDelay                  1 frames
        wFormatTag              1 PCM
      AudioStreaming Interface Descriptor:
        bLength                29
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             1
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            7 Discrete
        tSamFreq[ 0]         8000
        tSamFreq[ 1]        11025
        tSamFreq[ 2]        16000
        tSamFreq[ 3]        22050
        tSamFreq[ 4]        32000
        tSamFreq[ 5]        44100
        tSamFreq[ 6]        48000
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0064  1x 100 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioControl Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         0 Undefined
          wLockDelay              0 Undefined
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       2
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           7
        bDelay                  1 frames
        wFormatTag              1 PCM
      AudioStreaming Interface Descriptor:
        bLength                29
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             2
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            7 Discrete
        tSamFreq[ 0]         8000
        tSamFreq[ 1]        11025
        tSamFreq[ 2]        16000
        tSamFreq[ 3]        22050
        tSamFreq[ 4]        32000
        tSamFreq[ 5]        44100
        tSamFreq[ 6]        48000
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x00c8  1x 200 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioControl Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         0 Undefined
          wLockDelay              0 Undefined
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      26
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x87  EP 7 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0010  1x 16 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)

总结:

UAC设备的参数是通过USB描述符确定的。比如声道bNrChannels位深bBitResolution采样率bSamFreqType。截取其中一段说明:

bNrChannels             1
bSubframeSize           2
bBitResolution         16
bSamFreqType            7 Discrete
tSamFreq[ 0]         8000
tSamFreq[ 1]        11025
tSamFreq[ 2]        16000
tSamFreq[ 3]        22050
tSamFreq[ 4]        32000
tSamFreq[ 5]        44100
tSamFreq[ 6]        48000

声道1,位深16,波特率8000~48000。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kangear/article/details/78485994

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签