ODROID-N2 UART Tasa de Baudios Personalizada para MIDI

Necesitaba el puerto UART de mi ODROID-N2 para trabajar con una tasa de baudios no estándar y así poder usar MIDI. Edité el código del driver UART para fijar la velocidad de baudios en 31250 cuando configuré la tasa de baudios en 38400, luego escribí el código de prueba usando wiringPi y medí la tasa de baudios.

Driver UART después de editarlo

linux/drivers/amlogic/uart/meson_uart.c

static void meson_uart_change_speed(struct uart_port *port, unsigned long baud)
{
u32 val;
struct meson_uart_port *mup = to_meson_port(port);
struct platform_device *pdev = to_platform_device(port->dev);

while (!(readl(port->membase + AML_UART_STATUS) & AML_UART_TX_EMPTY))
cpu_relax();

#ifdef UART_TEST_DEBUG
if (port->line != 0)
baud = 115200;
#endif

// this part is added.
// trace_printk() is not neccesarry, it is just for debugging.
trace_printk("Your baudrate: %ld\n", baud);
if(baud == 38400)
{
baud = 31250;
trace_printk("Change to %ld\n", baud);
}
Ref. de compilación del kernel de Linux: https://wiki.odroid.com/odroid-n2/softw ... ing_kernel

Cambios de la sección de instalación

  • arch/arm64/boot/Image -> arch/arm64/boot/Image.gz
  • arch/arm64/boot/dts/meson64_odroidn2.dtb -> arch/arm64/boot/dts/amlogic/meson64_odroidn2.dtb

Codigó de Prueba

#include 
#include

int main(void)
{
int fd1, fd2;
fd1 = serialOpen("/dev/ttyS1", 38400);
fd2 = serialOpen("/dev/ttyS2", 38400);

serialPutchar(fd1, 0xAA); // 10101010
serialPutchar(fd1, 0xAA);

int count = 0;
while(1)
{
if(serialDataAvail(fd2))
{
printf("%c", serialGetchar(fd2));
count++;
if(count == 2)
{
break;
}
}
}

serialClose(fd1);
serialClose(fd2);
}
Figure 1 - Before editing - when transmitting 10101010, 1s / pulse-width is baud rate, and 1s/26.088us is 38331 ~= 38400
Figura 1 - Antes de editar: cuando se transmite 10101010, 1s/ancho de onda es la tasa de baudios, y 1s/26.088us es 38331 ~ = 38400

Figure 2 - After editing - 1s/32.002us is 31248 ~= 31250
Figura 2 - Después de editar - 1s/32.002us es 31248 ~ = 31250

Depuración con ftrace

root@odroid:/home/odroid# stty -F /dev/ttyS0 38400
root@odroid:/home/odroid# cat /sys/kernel/debug/tracing/trace
# tracer: function_graph
#
# CPU DURATION FUNCTION CALLS
# | | | | | | |
...
0) | uart_set_termios() {
0) | uart_change_speed.isra.2() {
0) | meson_uart_set_termios() {
0) 0.875 us | uart_get_baud_rate();
0) | /* Your baudrate: 38400 */
0) | /* Change to 31250 */
0) 0.250 us | uart_update_timeout();
Si tienes pensado realizar una compilación cruzada, la secuencia es la siguiente:

  • Instalar paquetes requeridos
  • Toolchain (6.3.1)
  • Checkout(Linux tab)
  • <- edit driver
  • Compile(Basic tab)
  • Installation(Linux tab)

Para comentarios, preguntas y sugerencias, visita el post original de los foros ODROID en https://forum.odroid.com/viewtopic.php?f=180&t=36540.

Be the first to comment

Leave a Reply