none
GPIO e Vb.NET RRS feed

  • Question

  • Salve, mi trovo nella necessità di comandare dei led su una scheda madre. Il produttore nel manuale ha specificato quanto segue:

    Location                 GPIO      read port                     write port
    LED1 (left)            G6 port      06100h bit 6 port        06100h bit 6 / 22
    LED2 (middle)       G25 port    06180h bit 9 port        06180h bit 9 / 25
    LED3 (right)          G27 port    06180h bit 11 port      06180h bit 11 / 27
    The CS5536 GPIO ports are programmed by 32 bit atomic writes. This avoids the need for read /
    modify / write operations and the locking issues they entail. For example, to turn off LED1 (high),
    write 0000’0040h to port 06100h. To turn on LED1 (low), write 0040’0000h. Multiple port bits can
    be changed at the same time. Again, your code must use 32 bit I/O access ! With the current Award
    BIOS, additional port initialisation will be required.

     

    Bene... ho capito che bisogna andare a scrivere in determinate locazioni di memoria... ma come? Googlando un po' mi è parso di capire di poter risolvere utilizzando l'API VirtualAlloc ma sono molto lontano dalla soluzione... qualche consiglio???

     

    Grazie
    Wednesday, March 30, 2011 9:48 PM

Answers

  • Fabio Smarrelli wrote:

    Salve, mi trovo nella necessità di comandare dei led su una scheda madre. Il produttore nel manuale ha specificato quanto segue:

    Location                 GPIO      read port                     write port
    LED1 (left)            G6 port      06100h bit 6 port        06100h bit 6 / 22 LED2 (middle)       G25 port    06180h bit 9 port        06180h bit 9 / 25
    LED3 (right)          G27 port    06180h bit 11 port      06180h bit 11 / 27
    The CS5536 GPIO ports are programmed by 32 bit atomic writes. This avoids the need for read / modify / write operations and the locking issues they entail. For example, to turn off LED1 (high), write 0000’0040h to port 06100h. To turn on LED1 (low), write 0040’0000h. Multiple port bits can be changed at the same time. Again, your code must use 32 bit I/O access ! With the current Award BIOS, additional port initialisation will be required.

     

    Bene... ho capito che bisogna andare a scrivere in determinate locazioni di memoria... ma come? Googlando un po' mi è parso di capire di poter risolvere utilizzando l'API VirtualAlloc ma sono molto lontano dalla soluzione... qualche consiglio???

    Non è mai possibile (sia win o linux) scrivere in una locazione fisica di memoria da user mode.
    La memoria nei computer a 32/64 bit moderni è virtuale e quindi le locazioni di memoria non corrispondono alla mappatura di memoria fisica. Ergo non si può fare in quel modo.

    Inoltre un pilastro di tutti i sistemi operativi moderni è di impedire che qualsiasi codice che gira in modalità non privilegiata (user mode o ring 3) possa andare a scrivere direttamente sull'hardware senza prima passare da ring 0 (kernel mode) e quindi da un driver.

    Quindi o ti scrivi un driver o ne trovi uno già fatto che ti permette di "pasticciare" in quelle zone (a volte WMI permette strani giochi di quel genere).

    Ti ricordo che se pasticci con il WDK e crei un bug, per quanto piccolo sia, entra automaticamente il meccanismo del BSOD che serve a proteggere la macchina dagli strafalcioni del codice che gira in kernel mode.


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    Wednesday, March 30, 2011 10:32 PM
  • Ciao Fabio,

    devi scrivere direttamente i valori all'indirizzo che ti ha indicato il costruttore.

    Per semplificarti la vita ti consiglio di prendere la DLL utilizzata nel progetto che ti riporto di seguito.

    Il progetto fa riferimento alla lettura/scrittura sulla porta parallela ma modificando gli indirizzi (nel tuo caso 0x6100 anzichè la 0x378 utilizzata nel progetto) dovresti riuscire a scrivere sul tuo device.

    I/O Ports Programming (Parallel port) Reading / Writing + Surveillance System using VB.NET

     

    Ciao


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    Wednesday, March 30, 2011 10:21 PM
    Moderator
  • Fabio Smarrelli wrote:

    Ciao Raffaele... ...intendevo che la scrittura di un driver è molto... ma molto oltre le mie capacità... :-(

    Infatti secondo me è l'approccio sbagliato al problema ...

    Ma i led in questione sono sulla scheda madre?
    Perché in questo caso intervenire sull'hardware della m/b non è cosa saggia, sia con la parallela che con qualsiasi altro sistema.

    Se invece l'hardware è "tuo" hai queste opzioni:
    - usb to serial (vedi sotto) che richiede assemblaggio hardware (soluzione meno costosa)
    - micro framework dove l'hardware esterno richiesto è minimale (soluzione più costosa)
     > Il discorso del transciever USB-Seriale è intrigante (ma se funzionasse la

    DLL di Renato il transceiver perderebbe il suo appeal... :-) ), hai qualche link o riferimento per poter studiare un po' la cosa? Perchè come è ovvio anche qui non saprei come partire!!! ...quasi quasi tengo quelle lucette spente e vivo felice... :-)

    Data Sheet del componente:
    http://www.ftdichip.com/Products/ICs/FT232R.htm

    Occhio che viene venduto solo in un contenitore SMD molto, ma molto piccolo. Io riesco a saldarlo ma ho un microscopio 3D e una stazione saldante 'tosta'.


    Se può essere utile posso anche spingermi su C#... ma oltre affogo...

    Qui più che altro è necessario un minimo di smanettamento hw.
    Se invece è roba della motherboard, toccare l'hw non ti conviene.


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    Thursday, March 31, 2011 6:10 PM
  • Fabio Smarrelli wrote:

    Grazie ragazzi per l'aiuto e l'interesse... ...allora scopriamo le carte... :-) Sto lavorando su questa piattaforma: http://www.pcengines.ch/alix3d3.htm Una scheda con Geode a basso consumo... 1.2 ampere massimo con scheda wifi compresa. Tutto funziona bene, tranne per il fatto che questa scheda implementa tre led di stato he è possibile far funzionare solo tramite le indicazioni che vi ho riportato nel primo post. Quindi scarto la modifica hardware (mi chiedevo infatti come adattare il fatto del transceiver...)... resta il problema. Da lunedì avrò nuovamente un po' di tempo per provare la DLL che mi hai indicato. Il fatto della scrittura del driver... beh, confesso che è affascinante ma ho paura di non averne le capacità: nel caso mi voglia cimentar che dovrei fare? Buttarmi su un basso livello tipo C? Avete qualche link da cui trarre qualche spunto? ...oppure, vista la schedina, avete un'idea ancor più semplice da realizzare a portata di mano?

    Non so come ringraziarvi!!!

    Ok, ho capito. Anch'io uso una m/b simile, però con linux a bordo.
    L'hardware esterno non serve a nulla a meno che non usi dei tuoi led invece di quelli sulla M/B.
    Per pilotare quei led è indispensabile un driver.

    La dll a cui fa riferimento Renato è una buona soluzione ma solo per XP oppure le versioni a 32 bit di Windows.

    Per la 64 bit, a partire da Vista in su, è indispensabile firmare il driver con un certificato digitale. A quanto leggo la versione a 64 bit (http://logix4u.net/Legacy_Ports/Parallel_Port/Inpoutx64.dll_for_WIN_XP_64_bit.html) è per XP e quindi dubito che sia firmata.

    In quel caso devi scaricarti i sorgenti, migrarli al WDK più recente (andranno fatte un po' di modifiche), compilare e firmare il driver e quindi usarla.


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    Friday, April 1, 2011 8:26 PM

All replies

  • Ciao Fabio,

    devi scrivere direttamente i valori all'indirizzo che ti ha indicato il costruttore.

    Per semplificarti la vita ti consiglio di prendere la DLL utilizzata nel progetto che ti riporto di seguito.

    Il progetto fa riferimento alla lettura/scrittura sulla porta parallela ma modificando gli indirizzi (nel tuo caso 0x6100 anzichè la 0x378 utilizzata nel progetto) dovresti riuscire a scrivere sul tuo device.

    I/O Ports Programming (Parallel port) Reading / Writing + Surveillance System using VB.NET

     

    Ciao


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    Wednesday, March 30, 2011 10:21 PM
    Moderator
  • Fabio Smarrelli wrote:

    Salve, mi trovo nella necessità di comandare dei led su una scheda madre. Il produttore nel manuale ha specificato quanto segue:

    Location                 GPIO      read port                     write port
    LED1 (left)            G6 port      06100h bit 6 port        06100h bit 6 / 22 LED2 (middle)       G25 port    06180h bit 9 port        06180h bit 9 / 25
    LED3 (right)          G27 port    06180h bit 11 port      06180h bit 11 / 27
    The CS5536 GPIO ports are programmed by 32 bit atomic writes. This avoids the need for read / modify / write operations and the locking issues they entail. For example, to turn off LED1 (high), write 0000’0040h to port 06100h. To turn on LED1 (low), write 0040’0000h. Multiple port bits can be changed at the same time. Again, your code must use 32 bit I/O access ! With the current Award BIOS, additional port initialisation will be required.

     

    Bene... ho capito che bisogna andare a scrivere in determinate locazioni di memoria... ma come? Googlando un po' mi è parso di capire di poter risolvere utilizzando l'API VirtualAlloc ma sono molto lontano dalla soluzione... qualche consiglio???

    Non è mai possibile (sia win o linux) scrivere in una locazione fisica di memoria da user mode.
    La memoria nei computer a 32/64 bit moderni è virtuale e quindi le locazioni di memoria non corrispondono alla mappatura di memoria fisica. Ergo non si può fare in quel modo.

    Inoltre un pilastro di tutti i sistemi operativi moderni è di impedire che qualsiasi codice che gira in modalità non privilegiata (user mode o ring 3) possa andare a scrivere direttamente sull'hardware senza prima passare da ring 0 (kernel mode) e quindi da un driver.

    Quindi o ti scrivi un driver o ne trovi uno già fatto che ti permette di "pasticciare" in quelle zone (a volte WMI permette strani giochi di quel genere).

    Ti ricordo che se pasticci con il WDK e crei un bug, per quanto piccolo sia, entra automaticamente il meccanismo del BSOD che serve a proteggere la macchina dagli strafalcioni del codice che gira in kernel mode.


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    Wednesday, March 30, 2011 10:32 PM
  • Ciao Renato,

    ti ringrazio per la dritta... nei prossimi giorni, appena ritorno su quel lavoro, provo la DLL che mi hai indicato.

    Per ora grazie tanto!!!

    Thursday, March 31, 2011 2:59 PM
  • Ciao Raffaele,

    ti ringrazio per i chiarimenti. Pensavo fosse qualcosa al di là dei miei limiti... già vedere che driver del genere si trovavano free solo per linux mi aveva già messo un attimo di sfiducia. :-(

    Proverò la DLL indicatami da Renato nell'altra risposta e magari do un occhio a WMI se mi permette di fare qualcosa di simile...

    Se avete altri suggerimenti io li prendo tutti al volo!!! :-)

    Grazie ancora!!!

    Thursday, March 31, 2011 3:02 PM
  • Fabio Smarrelli wrote:

    Ciao Raffaele,

    ti ringrazio per i chiarimenti. Pensavo fosse qualcosa al di là dei miei limiti... già vedere che driver del genere si trovavano free solo per linux mi aveva già messo un attimo di sfiducia. :-(

    Io no ho scritto questo ...
    Scrivere driver è sempre free (non a pagamento).
    Il problema è che non puoi fare a meno di scriverne uno per accedere direttamente all'hardware.
    È un motivo tecnico e vale sia su Linux che Windows.
     > Proverò la DLL indicatami da Renato nell'altra risposta e magari do un occhio

    a WMI se mi permette di fare qualcosa di simile...

    Se avete altri suggerimenti io li prendo tutti al volo!!! :-)

    Grazie ancora!!!

    Se vuoi farti un minimo di hardware puoi usare un transciever USB-Seriale con un FT232 che ti permette di usare una com virtuale.
    Io uso questa soluzione per parlare con dei micro PIC.


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    Thursday, March 31, 2011 3:24 PM
  • Ciao Raffaele... ...intendevo che la scrittura di un driver è molto... ma molto oltre le mie capacità... :-(

    Il discorso del transciever USB-Seriale è intrigante (ma se funzionasse la DLL di Renato il transceiver perderebbe il suo appeal... :-) ), hai qualche link o riferimento per poter studiare un po' la cosa? Perchè come è ovvio anche qui non saprei come partire!!! ...quasi quasi tengo quelle lucette spente e vivo felice... :-)

    Se può essere utile posso anche spingermi su C#... ma oltre affogo...

     

    Grazie!!!

    Thursday, March 31, 2011 5:52 PM
  • Fabio Smarrelli wrote:

    Ciao Raffaele... ...intendevo che la scrittura di un driver è molto... ma molto oltre le mie capacità... :-(

    Infatti secondo me è l'approccio sbagliato al problema ...

    Ma i led in questione sono sulla scheda madre?
    Perché in questo caso intervenire sull'hardware della m/b non è cosa saggia, sia con la parallela che con qualsiasi altro sistema.

    Se invece l'hardware è "tuo" hai queste opzioni:
    - usb to serial (vedi sotto) che richiede assemblaggio hardware (soluzione meno costosa)
    - micro framework dove l'hardware esterno richiesto è minimale (soluzione più costosa)
     > Il discorso del transciever USB-Seriale è intrigante (ma se funzionasse la

    DLL di Renato il transceiver perderebbe il suo appeal... :-) ), hai qualche link o riferimento per poter studiare un po' la cosa? Perchè come è ovvio anche qui non saprei come partire!!! ...quasi quasi tengo quelle lucette spente e vivo felice... :-)

    Data Sheet del componente:
    http://www.ftdichip.com/Products/ICs/FT232R.htm

    Occhio che viene venduto solo in un contenitore SMD molto, ma molto piccolo. Io riesco a saldarlo ma ho un microscopio 3D e una stazione saldante 'tosta'.


    Se può essere utile posso anche spingermi su C#... ma oltre affogo...

    Qui più che altro è necessario un minimo di smanettamento hw.
    Se invece è roba della motherboard, toccare l'hw non ti conviene.


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    Thursday, March 31, 2011 6:10 PM
  • Ciao Fabio,

    non per impicciarmi :) ma cosa vorresti implementare?

    Se hai un PC ci sono decine/centinaia di periferiche che a partire da 20 Euro in avanti di permettono di avere modulini belli e pronti per leggere ingressi digitali con i loro bei driver emulazione seriale oppure schede su BUS PCI ecc.

    Li uso tutti giorni con programmi VB.NET senza problema alcuno ...

    Ciao

     


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    Thursday, March 31, 2011 8:56 PM
    Moderator
  • Grazie ragazzi per l'aiuto e l'interesse... ...allora scopriamo le carte... :-) Sto lavorando su questa piattaforma: http://www.pcengines.ch/alix3d3.htm Una scheda con Geode a basso consumo... 1.2 ampere massimo con scheda wifi compresa. Tutto funziona bene, tranne per il fatto che questa scheda implementa tre led di stato he è possibile far funzionare solo tramite le indicazioni che vi ho riportato nel primo post. Quindi scarto la modifica hardware (mi chiedevo infatti come adattare il fatto del transceiver...)... resta il problema. Da lunedì avrò nuovamente un po' di tempo per provare la DLL che mi hai indicato. Il fatto della scrittura del driver... beh, confesso che è affascinante ma ho paura di non averne le capacità: nel caso mi voglia cimentar che dovrei fare? Buttarmi su un basso livello tipo C? Avete qualche link da cui trarre qualche spunto? ...oppure, vista la schedina, avete un'idea ancor più semplice da realizzare a portata di mano?

    Non so come ringraziarvi!!!

    Friday, April 1, 2011 5:02 PM
  • Fabio Smarrelli wrote:

    Grazie ragazzi per l'aiuto e l'interesse... ...allora scopriamo le carte... :-) Sto lavorando su questa piattaforma: http://www.pcengines.ch/alix3d3.htm Una scheda con Geode a basso consumo... 1.2 ampere massimo con scheda wifi compresa. Tutto funziona bene, tranne per il fatto che questa scheda implementa tre led di stato he è possibile far funzionare solo tramite le indicazioni che vi ho riportato nel primo post. Quindi scarto la modifica hardware (mi chiedevo infatti come adattare il fatto del transceiver...)... resta il problema. Da lunedì avrò nuovamente un po' di tempo per provare la DLL che mi hai indicato. Il fatto della scrittura del driver... beh, confesso che è affascinante ma ho paura di non averne le capacità: nel caso mi voglia cimentar che dovrei fare? Buttarmi su un basso livello tipo C? Avete qualche link da cui trarre qualche spunto? ...oppure, vista la schedina, avete un'idea ancor più semplice da realizzare a portata di mano?

    Non so come ringraziarvi!!!

    Ok, ho capito. Anch'io uso una m/b simile, però con linux a bordo.
    L'hardware esterno non serve a nulla a meno che non usi dei tuoi led invece di quelli sulla M/B.
    Per pilotare quei led è indispensabile un driver.

    La dll a cui fa riferimento Renato è una buona soluzione ma solo per XP oppure le versioni a 32 bit di Windows.

    Per la 64 bit, a partire da Vista in su, è indispensabile firmare il driver con un certificato digitale. A quanto leggo la versione a 64 bit (http://logix4u.net/Legacy_Ports/Parallel_Port/Inpoutx64.dll_for_WIN_XP_64_bit.html) è per XP e quindi dubito che sia firmata.

    In quel caso devi scaricarti i sorgenti, migrarli al WDK più recente (andranno fatte un po' di modifiche), compilare e firmare il driver e quindi usarla.


    Raffaele Rialdi  http://www.iamraf.net
    Weblog: http://blogs.ugidotnet.org/raffaele
    Microsoft MVP profile https://mvp.support.microsoft.com/profile/raffaele
    UGIdotNET - http://www.ugidotnet.org/


    Raffaele Rialdi [MVP] My articles and videos: http://www.iamraf.net Italian blog: http://blogs.ugidotnet.org/raffaele
    Friday, April 1, 2011 8:26 PM
  • Ciao Renato,

    solo ora sono riuscito a trovare un attimo di tempo per provare la soluzione da te consigliata.

    Non sono riuscito a fare quello che volevo. Provando il progamma nella stessa pagina che mi hai linkato i valori delle porte che inserisco non mutano, ma restano gli stessi. Mi spiego: provo a scrivere indicando come numero di porta 24832 (spero di aver convertito bene in Int l'indirizzo Hex), ma qualsiasi valore io immetta, poi me, rileggendo dalla stessa porta mi ritrovo il valore originale e non quello modificato.

    Sbaglio qualcosa nella conversione delle porte o altro?

    Ho provato anche a scrivere alla ditta produttrice ma mi han risposto che non hannop codice per windows...

    Grazie


    Thursday, April 14, 2011 11:29 AM
  • Ciao Fabio,

    non ricordo se me lo avevi già scritto ... che versione di Windows e a quanti bit utilizzi per il test ?

     

    La conversione della porta è corretta ... stando alla tua documentazione dovresti scrivere sulla porta 24832 64 (dec) per attivare il led. Se lo fai (indipendentemente dalla rilettura che ottieni) il led si accende ?

    Se non ne esci magari ti possono essere di aiuto le le indicazioni riportate nell'articolo di Antonio Giuliana

    Controllo di apparecchiature con VB (terza parte)

    nella sezione

    La libreria INOUT32

    Ciao

     


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    Friday, April 15, 2011 2:30 PM
    Moderator
  • Ciao Renato,

    grazie infiite per la disponibilità e la pazienza nel guidarmi in questa operazione.

    Allora il tutto si svolge su windows xp a 32 bit. Nelle mie prove, dove il led mai e poi mai si è acceso, ho saltato il particolre del bit... dovrei scrivere sul bit 6... ma come faccio ad indicare il bit sul quale scrivere? Dalla pagina che mi hai indicato non si evince tale possibilità. Ho fatto confusione in qualche punto, ma, date le mie conoscenze di memoria, struttura della memoria, indirizzamento e quant'altro, non riesco a venirne fuori.

    Grazie

    Saturday, April 16, 2011 11:06 AM