在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > Linux ALSA聲卡驅(qū)動之二:聲卡的創(chuàng)建

            Linux ALSA聲卡驅(qū)動之二:聲卡的創(chuàng)建

            作者: 時間:2016-12-07 來源:網(wǎng)絡 收藏

              1. struct snd_card

            本文引用地址:http://www.biyoush.com/article/201612/341246.htm

              1.1. snd_card是什么

              snd_card可以說是整個音頻驅(qū)動最頂層的一個結(jié)構(gòu),整個聲卡的軟件邏輯結(jié)構(gòu)開始于該結(jié)構(gòu),幾乎所有與聲音相關(guān)的邏輯設(shè)備都是在snd_card的管理之下,聲卡驅(qū)動的第一個動作通常就是創(chuàng)建一個snd_card結(jié)構(gòu)體。正因為如此,本節(jié)中,我們也從 struct cnd_card開始吧。

              1.2. snd_card的定義

              snd_card的定義位于改頭文件中:include/sound/core.h

              /* main structure for soundcard */

              struct snd_card {

              int number; /* number of soundcard (index to

              snd_cards) */

              char id[16]; /* id string of this card */

              char driver[16]; /* driver name */

              char shortname[32]; /* short name of this soundcard */

              char longname[80]; /* name of this soundcard */

              char mixername[80]; /* mixer name */

              char components[128]; /* card components delimited with

              space */

              struct module *module; /* top-level module */

              void *private_data; /* private data for soundcard */

              void (*private_free) (struct snd_card *card); /* callback for freeing of

              private data */

              struct list_head devices; /* devices */

              unsigned int last_numid; /* last used numeric ID */

              struct rw_semaphore controls_rwsem; /* controls list lock */

              rwlock_t ctl_files_rwlock; /* ctl_files list lock */

              int controls_count; /* count of all controls */

              int user_ctl_count; /* count of all user controls */

              struct list_head controls; /* all controls for this card */

              struct list_head ctl_files; /* active control files */

              struct snd_info_entry *proc_root; /* root for soundcard specific files */

              struct snd_info_entry *proc_id; /* the card id */

              struct proc_dir_entry *proc_root_link; /* number link to real id */

              struct list_head files_list; /* all files associated to this card */

              struct snd_shutdown_f_ops *s_f_ops; /* file operations in the shutdown

              state */

              spinlock_t files_lock; /* lock the files for this card */

              int shutdown; /* this card is going down */

              int free_on_last_close; /* free in context of file_release */

              wait_queue_head_t shutdown_sleep;

              struct device *dev; /* device assigned to this card */

              #ifndef CONFIG_SYSFS_DEPRECATED

              struct device *card_dev; /* cardX object for sysfs */

              #endif

              #ifdef CONFIG_PM

              unsigned int power_state; /* power state */

              struct mutex power_lock; /* power lock */

              wait_queue_head_t power_sleep;

              #endif

              #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)

              struct snd_mixer_oss *mixer_oss;

              int mixer_oss_change_count;

              #endif

              };

              struct list_head devices 記錄該聲卡下所有邏輯設(shè)備的鏈表

              struct list_head controls 記錄該聲卡下所有的控制單元的鏈表

              void *private_data 聲卡的私有數(shù)據(jù),可以在創(chuàng)建聲卡時通過參數(shù)指定數(shù)據(jù)的大小

              2. 聲卡的建立流程

              2.1.1. 第一步,創(chuàng)建snd_card的一個實例

              struct snd_card *card;

              int err;

              ....

              err = snd_card_create(index, id, THIS_MODULE, 0, &card);

              index 一個整數(shù)值,該聲卡的編號

              id 字符串,聲卡的標識符

              第四個參數(shù) 該參數(shù)決定在創(chuàng)建snd_card實例時,需要同時額外分配的私有數(shù)據(jù)的大小,該數(shù)據(jù)的指針最終會賦值給snd_card的private_data數(shù)據(jù)成員

              card 返回所創(chuàng)建的snd_card實例的指針

              2.1.2. 第二步,創(chuàng)建聲卡的芯片專用數(shù)據(jù)

              聲卡的專用數(shù)據(jù)主要用于存放該聲卡的一些資源信息,例如中斷資源、io資源、dma資源等??梢杂袃煞N創(chuàng)建方法:

              通過上一步中snd_card_create()中的第四個參數(shù),讓snd_card_create自己創(chuàng)建

              // struct mychip 用于保存專用數(shù)據(jù)

              err = snd_card_create(index, id, THIS_MODULE,

              sizeof(struct mychip), &card);

              // 從private_data中取出

              struct mychip *chip = card->private_data;

              自己創(chuàng)建:

              struct mychip {

              struct snd_card *card;

              ....

              };

              struct snd_card *card;

              struct mychip *chip;

              chip = kzalloc(sizeof(*chip), GFP_KERNEL);

              ......

              err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);

              // 專用數(shù)據(jù)記錄snd_card實例

              chip->card = card;

              .....

              然后,把芯片的專有數(shù)據(jù)注冊為聲卡的一個低階設(shè)備:

              static int snd_mychip_dev_free(struct snd_device *device)

              {

              return snd_mychip_free(device->device_data);

              }

              static struct snd_device_ops ops = {

              .dev_free = snd_mychip_dev_free,

              };

              ....

              snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);

              注冊為低階設(shè)備主要是為了當聲卡被注銷時,芯片專用數(shù)據(jù)所占用的內(nèi)存可以被自動地釋放。

              2.1.3. 第三步,設(shè)置Driver的ID和名字

              strcpy(card->driver, "My Chip");

              strcpy(card->shortname, "My Own Chip 123");

              sprintf(card->longname, "%s at 0x%lx irq %i",

              card->shortname, chip->ioport, chip->irq);

              snd_card的driver字段保存著芯片的ID字符串,user空間的alsa-lib會使用到該字符串,所以必須要保證該ID的唯一性。shortname字段更多地用于打印信息,longname字段則會出現(xiàn)在/proc/asound/cards中。


            上一頁 1 2 下一頁

            關(guān)鍵詞: Linux ALSA

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉