(vdr4)Arch - serial_ir ersetzt lirc_serial Modul mit Kernel >= 4.10

  • Moin moin,


    mit Wechsel auf Kernel 4.10 gibt es unter Arch kein lirc_serial mehr :O Lt. Arch Entwicklern wurde das mit dem neuen Kernel "renamed" zu serial_ir. Bekomm es aber leider nicht hin damit, der lircd reagiert null auf die Fernbedienung.


    Der Treiber wird wohl noch korrekt geladen:


    Code
    1. [ 117.753520] serial_ir serial_ir.0: auto-detected active low receiver
    2. [ 117.796248] Registered IR keymap rc-rc6-mce
    3. [ 117.796425] input: Serial IR type home-brew as /devices/platform/serial_ir.0/rc/rc0/input18
    4. [ 117.796512] rc rc0: Serial IR type home-brew as /devices/platform/serial_ir.0/rc/rc0
    5. [ 117.800200] lirc_dev: IR Remote Control driver registered, major 240
    6. [ 117.801377] rc rc0: lirc_dev: driver ir-lirc-codec (serial_ir) registered at minor = 0
    7. [ 117.801379] IR LIRC bridge handler initialized
    8. [ 117.804331] IR RC6 protocol handler initialized


    mode2 Ausgaben:

    Code
    1. [vdr@vdr ~]$ mode2 -l
    2. /dev/input/by-path/platform-serial_ir.0-event-ir -> /dev/input/event18
    3. /dev/input/event18 Serial IR type home-brew [/sys/devices/platform/serial_ir.0/rc/rc0/input18]
    4. [vdr@vdr ~]$
    5. [vdr@vdr ~]$ sudo mode2 --raw -d /dev/lirc0
    6. Using raw access on device /dev/lirc0
    7. Using device: /dev/input/event0
    8. Running as regular user vdr
    9. Partial read 4 bytes on /dev/lirc0[vdr@vdr ~]$


    Log lircd (mit Aufruf irw - ohne Ergebnis bzw. ohne Reaktion):


    Frage: Funzt das überhaupt so mit serial_ir, bzw. was muss ich denn konfigtechnisch ändern damit mein alter Empfänger wieder mitspielt? Bin googletechnisch leider auch nicht wirklich fündig geworden...


    Lars

    Asus M3N78-EM, AMD Athlon II X2 240e, 4GB DDR21066GeilGreen, Crucial M4 SSD+3TB WD Red, Mystique SaTiX-S2 Dual, Archlinux -> VDR4Arch


    "Freunde sind Menschen, die dich mögen obwohl sie dich kennen"

  • Sieht so aus als würde der Serielle Empfänger jetzt wie ein normaler rc-core Empfänger arbeiten. mode2-Ausgaben sieht man damit vermutlich nur, wenn man das Protokoll von Hand auf "LIRC" setzt - was liefert denn

    Code
    1. ir-keytable

    aus dem Paket v4l-utils, wenn du es mit root-Rechten aufrufst?

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Funzt das überhaupt so mit serial_ir, bzw. was muss ich denn konfigtechnisch ändern damit mein alter Empfänger wieder mitspielt?


    Geht bei mir problemlos mit yavdr-0.6 und kernel-4.4.0!
    Da wurde nämlich beim neuen open source TBS-Treiber, welche kompatibel mit den neuesten Kernel gemacht wurde, auch das alte "lirc_serial" durch "serial_ir" ersetzt!
    Damit das läuft musste ich nur 2 Dateien editieren:


    1. /etc/lirc/hardwar.conf
    Hier muss man nur das "lirc_serial" durch "serial_ir" ersetzen, das ganze sieht dann so aus:

    Code
    1. #Chosen Remote Control
    2. REMOTE="Home-brew (16x50 UART compatible serial port)"
    3. #REMOTE_MODULES="lirc_dev lirc_serial"
    4. REMOTE_MODULES="lirc_dev serial_ir"
    5. REMOTE_DRIVER=""
    6. REMOTE_DEVICE="/dev/lirc0"
    7. REMOTE_LIRCD_CONF=""
    8. REMOTE_LIRCD_ARGS=""
    9. ...


    2. Und dann braucht man noch eine neue Konfigurationsdatei für der seriellen Port z. B als /etc/modprobe.d/serial_ir.conf mit folgendem Inhalt für den seriellen Port COM1

    Code
    1. # COM1 equivalent: /dev/ttyS0
    2. options serial_ir irq=4 io=0x3f8


    Dann noch ein reboot und alles müsste laufen! :]
    Man braucht sonst weiter nichts ändern, die "lircd.conf" bleibt so wie sie ist!


    Paul

  • Mit dem kleinen Unterschied, dass die neue Lirc-Version, die unter Arch Linux in den Paketquellen ist, anders konfiguriert wird - das müsste vermutlich in die /etc/lirc/lirc_options.conf: https://bbs.archlinux.org/viewtopic.php?pid=1672646#p1672646

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Mit dem kleinen Unterschied, dass die neue Lirc-Version, die unter Arch Linux in den Paketquellen ist, anders konfiguriert wird ...


    Okay, das wusste ich jetzt so nicht, da ich das ja unter Ubuntu/yavdr gemacht habe.
    Der Wechsel von "lirc_serial" zu "serial_ir" dürfte aber vermutlich auch bei Arch-Linux ähnlich unproblematisch sein.


    Zumindestens wisst Ihr jetzt, dass es bei Ubuntu sehr einfach ist! :D


    Paul

  • Hier noch ein Hinweis:
    serial_ir aus dem Kernel 4.10 hat noch diverse Fehler (z.B. werden Tastendrücke falsch wiederholt, speziell wenn man den rc5 Decoder aus dem Kernel benutzt).
    Entweder auf 4.11 warten oder media_build benutzen.

  • Läuft jetzt! Das

    # COM1 equivalent: /dev/ttyS0
    options serial_ir irq=4 io=0x3f8

    hatte mir noch gefehlt! Ansonsten wirklich "easy going" wie unter Ubuntu von Paulaner erwähnt :tup Btw. habe ich nix über die "lirc_options.conf" gemacht, da werde ich mich die Tage vielleicht dran versuchen.


    Funktion auch gut soweit, habe bis jetzt keinerlei Probleme mit "Tastendrücke falsch wiederholt" o.ä. festgestellt. Naja schaun wir mal die nächsten Tage...


    Danke ihr Leut,Lars

    Asus M3N78-EM, AMD Athlon II X2 240e, 4GB DDR21066GeilGreen, Crucial M4 SSD+3TB WD Red, Mystique SaTiX-S2 Dual, Archlinux -> VDR4Arch


    "Freunde sind Menschen, die dich mögen obwohl sie dich kennen"

  • Bei xenial gab es jetzt auch ein update auf 4.10, aber dank der Anleitung von Paulaner läuft lirc wieder.
    Wie aber Dr.Nop schon erwähnt hat gibt es Probleme mit wiederholten Tastendrücken. Drückt man z.B. eine Teste zu schnell hintereinander werden die Tastendrücke garnicht interpretiert.

  • Moin,

    mit Ubuntu 18.04 beisse ich mir im Moment noch die Zähne aus.


    Das sieht soweit ganz gut aus:


    Code
    1. [ 715.696863] serial_ir serial_ir.0: auto-detected active low receiver
    2. [ 715.706154] lirc_dev: IR Remote Control driver registered, major 240
    3. [ 715.710794] IR LIRC bridge handler initialized
    4. [ 715.744854] Registered IR keymap rc-rc6-mce
    5. [ 715.750690] IR RC6 protocol handler initialized
    6. [ 715.776991] rc rc0: Serial IR type home-brew as /devices/platform/serial_ir.0/rc/rc0
    7. [ 715.777130] input: Serial IR type home-brew as /devices/platform/serial_ir.0/rc/rc0/input16
    8. [ 715.777559] lirc lirc0: lirc_dev: driver ir-lirc-codec (serial_ir) registered at minor = 0


    Ich sehe bei jedem Tastendruck die grüne LED vom atric-Einschalter blinken. Es passiert aber nichts. Auch irrecord erkennt keinen Tastendruck. Was mich stutzig macht ist der Hinweis "IR RC6 protocol handler initialized". Ich meine, dass meine FB nur RC5 kann. Laut ir-keytable kann der Lirc-Receiver zwar RC5, aber es sit anscheinend nur das Protokoll RC6 aktiviert.

    Code
    1. martin@ubuntuvdr1:/tmp$ sudo ir-keytable
    2. /sys/class/rc/rc0/ gefunden (/dev/input/event15) mit:
    3. Name: Serial IR type home-brew
    4. Treiber: serial_ir, Tabelle: rc-rc6-mce
    5. Lirc Gerät: /dev/lirc0
    6. unterstützte Protokolle: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp
    7. Aktivierte Protokolle: lirc rc-6
    8. bus: 25, Anbieter/Produkt: 0001:0001, Version: 0x0100
    9. Wiederholungsverzögerung = 500 ms, Wiederholungsperiode = 125 ms

    Kann das eine Erklärung sein, warum der IR-Receiver nichts empfängt? Wie kann ich das Protokoll wechseln?

    VDR 1: Silverstone LC20, Cougar A300/R, MSI C847MS-E33, passive Asus GT520, Sundtek MediaTV Digital Home (DVB-C/T), KNC One DVB-C, WD10EACS; Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD
    VDR 2: ACT-620, Asrock B75 Pro3-M, Celeron G540, passive Asus GT610, Cine CT V6, KNC-One DVB-C, Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD

  • Hi,


    Was ein Zufall, aber ich habe heute Mal als reminder für mich Mal ne Zusammenfassung geschrieben. Alles quick n dirty! Also 100000 Rechtschreibfehler und co aber vllt hilft es dir weiter:


    https://www.minidvblinux.de/wi…s/fernbedienungen54serial


    Gruß


    MarMic

    SZVDR HD: Intel e5300@1,2ghz - Gigabyte GA-EP41-UD3L - 2GB ddr2 800 - Gainward G210 512mb - Silverstone LC16MR - Tevii s480 - Astra 19,2 - MLDHD-5.4 testing


    WZVDR HD: Intel g1610@1,6ghz - Intel DH61BE - Scythe Big Shuriken 2 - 4GB ddr3 1333 - Asus GT610 1024mb - Chieftec Hi-Fi HM-02 - Tevii s480 - Astra 19,2 - MLDHD-5.4 testing

  • wow, danke!

    Warum wird das im Laufe der Jahre nur immer alles komplizierter statt einfacher?

    VDR 1: Silverstone LC20, Cougar A300/R, MSI C847MS-E33, passive Asus GT520, Sundtek MediaTV Digital Home (DVB-C/T), KNC One DVB-C, WD10EACS; Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD
    VDR 2: ACT-620, Asrock B75 Pro3-M, Celeron G540, passive Asus GT610, Cine CT V6, KNC-One DVB-C, Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD

  • Hihi das Frage ich mich auch immer... Wenn du noch was rausfindest sag bescheid damit wir es bei uns verbessern können


    Gruß


    MarMic

    SZVDR HD: Intel e5300@1,2ghz - Gigabyte GA-EP41-UD3L - 2GB ddr2 800 - Gainward G210 512mb - Silverstone LC16MR - Tevii s480 - Astra 19,2 - MLDHD-5.4 testing


    WZVDR HD: Intel g1610@1,6ghz - Intel DH61BE - Scythe Big Shuriken 2 - 4GB ddr3 1333 - Asus GT610 1024mb - Chieftec Hi-Fi HM-02 - Tevii s480 - Astra 19,2 - MLDHD-5.4 testing

  • Hat aber auch Vorteile, so laufen zB die IR-Empfänger der meisten TV-Karten 'out of the box'.

    Und wenn man es umbedingt möchte, funktioniert es mit Lircd ja auch noch auf die alte Methode.


  • Und wenn man es umbedingt möchte, funktioniert es mit Lircd ja auch noch auf die alte Methode.

    aber wie?

    VDR 1: Silverstone LC20, Cougar A300/R, MSI C847MS-E33, passive Asus GT520, Sundtek MediaTV Digital Home (DVB-C/T), KNC One DVB-C, WD10EACS; Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD
    VDR 2: ACT-620, Asrock B75 Pro3-M, Celeron G540, passive Asus GT610, Cine CT V6, KNC-One DVB-C, Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD

  • @dr seltsam:

    Wie in meinem Wiki Eintrag...

    Modeset dann

    modprobe dann

    lirc starten (device sollte als lirc-com1 oder sowas existieren)

    Schau Mal ins GIT - rc-core - bei uns.

    FYI. So nutze ich das bei mld immer noch ... Das mit ir-keytable sind Versuche für eine schlimmere Zukunft :P


    Gruß


    MarMic

    SZVDR HD: Intel e5300@1,2ghz - Gigabyte GA-EP41-UD3L - 2GB ddr2 800 - Gainward G210 512mb - Silverstone LC16MR - Tevii s480 - Astra 19,2 - MLDHD-5.4 testing


    WZVDR HD: Intel g1610@1,6ghz - Intel DH61BE - Scythe Big Shuriken 2 - 4GB ddr3 1333 - Asus GT610 1024mb - Chieftec Hi-Fi HM-02 - Tevii s480 - Astra 19,2 - MLDHD-5.4 testing

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von MarMic ()

  • Warum wird das im Laufe der Jahre nur immer alles komplizierter statt einfacher?

    Wenn der Kernel-Treiber das gleiche Interface wie die übrigen rc-core Empfänger bietet, vereinfacht das die Sache eigentlich - wenn man die Sendefunktionalität nicht braucht, müsste man dann eigentlich mit drei Zeilen in den Konfigurationsdateien für modprobe, setserial und der rc_maps.conf (und ggf. noch einer angepasste Keymap, die dann aber für alle rc-core Empfänger, die das Protokoll unterstützten, funktionieren würde) auskommen.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Ich blicke hier trotzdem nicht durch...

    Meine Fernbedienung ist eine programmierbare Fernbedienung, wo ich unter der für den VDR vorgesehenen Gerätetaste die Codes eines Aiwa-Videorekorders programmiert habe. Dazu habe ich bereits eine passende lircd.conf.


    Nachdem ich nun in der /etc/lirc/lircmd.conf den Eintrag

    driver = devinput

    auf

    driver = default

    geändert habe, läuft die Fernbedienung über /dev/lirc0 und lircd statt /dev/input/event15. Das funktioniert also.


    Was müsste ich denn tun, um auf lircd verzichten zu können? Wie kann ich dem Treiber beibringen, dass er mit Protokoll rc-5 statt rc-6 arbeiten soll? Gibt es eine Möglichkeit, die lircd.conf in eine keymap umzuwandeln?



    VDR 1: Silverstone LC20, Cougar A300/R, MSI C847MS-E33, passive Asus GT520, Sundtek MediaTV Digital Home (DVB-C/T), KNC One DVB-C, WD10EACS; Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD
    VDR 2: ACT-620, Asrock B75 Pro3-M, Celeron G540, passive Asus GT610, Cine CT V6, KNC-One DVB-C, Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD

  • ich habe jetzt lirc komplett deinstalliert, weil es nach jedem Neustart nicht mehr funktionierte und ich einfach nicht heraus bekam, wo es hakte. Es gibt also weder eine /etc/lirc noch lircd . Stattdessen will ich es nun mal auf die neue, angeblich einfachere Art versuchen.


    Erstes Problem war, dass der Eintrag "setserial /dev/ttyS0 uart none" in /var/lib/setserial/autoserial.conf anscheinend beim Laden von serial-ir unberücksichtigt bleibt, nachdem dieses Modul nun über einen Eintrag in /etc/modules geladen wird. Erst nachdem ich eine /etc/modprobe.d/serial-ir.conf mit dem Inhalt

    Code
    1. install serial_ir setserial /dev/ttyS0 uart none; modprobe --ignore-install serial_ir

    angelegt hatte, funktionierte es.


    Ich habe bereits eine keymap angelegt. Das ging mit der Anleitung von MarMic auch ganz gut. Ich musste mich dazu allerdings von dem bisher genutzen Code eines Aiwa-VCRs trennen, da dessen Codes von keinem Protokoll erkannt wurden.


    Das Laden der keymap mit Vorgabe des richtigen Protokolls übernimmt im Moment noch der Eintrag

    Code
    1. ir-keytable -s rc0 -c -p rc-6 -w /etc/rc_keymaps/Ru880_Kabel_004

    in /etc/rc.local


    Die Syntax von /etc/rc_maps.cfg (driver - table - file) verstehe ich nämlich noch nicht so ganz. Im Kopf der standardmäßig bereits vorhandenen Datei steht

    Zitat

    table - RC keymap table, provided via uevent - use * for any table

    Was ist die "RC keymap table"? Und wie gebe ich das Protokoll vor?


    Ist /etc/rc_maps.cfg das Ubuntu-Equivalent zu /etc/rc_maps.conf?


    ir-keytable sagt nun:

    Code
    1. /sys/class/rc/rc0/ gefunden (/dev/input/event14) mit:
    2. Name: Serial IR type home-brew
    3. Treiber: serial_ir, Tabelle: rc-rc6-mce
    4. Lirc Gerät: /dev/lirc0
    5. unterstützte Protokolle: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp
    6. Aktivierte Protokolle: lirc rc-6
    7. bus: 25, Anbieter/Produkt: 0001:0001, Version: 0x0100
    8. Wiederholungsverzögerung = 500 ms, Wiederholungsperiode = 125 ms

    Im syslog steht

    Code
    1. Apr 26 13:56:43 ubuntuvdr1 kernel: [ 3641.918418] serial_ir serial_ir.0: auto-detected active low receiver
    2. Apr 26 13:56:43 ubuntuvdr1 kernel: [ 3641.927287] lirc_dev: IR Remote Control driver registered, major 240
    3. Apr 26 13:56:43 ubuntuvdr1 kernel: [ 3641.994552] rc rc0: Serial IR type home-brew as /devices/platform/serial_ir.0/rc/rc0
    4. Apr 26 13:56:43 ubuntuvdr1 kernel: [ 3641.994690] input: Serial IR type home-brew as /devices/platform/serial_ir.0/rc/rc0/input14
    5. Apr 26 13:56:43 ubuntuvdr1 kernel: [ 3641.995267] lirc lirc0: lirc_dev: driver ir-lirc-codec (serial_ir) registered at minor = 0

    Wie schaffe ich es nun, dass vdr auf diese Fernbedienung hört? Wenn ich vdr mit der lirc-Option starte, hagelt es Fehlermeldungen

    Code
    1. ERROR (lirc.c,43): /var/run/lirc/lircd: Datei oder Verzeichnis nicht gefunden

    Brauche ich jetzt das remote-Plugin? Oder eventlirc? Oder das inputdev-Plugin?



    VDR 1: Silverstone LC20, Cougar A300/R, MSI C847MS-E33, passive Asus GT520, Sundtek MediaTV Digital Home (DVB-C/T), KNC One DVB-C, WD10EACS; Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD
    VDR 2: ACT-620, Asrock B75 Pro3-M, Celeron G540, passive Asus GT610, Cine CT V6, KNC-One DVB-C, Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD

  • mühsam nährt sich das Eichhörnchen...


    Ich habe es jetzt mit inputlirc versucht. Das lief auch schon mal. Nun kriege ich aber nur noch

    Code
    1. Apr 27 14:57:55 ubuntuvdr1 inputlircd[1600]: /dev/input/event12 100013
    2. Apr 27 14:57:55 ubuntuvdr1 inputlircd[1600]: Unable to bind AF_UNIX socket to /var/run/lirc/lircd: No such file or directory
    3. Apr 27 14:57:55 ubuntuvdr1 systemd[1]: inputlirc.service: Main process exited, code=exited, status=71/n/a
    4. Apr 27 14:57:55 ubuntuvdr1 systemd[1]: inputlirc.service: Failed with result 'exit-code'.


    /etc/default/inputlirc:

    Code
    1. # Options to be passed to inputlirc.
    2. #EVENTS="/dev/input/event12"
    3. EVENTS="/dev/input/by-path/platform-serial_ir.0-event-ir"
    4. OPTIONS="-d /var/run/lirc/lircd -g -m 0"


    Das device ist richtig.

    Nach meinem Verständnis sollte der Socket /var/run/lirc/lircd doch gerade von inputlirc angelegt werden - wieso kommt da eine Fehlermeldung, dass es den nicht gibt? Wer sonst sollte das Socket anlegen?


    Mit dem remote-Plugin geht es. Gibt es aber wirklich keine einfachere Alternative? Ich glaube, die Unterstützung von anderen Kernel-Inputdevices als Keyboards sollte auf die To-Do-Liste für vdr 2.5

    VDR 1: Silverstone LC20, Cougar A300/R, MSI C847MS-E33, passive Asus GT520, Sundtek MediaTV Digital Home (DVB-C/T), KNC One DVB-C, WD10EACS; Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD
    VDR 2: ACT-620, Asrock B75 Pro3-M, Celeron G540, passive Asus GT610, Cine CT V6, KNC-One DVB-C, Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD

  • ich führe weiter Selbstgespräche...


    Leider musste ich feststellen, dass die Fernbedienung ohne lirc und nur über den Kernel erheblich träger läuft. Ich habe bereits mit delay und repeat-Werten gespielt, aber flüssiges Scrollen durch die Menüs ist damit nicht möglich. Die gleiche FB über lircd läuft super flott.

    So sieht meine lirc_options.conf in Ubuntu 18.04 aus:




    inputlirc ist deinstalliert, und ganz wichtig ist die Deaktivierung von lircd-uinput im Abschnitt [lircmd]. Den Abschnitt

    [modinit] habe ich noch auskommentiert, da ich serial-ir über einen Eintrag in /etc/modules in Verbindung mit einer Konfigurationsdatei in /etc/modprobe.d starte.


    Nun gibt es aber ein unerwartetes Problem, da sich in meiner 15jährigen vdr-Laufbahn bisher nicht hatte:

    Direkt nach dem Start funktionieren einige Tasten nicht richtig. Ich weiss nicht mal, ob es die Tasten sind oder vdr. Immerhin spielt es dabei keine Rolle, ob ich die FB oder die Tastatur zur Steuerung benutze. Folgendes Phänomen: Beim Umschalten wird die Kanalanzeige nicht eingeblendet. Drücke ich kurz auf die ok-Taste, blitzt die Kanalanzeige für einen Sekundenbruchteil auf. Die Zifferntasten funktionieren auch nicht. Man sieht auch hier ganz kurz eine OSD-Einblendung, aber der vdr reagiert nicht auf die Taste bzw. schaltet das Programm nicht um. Andere Tasten bzw. Funktionen funktionieren einwandfrei. Welches OSD ich verwende, spielt keine Rolle. Wenn ich vdr ohne die --lirc-Option starte und nur über die Tastatur steuere, ist es das gleiche. Aber: nach ein paar Minuten gibt sich das von selbst. Mir fällt auf, dass die load am Anfang auch sehr hoch ist (über 1) und danach auf 0,03 fällt.
    im Log ist nichts zu sehen. vdr loggt überhaupt nichts beim Drücken der nicht reagierenden Tasten.


    VDR 1: Silverstone LC20, Cougar A300/R, MSI C847MS-E33, passive Asus GT520, Sundtek MediaTV Digital Home (DVB-C/T), KNC One DVB-C, WD10EACS; Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD
    VDR 2: ACT-620, Asrock B75 Pro3-M, Celeron G540, passive Asus GT610, Cine CT V6, KNC-One DVB-C, Atric-IR-Einschalter. SW: Xubuntu 18.04 per SSD