Краткий анализ драйвера WiFi интерфейса SDIO [легко понять]
Краткий анализ драйвера WiFi интерфейса SDIO [легко понять]
Модуль SDIO-Wifi представляет собой встроенный модуль на основе интерфейса SDIO, который соответствует стандартам беспроводной сети Wi-Fi. Он имеет встроенный стек протоколов беспроводной сети IEEE802.11 и стек протоколов TCP/IP, который может осуществлять связь между пользовательскими устройствами. данные основной платформы и беспроводную сеть через порт SDIO Convert. SDIO обладает характеристиками быстрой передачи данных и совместим с интерфейсами SD и MMC.
Для интерфейса SDIO WiFi, прежде всего, это устройство карты SDIO, а затем оно имеет функцию WiFi. Поэтому при регистрации вам следует сначала зарегистрировать его как устройство карты SDIO. Затем после обнаружения карты необходимо погонять ее функцию wifi. Очевидно, для управления ею она использует протокол sdio, отправляя команды и данные. Давайте кратко рассмотрим соответствующие знания SDIO:
1. Анализ базовых знаний, связанных с SDIO
1. Интерфейс SDIO
Как следует из названия, SDIO означает интерфейс ввода-вывода SD, но это объяснение может быть немного абстрактным. Если быть более конкретным, изначально SD была стандартом для карт памяти, но теперь SD также можно использовать, подключившись к некоторым периферийным интерфейсам. Эта технология называется SDIO.
Таким образом, сама SDIO представляет собой довольно простую технологию. Она подключается к внешним периферийным устройствам через контакты ввода-вывода SD и передает данные на эти периферийные устройства через интерфейсы данных ввода-вывода на SD. также представлено множество. Полный драйвер стека SDIO делает разработку и применение периферийных устройств SDIO (мы называем их SDIO-картами) очень популярными.
В настоящее время многие мобильные телефоны и портативные устройства поддерживают функции SDIO (стандарт SD изначально был сформулирован для мобильных устройств), а также было разработано множество периферийных устройств SDIO, что упрощает подключение внешних периферийных устройств для мобильных телефонов и делает разработку более эффективной. встроенная периферия не требуется). В настоящее время распространенными периферийными устройствами SDIO (картами SDIO) являются:
· Карта Wi-Fi (карта беспроводной сети)
· Сенсорная карта CMOS (модуль камеры)
· GPS card
· GSM/GPRS modem card
· Bluetooth card
Применение SDIO станет одной из наиболее важных интерфейсных технологий в будущих встроенных системах, а также заменит текущий интерфейс SPI в стиле GPIO.
2. Шина SDIO
Шина SDIO аналогична шине USB. SDIO также имеет два конца, один из которых является концом HOST, а другой — концом устройства. Вся связь начинается с отправки команд HOST. Пока Устройство может анализировать команду, оно может взаимодействовать друг с другом.
Сигнал CLK: тактовый сигнал, передаваемый HOST на DEVICE, передающий команду каждый такт.
Сигнал CMD: двунаправленный сигнал, используемый для передачи команд и ответов.
Сигналы DAT0-DAT3: четыре линии данных для передачи.
Сигнал VDD: сигнал мощности.
VSS1, VSS2: сигнал заземления питания.
3. Принцип горячей замены SDIO
Способ: настроить проверку таймера или обнаружение прерываний плагина.
Аппаратное обеспечение: если GPG10 (EINT18) используется для обнаружения SD-карты.
GPG10 высокого уровня, то есть SD-карта не вставлена.
GPG10 — низкий уровень, то есть SD-карта вставлена.
4. Команда SDIO
На шине SDIO сторона HOST инициирует запрос, а затем сторона DEVICE отвечает на запрос. Команда sdio состоит из 6 байт.
a — Команда: команда, используемая для начала передачи, отправляется от ХОСТА к УСТРОЙСТВУ. Команда передается по сигнальной линии CMD.
b — Ответ: ответом является команда HOST, возвращаемая УСТРОЙСТВОМ в качестве ответа на команду. Он также передается по линии CMD.
c - Данные: данные передаются в обоих направлениях. Его можно установить в 1-проводной или 4-проводной режим. Данные передаются через сигнальную линию DAT0-DAT3.
Каждая операция SDIO инициируется HOST в строке CMD. Для некоторых CMD DEVICE должен возвращать ответ, а для других — нет.
Для команды чтения сначала ХОСТ отправит команду УСТРОЙСТВУ, а затем УСТРОЙСТВО вернет сигнал подтверждения. В это время, когда ХОСТ получит ответный сигнал подтверждения, он поместит данные в 4-битные данные. За ней также будет следовать код проверки CRC. Когда вся передача чтения будет завершена, HOST снова отправит команду, чтобы уведомить DEVICE о завершении операции, и в то же время DEVICE вернет ответ.
Для команд записи сначала ХОСТ отправит команду УСТРОЙСТВУ, а затем УСТРОЙСТВО вернет сигнал подтверждения. В это время, когда ХОСТ получит ответный сигнал подтверждения, он поместит данные в 4-битную линию данных. За ним также будет следовать код проверки CRC. Когда вся передача записи будет завершена, HOST снова отправит команду, чтобы уведомить DEVICE о завершении операции, и в то же время DEVICE вернет ответ.
2. Драйвер интерфейса SDIO
Как упоминалось ранее, WiFi интерфейса SDIO — это, прежде всего, устройство карты SDIO, а затем оно имеет функцию WiFi, поэтому драйвер WiFi интерфейса SDIO помещает оболочку драйвера SDIO в драйвер WiFi, а Драйвер SDIO по-прежнему соответствует идеям многоуровневого и разделения драйверов устройств:
Уровень драйвера устройства (устройство Wi-Fi)
|
Базовый уровень (предоставление интерфейсов вверх и вниз)
|
Уровень хост-драйвера (реализующий драйвер SDIO)
Давайте сначала проанализируем реализацию драйвера интерфейса SDIO и рассмотрим несколько важных структур данных (используемых для обработки обмена данными между базовым уровнем и уровнем драйвера хоста).
[ /include/linux/mmc/host.h ]
struct mmc_host используется для описания контроллера карты.
struct mmc_card используется для описания карты
struct mmc_driver используется для описания драйвера карты mmc.
struct sdio_func используется для описания функциональных устройств
Структура mmc_host_ops используется для описания функциональной функции интерфейса работы контроллера карты и используется для регистрации рабочих функций с уровня хост-контроллера на базовый уровень, тем самым изолируя базовый уровень от конкретного хост-контроллера. Другими словами, если ядро хочет управлять хост-контроллером, оно использует для работы указатель функции, указанный в этой операции, и не может напрямую вызвать функцию конкретного хост-контроллера.
.name = «s3c-sdi», //Соответствие имени и определения устройства платформы
.owner = THIS_MODULE,
.pm = s3cmci_pm_ops,
},
.id_table = s3cmci_driver_ids,
.probe = s3cmci_probe, //Функция интерфейса обнаружения устройств платформы
.remove = __devexit_p(s3cmci_remove),
.shutdown = s3cmci_shutdown,
};
s3cmci_probe(struct platform_device *pdev)
{
//….
struct mmc_host *mmc;
mmc = mmc_alloc_host(sizeof(struct s3cmci_host), &pdev->dev); //Выделяем структуру mmc_host
//…..
}
/*Регистрируем обработчик прерываний Functions3cmci_irq для обработки различных прерываний, вызванных процессом отправки и получения данных*/
request_irq(host->irq, s3cmci_irq, 0, DRIVER_NAME, host) //Регистрируем функции обработки прерываний3cmci_irq
/*Зарегистрируйте обработчик прерываний s3cmci_irq_cdфункцию для обработки прерываний, вызванных горячим подключением. Формат триггера прерывания: триггер по нарастающему или заднему фронту*/
mmc_add_host(mmc); //инициализируем оборудование хоста //Зарегистрируем драйвер хоста в ядре MMC
—-> device_add(&host->class_dev); //Добавляем устройство в список устройств на шине mmc_bus_type
—-> mmc_start_host(host); //Запускаем ммс host
/*Драйверы MMC должны вызывать этот метод, когда обнаруживают, что карта была вставлена или извлечена. Определить, была ли вставлена или извлечена SD-карта*/
—->mmc_detect_change(host, 0);
/*Запланировать отложенную работу в рабочей очереди MMC. Запланировать отложенную рабочую очередь*/
—->mmc_bus_put(host);//card При снятии с автобуса освободите занимаемое им место в автобусе.
/*Оцениваем текущий mmc Занят ли хост-контроллер, если занят текущий контроллер mmc, то host->claimed = 1; иначе 0;
*Если он равен 1, то в цикле while(1) будет вызвано расписание для отключения. Когда операция, занимающая контроллер MMC, будет завершена,выполните ее. *mmc_release_host()из времени,Активирую регистрацию наждать Ожидание в очереди&host->wqсерединаиздругой Программа получает право на использование основного контроллера mmc.
Серия вызовов функций здесь была объяснена в предыдущем разделе «москитная сетка» драйвера SD и не будет подробно описываться.
2. Горячая замена SDIO-устройств.
При подключении и отключении устройств SDIO,Вызовет уведомление о прерывании процессора,Затем выполните функцию обработки прерывания обнаружения карты в этой функции службы прерываний.,mmc_detect_change->mmc_schedule_delayed_work(&host->detect,delay), INIT_DELAYED_WORK(&host->detect, mmc_rescan) запланирует функцию mmc_rescan для задержки рабочей очереди планирования, что также запустит процесс инициализации устройства SDIO. После обнаружения действительного устройства SDIO оно будет зарегистрировано в системе.
Универсальная программная архитектура, основанная на Wi-Fi
1. Он разделен на две части: верхняя часть — это драйвер хоста, а нижняя — это прошивка, о которой мы упоминали ранее.
2. Основная работа части прошивки такова: поскольку антенна принимает и отправляет обратно кадры 802.11, а данные, принимаемые и передаваемые хостом, должны быть кадрами 802.3, то прошивка должна отвечать за кадры 802.3 и переходные кадры 802.11. между кадрами
3. Когда антенна получит данные и обработает их прошивкой, они будут помещены в буфер, и после получения прерывания будет сгенерировано прерывание.
Драйвер устройства SDIO определяется структурой sdio_driver, а sdio_driver фактически является пакетом драйвера. Загрузка драйвера устройства SDIO в ядро через функцию sdio_register_driver фактически монтирует его на шину sdio_bus_type.
1. Регистрация и сопоставление драйверов устройств.
Примечание. В процессе регистрации устройства или драйвера в системе будет вызвана функция сопоставления на соответствующей шине для сопоставления соответствующего драйвера или устройства. Сопоставление устройств sdio завершается функциями sdio_bus_match и sdio_bus_probe.
Судя по описанному выше процессу сопоставления, соответствующий драйвер или устройство сопоставляется путем сопоставления идентификатора в драйвере устройства id_table и sdio_driver. В конечном итоге будет вызвана функция .probe для завершения соответствующих операций.
2. Функция If_sdio_probe
при обнаруженииsdioОн будет вызван после того, как карта будет вставлена.If_sdio_probe,и будет вызван при извлечении картыIf_sdio_remove。
Давайте сначала посмотримIf_sdio_probetфункция,if_sdio_prob функция В основном делал две вещи
Основным методом получения данных сетевым оборудованием является запуск функции обработки прерывания устройства. Функция обработки прерывания определяет тип прерывания. Если это прерывание приема, полученные данные считываются и выделяется sk_buffструктура. буфер данных данных, скопируйте полученные данные в буфер данных и вызовите функцию netif_rx() для передачи sk_buff протоколу верхнего уровня.
Найдите if_sdio_interrupt, вы можете знать, что это sdio_claim_irq(func, if_sdio_interrupt) ,func->irq_handler = if_sdio_interrupt. При обработчике прерывания s3cmci_irqфункцияизS3C2410_SDIIMSK_SDIOIRQ При срабатывании прерывания будет вызвана функция if_sdio_interrupt() для получения данных.
//Уровень IP передает данные на уровень интерфейса протокола сетевого устройства через dev_queue_xmit(), а уровень сетевого интерфейса регистрирует их через netdevice Функцияиз Отправка данныхфункция
int dev_queue_xmit(struct sk_buff *skb)
if (!netif_tx_queue_stopped(txq)) {
__this_cpu_inc(xmit_recursion);
//Аппаратное обеспечение устройства начинает отправку
rc = dev_hard_start_xmit(skb, dev, txq);
//Операции вызова в сети Wi-Fi
rc = ops->ndo_start_xmit(skb, dev);
dev->netdev_ops = &lbs_netdev_ops; //Функция работы устройства
//Обработка данных прошивки sdio и данных ядра main_thread основного потока
ret = sdio_writesb(card->func, card->ioport, packet->buffer, packet->nb);
//порт расширения записи mmc
ret = mmc_io_rw_extended(func->card, write,func->num, addr, incr_addr, buf,blocks, func->cur_blksize);
//wait for request
mmc_wait_for_req(card->host, &mrq);
mrq->done_data = &complete;
mrq->done = mmc_wait_done;
mmc_start_request(host, mrq);
//Завершаем ожидание и завершаем запись данных
wait_for_completion(&complete);
host->ops->request(host, mrq);
//Завершаем и отправляем данные
5、Удалятьфункция
Когда sdio-карта будет удалена, драйвер вызовет эту функцию для завершения соответствующей операции. Например, занятые ресурсы освобождаются, функция func отключается и хост освобождается.
—->kthread_stop(priv->main_thread); //Завершаем поток ядра
lbs_free_adapter(priv);
lbs_cfg_free(priv);
free_netdev(dev);
flush_workqueue(card->workqueue); //Обновляем рабочую очередь
destroy_workqueue(card->workqueue);
sdio_claim_host(func);
sdio_release_irq(func);
sdio_disable_func(func);
sdio_release_host(func);
Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Этот сайт предоставляет только услуги по хранению информации, не имеет никаких прав собственности и не принимает на себя соответствующие юридические обязательства. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.
Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/186181.html Исходная ссылка: https://javaforall.cn