gpt4 book ai didi

在 RPi3 上创建从 ARM 到 VideoCore 的 C 缓冲区

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:22 25 4
gpt4 key购买 nike

我正在查看 RPi3 上裸机的 hello world,它正在打开 ACT LED。

有很多好的资源:

  1. 一些在assembly for Pi 1
  2. David Welch优秀baremetal tutorial对于 Pi 1 和 2
  3. 和他的 blinker01 Pi 1 和 2 的示例

不幸的是,Pi3 已将 LED 移出 GPIO。相反,您必须 send a message到其邮箱中的 VideoCore (GPU) 以打开 LED。

documentation声明该消息的缓冲区内容如下:

u32: buffer size in bytes (including the header values, the end tag and padding)

u32: buffer request/response code

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

u8...: sequence of concatenated tags

u32: 0x0 (end tag)

u8...: padding

我能够得到 this assembly example在 Pi 3 上成功运行。ACT LED 亮起并保持亮起。

但我这样做的目的是学习裸机 C。我是 C 的新手,但我的理解足以解释以下函数的作用:

/**
*** 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);
}

我遇到的问题(也许是因为现在是深夜,我已经在这上面待了几个小时)是我不确定如何构建缓冲区。

我的想法是制作一个如下所示的 int 数组:

# ?? 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]

我应该如何计算缓冲区大小?是数组的大小吗?

那么我是否只添加一个 0 作为第一个元素,然后运行 ​​sizeof 并更新数组?

int[] buffer = [0,0,0x00038041,8,0,130,1,0];
buffer[0] = sizeof(buffer)

最佳答案

也许回答我自己的问题是不好的形式,但我希望它能帮助别人。

感谢@old_timer 的评论,我搜索了 bare metal论坛找到这个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);
}

很高兴知道我并没有偏离太远,很高兴知道我现在拥有我需要的确切语法。

关于在 RPi3 上创建从 ARM 到 VideoCore 的 C 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47503285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com