Есть 2 порта UART, использующие оборудование PL011 UART ( UART1, UART2).
После загрузки Linux я могу найти узлы устройств двух портов UART (/dev/ttyAMA0, /dev/ttyAMA1).
Приложение открывает(/dev/ttyAMAX) и записывает() в файл устройства.
Код: Выделить всё
#include
#include
#include
#include
int main( void )
{
int fd;
int retn;
int buf[10] = "write...\n";
/* Open UART */
fd = open( "/dev/ttyAMA1", O_RDWR );
if( fd < 0 )
{
perror("Open /dev/ttyAMA1 error!");
exit(-1);
}
printf("Opening /dev/ttyAMA1 -> success!\n");
/* Write Operation - Tx start */
int i;
for( i = 0; i < 10; i++ )
{
retn = write( fd, buf, 10 );
if( retn < 0 )
printf("Write() failed... retn=%d\n);
else
printf("Write() succeeded! retn=%d\n");
sleep(1);
}
/* Close UART */
printf("Closing /dev/ttyAMA1\n");
close(fd);
return 0;
}
при попытке /dev /ttyAMA0(UART1), я вижу сигнал (строка "write...\n") на эмуляторе терминала, подключенном к порту UART1, но при попытке /dev/ttyAMA1(UART2) я не вижу сигнал(" write...\n" string) на эмуляторе терминала, подключенном к порту UART2, и процесс приложения не завершается.
( В обоих случаях функции open(), write() вернули допустимое значение. )
Я проверил значение Регистр управления каждого UART, обратившись к /dev/mem, и обнаружил, что бит ENABLE UART2 не установлен в 1 в то время как UART1 установлен в 1.
(то же самое касается регистров, связанных с установкой скорости передачи данных и битов данных.)
Код: Выделить всё
...
int main( void )
{
...
fd = open("/dev/mem", O_RDWR | O_SYNC);
...
/* mmap() UART, x can be 1 or 2 */
baseaddr = mmap(0,
UARTx_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd,
UARTx_BASE);
if( baseaddr == NULL )
{
perror("mmap() error");
exit(-1);
}
printf("mmap succeeded!\n");
/* set pointer of UART Control Register */
uartcr = ( uint32_t * )( baseaddr + UARTCR_OFFSET );
/* check value of Control Register */
printf("Current UARTCR value: %#010x\n", *( uartcr ));
...
}
----------
[RESULT]
UART1: Current UARTCR value: 0x00000b01 ( bit[0] is 1 )
UART2: Current UARTCR value: 0x00000300 ( bit[0] is 0 )
UARTCR's bit[0] is UARTEN bit
Мой вопрос:< /p>
Как установить бит ENABLE UART2 из пользовательского приложения в Linux?
(точнее, как вызвать инициализацию UART2, не используя / dev/mem)
не можем ли мы установить бит ENABLE контроллера UART в Linux? можно только в загрузчике?
Я искал некоторые коды драйверов (amba-pl011.c и т. д.), но не смог понять уровень для последовательного устройства..
Подробнее здесь: https://stackoverflow.com/questions/786 ... n-on-linux