So analysieren Sie die Attributschnittstelle zum Hinzufügen eines Dateisystems unter Linux oder Android

So analysieren Sie die Attributschnittstelle zum Hinzufügen eines Dateisystems unter Linux oder Android

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:
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. 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:
Der Leistungsverstärker muss während der Registrierung nicht initialisiert werden, daher arbeitet die Funktion probe() nicht mit sdm660_cdc->spk_pa_gpio(GPIO63), sondern führt nur die Anforderung aus. Informationen zu spezifischen Anforderungsvorgängen finden Sie unter: EAR im Audioteil von msm8953 und im Audioteil in der Soundkonfiguration der Lautsprecherausgabe

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:
  • Python ändert die Berechtigungen von Dateien (Ordnern) in Linux
  • Linux-Shell - Beispiel zum Testen von Dateisystemattributen durch Identifizierung
  • Was sind die Dateiattribute von crw, brw, lrw usw. in Linux?
  • Detaillierte Beispiele zum Anzeigen von Dateiattributen in Linux (ls, lsattr, file, stat)
  • Eine kurze Diskussion über die Linux-Ordnerattribute rwxrwxrwt
  • Zusammenfassung der Wissenspunkte zu den grundlegenden Attributen von Linux-Dateien

<<:  So verwenden Sie TypeScript in Vue

>>:  Tutorial zur Installation von MySQL 5.7.28 auf CentOS 6.2 (MySQL-Hinweise)

Artikel empfehlen

MySQL-Optimierung: Join statt Unterabfrage verwenden

Verwenden Sie JOIN anstelle von Unterabfragen MyS...

Eine kurze Diskussion über vier Lösungen für Vue Single Page SEO

Inhaltsverzeichnis 1.Bereitstellung der serversei...

So erstellen Sie einen Index für eine Join-Tabelle in MySQL

In diesem Artikel wird erläutert, wie Sie einen I...

Ein genauerer Blick auf die Unterschiede zwischen Link und @import

Es gibt drei Hauptmethoden, CSS auf einer Seite zu...

Warum ich Nginx als Backend-Server-Proxy empfehle (Gründeanalyse)

1. Einleitung Unsere realen Server sollten nicht ...

Einige Fehler, die JavaScript-Anfänger häufig machen

Inhaltsverzeichnis Vorwort Verwechslung von „unde...

In WMP eingebettetes HTML, kompatibel mit Chrome und IE, detaillierte Einführung

Tatsächlich gibt es viele entsprechende Schreibme...

Detaillierte Erklärung des Ref-Attributs von Vue

Zusammenfassen Dieser Artikel endet hier. Ich hof...

Prinzip des Linux-Nohup-Befehls und Beispielanalyse

nohup-Befehl Bei der Verwendung von Unix/Linux mö...

Reines CSS, um den Listen-Pulldown-Effekt auf der Seite zu erzielen

Möglicherweise sehen Sie häufig den folgenden Eff...

Beispielanalyse für MySQL Oracle- und SQL Server-Paging-Abfragen

Ich habe vor Kurzem eine einfache Studie zur Date...