Red de conocimiento informático - Material del sitio web - Cómo aumentar la velocidad en baudios del puerto serie a 921600 en el sistema operativo Linux en S3C2440

Cómo aumentar la velocidad en baudios del puerto serie a 921600 en el sistema operativo Linux en S3C2440

Hablemos de lo que hice. En realidad, suena muy simple: aumentar la velocidad en baudios del puerto serie. En cuanto al entorno de hardware, utiliza el TE2440-II de Feiling (relativamente antiguo). No rocíe) El sistema operativo es linux2.6.28. Como todos sabemos, en circunstancias normales, la velocidad en baudios del puerto serie en Linux es de hasta 115200. Debido a nuestras necesidades especiales, necesitamos aumentar la velocidad en baudios. Al menos 460800, que por supuesto es el resultado más ideal, es decir, la velocidad en baudios alcanza 921600 y el fondo grande es así.

Luego, primero examinamos el hardware para ver si puede cumplir con nuestros requisitos. El chip de control principal S3C2440, en el capítulo UART, dice que bajo el reloj del sistema, la velocidad en baudios puede alcanzar hasta 115200. luego comente Dijo que si Pclk alcanza 60M, se puede lograr 921600. Seguí lo que dijo y aumenté la frecuencia principal. Por cierto, aumenté el pclk a 60M y descubrí que no se podía lograr 921600. Era posible una velocidad en baudios de 230400, la tasa de error era muy alta. No funcionó en absoluto, y luego intenté aumentar Pclk a 70 M. A través de esta forma de saciar la sed, la velocidad en baudios se pudo aumentar a 230400 y la transmisión. era estable, pero no se pudieron lograr velocidades de baudios más altas y Pclk no se pudo aumentar infinitamente. Debido a que nuestra placa de desarrollo también está conectada a una pantalla táctil, en el caso de Pclk70M, la pantalla táctil a menudo se reinicia, lo que indica que esta solución no es así. Es factible, así que lo pasé. Hablemos brevemente sobre cómo cambié el reloj del sistema Fclk, Hclk y Pclk. No entraré en detalles sobre la relación y el método de cálculo de estos tres relojes. Me refiero principalmente al blog/view/13b4c686b9d528ea80c77904.html y encontré el archivo mach-smdk2440.c en Linux. Este archivo define la estructura clk utilizada. por el puerto serie, aquí también es donde está la estructura de configuración inicial del puerto serie cuando se inicia el sistema Linux, pero cambié este lugar para que la configuración inicial prefiera fclk como fuente de reloj del puerto serie. Descubrí que esto no tuvo ningún efecto, así que continué buscando.

Solo queda una función por considerar, s3c24xx_serial_getclk(). Al ingresar a esta función, encontrará que esta función es una configuración completa del reloj del puerto serie y la velocidad en baudios. Estructura tmp_clksrc, esta estructura es muy crítica, su contenido es el siguiente:

estructura estática s3c24xx_uart_clksrc tmp_clksrc = {

.name = "pclk",

. min_baud

= 0,

.max_baud

= 0,

.divisor

= 1,

};

Como se puede ver en este nombre, la fuente de reloj predeterminada del puerto serie es pclk, que también es el culpable, pero cuando cambio el nombre a fclk, No se puede iniciar todo el sistema, incluidos los cambios mencionados anteriormente en la configuración inicial en mach-smdk2440.c, que tampoco se puede iniciar. Posteriormente, se realizó un juicio al configurar el puerto serie cuando la velocidad en baudios es inferior a 200000. la configuración de la fuente del sistema está disponible sin cambios. Cuando la velocidad en baudios es superior a 200000, la estructura tmp_clksrc ya no se usa, pero se usa una estructura definida por mí. Por supuesto, el nombre se cambia a fclk. Solo puedo cambiar la fuente del reloj de algunos parámetros internos. La fuente del reloj actual sigue siendo pclk, lo que significa que mis cambios no han tenido efecto en absoluto. Dado que esta llamada de Linux es demasiado complicada, simplemente lo intenté. Después de configurar el código del reloj del puerto serie, escribí las siguientes líneas de código para cambiar directamente los registros del S3C2440. Sé que esto es muy poco ético y puede causar fácilmente un caos en el sistema, pero lo intenté y no lo hice. esperar que realmente funcione.

Agregar

if (baudios >= 200000)

{

printk("baudios >= 200000 @----- --------samsung.c\n");

__raw_writel(0x1fc5,S3C24XX_VA_UART0 + S3C2410_UCON);

__raw_writel(0x0fc5,S3C24XX_VA_UART1 + S3C2410_UCON);

__raw_writel(0x8fc5,S3C24XX_VA_UART2 + S3C2410_UCON);

__raw_writel(32,S3C24XX_VA_UART0 + S3C2410_UCON+0x24); // Asegúrese de que la velocidad en baudios de la consola siga siendo 115200 en pantalla

__raw_writel(3,S3C24XX_VA_UART1 + S3C2410_UCON+0x24);//921600

//__raw_writel(3,S3C24XX_VA_UART1 + S3C2410_UCON+0x24);

}

El código anterior se obtuvo a través de muchos experimentos debido a que el reloj principal del sistema utilizado al principio era 400M, la división de frecuencia calculada de URDIV1 debería ser 3, pero en este caso la tasa de error es relativamente alta, aún así resultó en una falla. Para transmitir En este punto, finalmente entendí por qué el manual decía que pclk puede alcanzar 921600 a 60M. Porque si se calcula con un reloj de 60M, la división de frecuencia URDIV1 es 3.069, que es la más cercana a un número entero 3, por lo que es una onda de 921600. se puede lograr con esta tasa de error en la transmisión de velocidad de bits, por lo que configuré el reloj del sistema fclk en 420M, donde MDIV = 97, PDIV = 1, SDIV = 1 y ucon0 = 0x1fc5, ucon1 = 0x0fc5, ucon2 = 0x8fc5, por lo que n. =1+6=7, entonces la fuente de reloj del puerto serie es fclk/n=60M, lo que puede obtener una velocidad de baudios precisa de 921600. Entonces, para lograr mi objetivo inicial, puedo lograr otras velocidades de baudios, como 460800 Después de calcular el reloj principal fclk (intente calcular La división de frecuencia de URDIV1 es la más cercana a un número entero), y luego se puede lograr.

Aquí hay otra pequeña idea para aumentar la velocidad en baudios del puerto serie, también puede usar USB al puerto serie, porque el USB al puerto serie puede alcanzar 921600, y Linux tiene un controlador USB al puerto serie integrado. Solo necesito En la función abierta que llama al puerto serie, simplemente llame al nodo que convierte USB en puerto serie. Por supuesto, no he probado esta solución porque solo tenemos un puerto USB y está ocupado, así que espero amigos. Necesidad de intentarlo.