Der Erste: 1. Fügen Sie wichtige Headerdateien hinzu: #include <linux/of_gpio.h> #include <linux/gpio.h> #include <linux/delay.h> #include <linux/module.h> #include <linux/types.h> #include <linux/kobject.h> 2. Suchen Sie in der vorhandenen Treiberdatei nach dem Schlüsselwort „DEVICE_ATTR“. Wenn es vorhanden ist, fügen Sie einfach eines hinzu, indem Sie wie folgt auf die vorhandene Methode verweisen: unsigned int Gpio134_OtgID = 134; //globale Variablen definieren static unsigned int otgid_status = 1; … 3. Definieren Sie die Lese- und Schreibfunktionen des Dateisystems: //Fügen Sie die OTG-ID „zhaojr gpio134 control“ für den Host- oder Gerätemodus hinzu statisches ssize_t setotgid_store(Struktur Gerät *dev, Struktur Geräteattribut *attr, const char *buf, size_t Anzahl) { vorzeichenlose Ganzzahl ret=0; pr_err("%s: \n", __func__); //ret = kstrtoint(buf, 10, &otgid_status); ret = kstrtouint(buf, 10, &otgid_status); //sscanf(buf, "%lu", &otgid_status); wenn (ret < 0){ pr_err("%s::kstrtouint() ist fehlgeschlagen \n", __func__); } //sscanf(buf, "%d", &otgid_status); pr_err("%s: otgid_status=%d \n", __func__,otgid_status); wenn (otgid_status > 0) { gpio_set_value(Gpio134_OtgID, 1); }anders{ gpio_set_value(Gpio134_OtgID, 0); } Anzahl zurückgeben; } statisches ssize_t setotgid_show(Struktur Gerät *dev, Struktur Geräteattribut *attr, char *buf) { pr_err("%s: \n", __func__); gibt sprintf(buf, "%d\n",otgid_status) zurück; } //statisch DEVICE_ATTR_RW(setotgid); /*Struktur Geräteattribut dev_attr_setotgid = { .attr = {.name ="setotgid", .mode = 0664}, .show = setotgid_show, .store = setotgid_store, };*/ // Die Konsistenz von setotgid, der erste Parameter setotgid muss mit setotgid_show und setotgid_store konsistent sein static DEVICE_ATTR(setotgid, 0664, setotgid_show, setotgid_store); //Ende zhaojr hinzufügen statische Struktur Geräteattribut *android_usb_attributes[] = { &dev_attr_state, &dev_attr_setotgid, //setotgid und der durch DEVICE_ATTR definierte Name müssen konsistent NULL sein. }; 4. Definieren Sie die Anforderung und Initialisierung für bestimmte GPIO-Pins in der Funktion probe() statische int mdss_mdp_probe(Struktur platform_device *pdev) { .................................................................................................................... //zhaojr für gpio134 zum USB-Host oder Gerätemodus hinzufügen ret_status = gpio_request(Gpio134_OtgID, "Gpio134-OtgID"); wenn(ret_status<0){ pr_err("USB-Gadget-Konfigurationsdateien %s::Gpio134_OtgID GPIO-Anforderung fehlgeschlagen\n",__func__); } pr_err("android_device_create()::Gpio134_OtgID gpio_request OK\n"); gpio_direction_output(Gpio134_OtgID,1); if(otgid_status > 0){ //Wenn ein benutzerdefinierter Initialisierungsstatus vorhanden ist, fügen Sie diese Beurteilung hinzu. Wenn nicht, muss die if else-Operation nicht hinzugefügt werden pr_err("%s-Gpio134_OtgID pin set 1\n", __func__); gpio_set_value(Gpio134_OtgID, 1); //msleep(5); }anders{ pr_err("%s-Gpio134_OtgID-Pin gesetzt 0\n", __func__); gpio_set_value(Gpio134_OtgID, 0); //msleep(5); } //Ende zhaojr hinzufügen ................................................................ } 5. Fügen Sie die Ressourcenfreigabe in der Funktion remove() hinzu statische int mdss_mdp_remove(Struktur platform_device *pdev) { Struktur mdss_data_type *mdata = platform_get_drvdata(pdev); wenn (!mdata) Rückgabe -ENODEV; pr_err("%s\n", __func__); gpio_free(Gpio134_OtgID); //zhaojr freien GPIO-OTGID-Pin hinzufügen ........................................................ } Zweite Methode: Für den Fall, dass das Schlüsselwort „DEVICE_ATTR“ nicht in der hinzuzufügenden Treiberdatei gesucht wird, wie etwa beim Hinzufügen einer Steuerschnittstelle zum Ein- und Ausschalten des Audioverstärkers: #include <linux/of_gpio.h> #include <linux/gpio.h> #include <linux/delay.h> #include <linux/module.h> #include <linux/types.h> #include <linux/kobject.h> 2. Definieren Sie globale Variablen, definieren Sie offene und geschlossene Schnittstellen und organisieren Sie Attribut-Arrays: // füge zhaojr gpio63 zum Schließen oder Aktivieren der Lautsprecher-PA hinzu Struktur kobject *spk_pa_kobj = NULL; unsigned int gpio63_spk_pa_gpio; //für Lautsprecher-PA-IC aktivieren //extern unsigned int gpio63_spk_pa_gpio; statische vorzeichenlose int SpkPa_Gpio_Enable = 0; statisches ssize_t spkpaon_store (Struktur Gerät *dev, Struktur Geräteattribut *attr, const char *buf, size_t Anzahl) { vorzeichenlose Ganzzahl ret=0; //ret = kstrtoint(buf, 10, &backlight_enable); ret = kstrtouint(buf, 10, &SpkPa_Gpio_Enable); wenn (ret < 0){ pr_err("%s::kstrtouint() ist fehlgeschlagen \n", __func__); } pr_err("%s: SpkPa_Gpio_Enable=%d \n", __func__,SpkPa_Gpio_Enable); wenn(SpkPa_Gpio_Enable > 0){ //gpio_set_value(gpio63_spk_pa_gpio, 1); pr_err("%s: gpio_set_value gpio63 Lautsprecher PA aktivieren \n", __func__); //Öffnungszeitpunkt des Leistungsverstärkers gpio_set_value(gpio63_spk_pa_gpio,0); udelay(8); gpio_set_value(gpio63_spk_pa_gpio,1); udelay(8); gpio_set_value(gpio63_spk_pa_gpio,0); udelay(8); gpio_set_value(gpio63_spk_pa_gpio,1); //sdm660_cdc->ext_spk_pa_set = true; }anders{ pr_err("%s: gpio_set_value gpio63 Lautsprecher PA deaktivieren \n", __func__); //Abschaltzeitpunkt des Leistungsverstärkers gpio_set_value(gpio63_spk_pa_gpio,0); udelay(600); //sdm660_cdc->ext_spk_pa_set = falsch; } Anzahl zurückgeben; } statische ssize_t spkpaon_show(Struktur Gerät *dev, Struktur Geräteattribut *attr, char *buf) { return sprintf(buf, "%d\n",SpkPa_Gpio_Enable); } statisches DEVICE_ATTR(spkpaon, 0664, spkpaon_show, spkpaon_store); statisches Strukturattribut *spkpa_attributes[] = { &dev_attr_spkpaon.attr, NULL }; statische Konstantenstruktur attribute_group apkpa_attr_group = { .attrs = spkpa_attributes, NULL }; //Ende zhaojr hinzufügen 3. Fügen Sie die Registrierung der Dateisystemattributschnittstelle in der Funktion probe() hinzu: vendor/qcom/opensource/audio-kernel/asoc/codecs/sdm660_cdc/msm-analog-cdc.c Dateivorgang statische int msm_anlg_cdc_probe(Struktur platform_device *pdev) { int ret = 0; Struktur sdm660_cdc_priv *sdm660_cdc = NULL; Struktur sdm660_cdc_pdata *pdata; int adsp_state; .................................. dev_set_drvdata(&pdev->dev, sdm660_cdc); //kangting hinzufügen sdm660_cdc->spk_pa_gpio = of_get_named_gpio(pdev->dev.of_node, "qcom,speaker-pa", 0); wenn (!gpio_is_valid(sdm660_cdc->spk_pa_gpio)) pr_err("%s, sdm660_cdc->spk_pa_gpio nicht angegeben\n",__func__); anders{ pr_err("%s, sdm660_cdc->spk_pa_gpio ist %d\n",__func__,sdm660_cdc->spk_pa_gpio); ret = gpio_request(sdm660_cdc->spk_pa_gpio, "spk_pa"); wenn (ret) { pr_err("Anforderung spk_pa_gpio fehlgeschlagen, ret=%d\n",ret); gpio_free(sdm660_cdc->spk_pa_gpio); } } //Kangting Ende ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_sdm660_cdc, msm_anlg_cdc_i2s_dai, ARRAY_SIZE(msm_anlg_cdc_i2s_dai)); wenn (ret) { dev_err(&pdev->dev, "%s:snd_soc_register_codec ist mit Fehler %d fehlgeschlagen\n", __func__, ret); gehe zu err_supplies; } BLOCKING_INIT_NOTIFIER_HEAD(&sdm660_cdc->Benachrichtiger); BLOCKING_INIT_NOTIFIER_HEAD(&sdm660_cdc->notifier_mbhc); //hinzufügen von zhaojr gpio63_spk_pa_gpio = sdm660_cdc->spk_pa_gpio; //Die in den Gerätebäumen definierte IO-Portnummer abrufenpk_pa_kobj = kobject_create_and_add("spk_pa", NULL); //Das Verzeichnis /sys/spk_pa/ erstellenret = sysfs_create_group(spk_pa_kobj, &apkpa_attr_group); //Den Knoten /sys/class/spk_pa/spkpaon erstellenif (ret) dev_err(&pdev->dev,"%s:sysfs_create_group ist mit Fehler fehlgeschlagen\n",__func__); //Ende zhaojr hinzufügen ................................. 4. Ressourcen in der Remove-Funktion freigeben statische int msm_anlg_cdc_remove(Struktur platform_device *pdev) { Struktur sdm660_cdc_priv *sdm660_cdc = dev_get_drvdata(&pdev->dev); Struktur sdm660_cdc_pdata *pdata = sdm660_cdc->dev->platform_data; int-Anzahl; //hinzufügen von zhaojr //Ressourcen freigeben gpio_free(sdm660_cdc->spk_pa_gpio); kobject_put(spk_pa_kobj); //Schlüsselfunktionsysfs_remove_group(spk_pa_kobj, &apkpa_attr_group); //Schlüsselfunktion//end zhaojr add für (Anzahl = 0; Anzahl < sdm660_cdc->child_count && Anzahl < ANLG_CDC_CHILD_DEVICES_MAX; Anzahl++) Plattformgerät abmelden( sdm660_cdc->pdev_child_devices[Anzahl]); snd_soc_unregister_codec(&pdev->dev); msm_anlg_cdc_disable_supplies(sdm660_cdc, pdata); wcd9xxx_spmi_irq_exit(); devm_kfree(&pdev->dev, sdm660_cdc); gebe 0 zurück; } Zusammenfassen Dies ist das Ende dieses Artikels über die Analyse der Methode zum Hinzufügen einer Dateisystem-Attributschnittstelle in Linux oder Android. Weitere Inhalte zur Attributschnittstelle des Linux-Dateisystems finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: So verwenden Sie TypeScript in Vue
>>: Tutorial zur Installation von MySQL 5.7.28 auf CentOS 6.2 (MySQL-Hinweise)
Hintergrundbeschreibung: Auf einem vorhandenen La...
Verwenden Sie JOIN anstelle von Unterabfragen MyS...
Inhaltsverzeichnis 1.Bereitstellung der serversei...
In diesem Artikel wird erläutert, wie Sie einen I...
Es gibt drei Hauptmethoden, CSS auf einer Seite zu...
Dieser Artikel soll als Ausgangspunkt für Diskuss...
1. ip_hash: ip_hash verwendet einen Quelladressen...
1. Einleitung Unsere realen Server sollten nicht ...
Inhaltsverzeichnis Vorwort Verwechslung von „unde...
Tatsächlich gibt es viele entsprechende Schreibme...
Zusammenfassen Dieser Artikel endet hier. Ich hof...
nohup-Befehl Bei der Verwendung von Unix/Linux mö...
Möglicherweise sehen Sie häufig den folgenden Eff...
Ich habe vor Kurzem eine einfache Studie zur Date...
1. Deinstallieren Sie in der Systemsteuerung alle...