MAX14830 не промывает TX

Итак, после дня борьбы мне удалось заставить Debian 11 на ядре IMX7D, 5.4.129 распознать MAX14830 и поговорить с ним через драйвер MAX310X. Но когда я пытаюсь отправить данные с помощью echo a> /dev / ttyMAX0, ничего не происходит. Ну, за исключением того, что счетчик tx растет.

Глядя на трафик SPI, кажется, что он идет правильно, и чип отправляет ожидаемые ответы (счетчик TX FIFO возвращает три, если отправляются три символа), но с буфером, похоже, ничего не происходит. Драйвер продолжает запрашивать максимальное значение, но значение FIFO остается равным 3. Затем драйвер достигает тайм-аута, я думаю. Потому что затем он отправляет 0x81,0x00, который очищает регистр IRQen, за которым следует 0x9B 0x40, который устанавливает регистр скорости передачи ... что еще больше сбивает с толку.

До сих пор я просмотрел все настройки stty и использовал -ixon для отключения XON / XOFF, но это не имело значения.

Есть ли способ / место / файл, в котором хранятся настройки драйвера? Или я что-то забываю? RX, похоже, тоже не работает, но не уверен, что max не получает его или просто не информирует водителя.

Соответствующая часть DTS

      &ecspi3 {
    max14830: max14830@3 {
        compatible = "maxim,max14830";
        spi-max-frequency = <15000000>;
        reg = <0>; // SPI chip select number
        clocks = <&clk16m0>;
        clock-names = "osc";
        interrupt-parent = <&gpio5>;
        interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
        gpio-controller; // Marks the device node as a GPIO controller
        #gpio-cells = <2>;
        clk16m0: clk16m0 {
            compatible = "fixed-clock";
            #clock-cells = <0>;
            clock-frequency = <3686400>; // freq of external xtal
            clock-accuracy = <100>;
        };
   };
};

И связь во время запуска

      OUT          IN            MEANING
0x9F 0xCE               -> Write globalCmd = Enable Extend register map acces
0x05 0x00 -> 0x0F 0xB4  -> Clear SpclChrIntEn= RevID is B4
0x9F 0xCD               -> Write globalCmd = Disable Extend register map access

0x8A 0x01               -> Write UART0 Mode2 = Set RST
0x8A 0x00               -> Write UART0 Mode2 = Clear RST
0x1C 0x00 -> 0x0F 0x01  -> Read UART0 DivLSB = Div0 set
0x89 0x80               -> Set UART0 MODE1 =  ~RTS0 is three state

0xAA 0x01               -> Write UART1 Mode2 = Set RST
0xAA 0x00               -> Write UART1 Mode2 = Clear RST
0x3C 0x00 -> 0x0F 0x01  -> Read UART1 DivLSB = Div0 set
0xA9 0x80               -> Set UART1 MODE1 =  ~RTS1 is three state

0xCA 0x01               -> Write UART2 Mode2 = Set RST
0xCA 0x00               -> Write UART2 Mode2 = Clear RST
0x5C 0x00 -> 0xF 0x01   -> Read UART2 DivLSB = Div0 set
0xC9 0x80               -> Set UART2 MODE1 =  ~RTS2 is three state

0xEA 0x01               -> Write UART3 Mode2 = Set RST
0xEA 0x00               -> Write UART3 Mode2 = Clear RST
0x7C 0x00 -> 0x0F 0x01  -> Read UART3 DivLSB = Div0 set
0xE9 0x80               -> Set UART3 MODE1 = ~RTS3 is three state

0x9A 0x44               -> Write PLLConfig = Set PreDiv5 and PreDiv2
0x9E 0x14               -> Write ClockSource = 0001 0100 -> first 1 at dont care, second PLLen

0x81 0x00              -> Clear IRQen UART0 
0x02 0x00 -> 0x0F 0x60 -> Read ISR UART0 = both fifo empty
0x1B 0x00 -> 0x0F 0x00 -> Read BRConfig UART0 -> all clear
0x9B 0x40              -> Write BRConfig UART0 -> FRACT2 Set

0xA1 0x00              -> Clear IRQen UART1 
0x22 0x00 -> 0x0F 0x60 -> Read ISR UART1 = both fifo empty
0x3B 0x00 -> 0x0F 0x00 -> Read BRConfig UART1 -> all clear
0xBB 0x40              -> Write BRConfig UART1 -> FRACT2 Set

0xC1 0x00              -> Clear IRQen UART2 
0x42 0x00 -> 0x0F 0x60 -> Read ISR UART2 = both fifo empty
0x58 0x00 -> 0x0F 0x00 -> Read BRConfig UART2 -> all clear
0xDB 0x40              -> Write BRConfig UART2 -> FRACT2 Set

0xE1 0x00              -> Clear IRQen UART3 
0x62 0x00 -> 0x0F 0x60 -> Read ISR UART3 = both fifo empty
0x7B 0x00 -> 0x0F 0x00 -> Read BRConfig UART3 -> all clear
0xFB 0x40              -> Write BRConfig UART3 -> FRACT2 Set

1 ответ

Решение
  • TX не работал, потому что часы должны были быть xtal
  • RX не работал, потому что я никогда не открывал порт, но проверял / proc / tty / driver / max310x на наличие полученных данных, и драйвер отключает rx, если порт не открыт.

Рабочий узел.

      &ecspi3 {

    /delete-node/spidev@0;

    max14830: max14830@3 {
        compatible = "maxim,max14830";
        spi-max-frequency = <15000000>;
        reg = <0>; // SPI chip select number
        clocks = <&clk16m0>;
        clock-names = "xtal"; /* because using external xtal */
        interrupt-parent = <&gpio5>;
        interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
        gpio-controller;  /* Marks the device node as a GPIO controller */
        #gpio-cells = <2>;
        clk16m0: clk16m0 {
            compatible = "fixed-clock";
            #clock-cells = <0>;
            clock-frequency = <3686400>; /* external xtal frequency */
            clock-accuracy = <100>;
        };
     };
};
```
Другие вопросы по тегам