本节简单记录了有关我基于 rust-raspberrypi-os-tutorials and raspi4-with-arceos-doc 开启其他串口的过程。
- 按照 [bcm::5.3] 的说法,GPIO在默认情况下存在最多六种替代功能,
在默认情况下采用。因此,如果想要启用ALT0
UART5
,则需要启用GPIO 12
GPIO 13
引脚的ALT4
替换。
Every GPIO pin can carry an alternate function. Up to 6 alternate functions are available but not every pin has that many alternate functions. The table below gives a quick overview.
- 因此,根据 [bcm::5.2 Register View] 的说法,需要根据
GPIO
所在的位置修改对应的GPFSEL
寄存器,在目前情况下来说是GPFSEL0
寄存器。
The function select registers are used to define the operation of the general-purpose I/O pins. Each of the 58 GPIO pins has at least two alternative functions as defined in Section 5.3. The FSELn field determines the functionality of the nth GPIO pin. All unused alternative function lines are tied to ground and will output a “0” if selected. All pins reset to normal GPIO input operation.
根据目前的代码实现来看,只需要在现有的两个串口的实现上添加新的实现即可,具体的内容根据 [bcm::5.2::GPFSEL1 Register] 的相关规定进行书写。 启用 ALT0
需要设置该位为 0b100
, ALT4
则为 0b011
。
// GPIO registers.
register_bitfields! {
u32,
/// GPIO Function Select 1
GPFSEL1 [
/// Pin 15
FSEL15 OFFSET(15) NUMBITS(3) [
Input = 0b000,
Output = 0b001,
AltFunc0 = 0b100 // PL011 UART0 RX
],
/// Pin 14
FSEL14 OFFSET(12) NUMBITS(3) [
Input = 0b000,
Output = 0b001,
AltFunc0 = 0b100 // PL011 UART0 TX
],
/// Pin 13
FSEL13 OFFSET(9) NUMBITS(3) [
Input = 0b000,
Output = 0b001,
AltFunc4 = 0b011, // PLO11 UART5 RX
],
/// Pin 12
FSEL12 OFFSET(6) NUMBITS(3) [
Input = 0b000,
Output = 0b001,
AltFunc4 = 0b011, // PLO11 UART5 TX
],
],
- 按照教程来说,第三步需要修改
GPIO_PUP_PDN_CNTRL_REG0
寄存器将对应值设置为0b01
Pull Up select resistor。但是根据我目前的测试,根据 [bcm::11.3 Primary UART Inputs and Outputs] 的说法,理论上来说应该 GPIO12,13引脚被设置成为 High,而GPIO 14,15应该设置成为 Low, 而并非按照教程上所说的在偏移地址为0xe4的GPIO_PUP_PDN_CNTRL_REG0寄存器中将值变为0b0101_0101_0000_0000_0000_0000_0000_0000即0x5500_0000。
11.3 Primary UART Inputs and Outputs | |||||||
---|---|---|---|---|---|---|---|
PULL | ALT0 | ALT1 | ALT2 | ALT3 | ALT4 | ALT5 | |
GPOP 12 | High | TXD5 | |||||
GPIO 13 | High | RXD5 | |||||
GPIO 14 | Low | TXD0 | |||||
GPIO 15 | Low | RXD0 |
这个说法似乎是基于 [bcm:5.3. Alternative Function Assignments] 的,但是在这个表中 GPIO 12-15
都属于 Low,根据 GPIO_PUP_PDN_CNTRL_REG0
的说法,理论上如果要实现应该设置为 Pull Down ?
5.3 Alternative Function Assignments | |||||||
---|---|---|---|---|---|---|---|
PULL | ALT0 | ALT1 | ALT2 | ALT3 | ALT4 | ALT5 | |
GPOP 12 | Low | PWM0_0 | SD4 | DPI_D8 | SPI5_CEO_N | TXD5 | SDA5 |
GPIO 13 | Low | PWM0_1 | SD5 | DPI_D9 | SPI5_MISO | RXD5 | SCL5 |
GPIO 14 | Low | TXD0 | SD6 | DPI_D10 | SPI5_MOSI | CTS5 | TXD1 |
GPIO 15 | Low | RXD0 | SD7 | DPI_D11 | SPI5_SCLK | RTS5 | RXD1 |
(这个地方就不是很了解为什么,但是在进行测试的时候 14,15 引脚在该寄存器变更为 PullDown 会导致无法连接并且损坏当前 SD 卡中的文件的情况,但是对于 GPIO 12,13 似乎就不存在对应的限制)
(同时还基于万用表进行了外部测试,发现无论这个寄存器值设置成为 PullUp 还是 PullDown,在万用表中两个引脚均表示为低电位)
但是根据 GPIO_PUP_PDN_CNTRL_REG0
章节所说的 The Alternate function table also has the pull state which is applied after a power down
理论上来说,应该不参考 [bcm:5.3] 表所给出的 Pull 状态才对。