2017-11-27 2 views
2

Ich suche in denen die Hallo Welt von blankem Metall auf RPi3, die auf dem ACT drehen LED.einen C-Puffer von dem Arm zum VideoCore auf RPi3 Erstellen

Es gibt viele gute Ressourcen:

  1. Einige in assembly for Pi 1
  2. David Welch ‚s ausgezeichnete baremetal tutorial für Pi 1 und 2
  3. und sein blinker01 Beispiel für Pi 1 und 2

Die Pi3 hat leider die LEDs aus GPIO verschoben. Sie müssen stattdessen send a message an den VideoCore (GPU) in seiner Mailbox schalten, um die LED einzuschalten.

Die documentation Zustände der Pufferinhalt der Nachricht wie folgt:

u32: Puffergröße in Bytes (einschließlich der Header-Werte, der Endmarke und padding)

u32: Puffer Anfrage/Antwort Code

Request codes: 
    0x00000000: process request 
    All other values reserved 
Response codes: 
    0x80000000: request successful 
    0x80000001: error parsing request 
    All other values reserved 

u8 ...: Folge von verketteten Tags

u 32: 0x0 (End-Tag)

u8 ...: padding

ich in der Lage war this assembly example erfolgreich zu bekommen auf dem Pi 3. Die ACT LED läuft schaltet sich ein und bleibt.

Aber mein Punkt dabei ist Bare Metal C zu lernen. Ich bin neu in C aber ich verstehe genug, um zu erklären, was die folgende Funktion hat:

/** 
*** This is my own summary ** so likely incorrect 
* 
* Assigns the address of the Mailbox which is 0x3f00b880 to the mailbox variable 
* 
* Then waits until Mailbox 0 which the GPU uses as interrupt to the ARM; 
* basically saying I am ready for your message. 
* 
* The function then puts the address of the message buffer 
* plus the channel to be used; in this case channel 4 for ACT LED 
*/ 
unsigned int MailboxWrite (unsigned int fbinfo_addr, unsigned int channel) 
{ 
    unsigned int mailbox; 

    mailbox=0x3f00b880; 
    while(1) 
    { 
     if((GET32(mailbox+0x18)&0x80000000)==0) break; 
    } 
    PUT32(mailbox+0x20,fbinfo_addr+channel); 
    return(0); 
} 

Das Problem, das ich bin (und vielleicht ist es, weil es spät in der Nacht ist, und ich habe mehrere Stunden bei dieser gewesen) ist I Ich bin mir nicht sicher, wie ich den Puffer aufbauen soll.

Mein Denken ist ein int Array zu machen, die wie folgt aussieht:

# ?? buffer size in bytes 
# 0 is the request code 
# 0x00038041 Tag ID (SET_GPIO_STATE) 
# 8 value buffer size 
# 0 Request/response size 
# 130 ACT_LED pin number 
# 1 Turn it on 
# 0 End tag 
[??,0,0x00038041,8,0,130,1,0] 

Wie soll ich die Puffergröße berechnen? Ist es die Größe des Arrays?

Also würde ich nur ein 0 als das erste Element hinzufügen, dann sizeof ausführen und das Array aktualisieren?

+1

das Raspberry Pi Forum auf der Raspberry Pi Seite wird dieses Thema bedeckt und es gibt viele Beispiele aus gab es keinen Zweifel. –

+1

Versuchen Sie fragen/suchen hier https://raspberrypi.stackexchange.com –

Antwort

0

Vielleicht ist es schlechte Form, meine eigene Frage zu beantworten, aber ich hoffe, es hilft jemandem.

Dank den Kommentar von @old_timer suche ich das bare metal Forum und fand diese solution:

void set_PI3LED(bool on) { 
    uint32_t __attribute__((aligned(16))) mailbox_message[8]; 
    mailbox_message[0] = sizeof(mailbox_message); 
    mailbox_message[1] = 0; 
    mailbox_message[2] = 0x38041; 
    mailbox_message[3] = 8; 
    mailbox_message[4] = 8; 
    mailbox_message[5] = 130; 
    mailbox_message[6] = (uint32_t)on; 
    mailbox_message[7] = 0; 
    mailbox_write(MB_CHANNEL_TAGS, mailbox_ARM_to_VC(&mailbox_message[0])); 
    mailbox_read(MB_CHANNEL_TAGS); 
} 

Es ist schön zu wissen, ich nicht zu weit weg war und es ist gut, dass ich jetzt zu wissen, die genaue Syntax Ich brauche.

Verwandte Themen