<div dir="ltr">Hi<br><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 4, 2018 at 6:31 AM, Muni Sekhar <span dir="ltr"><<a href="mailto:munisekharrms@gmail.com" target="_blank">munisekharrms@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">On Fri, May 4, 2018 at 12:04 AM, Greg KH <<a href="mailto:greg@kroah.com">greg@kroah.com</a>> wrote:<br>
> On Thu, May 03, 2018 at 08:08:48PM +0530, Muni Sekhar wrote:<br>
>> Hi All,<br>
>><br>
>> I’m trying to understand how user mode buffer is written to low level<br>
>> serial hardware registers.<br>
>><br>
>> For this I read the kernel code and I came to know that from user mode<br>
>> write() API lands into kernel’s tty_write() ("drivers/tty/tty_io.c")<br>
>> and then it calls a uart_write() ("drivers/tty/serial/serial_<wbr>core.c").<br>
>><br>
>> In uart_write(), the buffer is copied to circ_buf and then it calls<br>
>> low level serial hardware driver’s start_tx() (struct uart_ops<br>
>> .start_tx). But here I could not find how the buffer kept in circ_buf<br>
>> is copied to serial port’s TX_FIFO registers?<br>
>><br>
>> Can someone take a moment to explain me on this?<br>
><br>
> It all depends on which specific UART driver you are looking at, they<br>
> all do it a bit different depending on the hardware.<br>
><br>
> Which one are you looking at?  Look at what the start_tx callback does<br>
> for that specific driver, that should give you a hint as to how data<br>
> starts flowing.  Usually an interrupt is enabled that is used to flush<br>
> the buffer out to the hardware.<br>
><br>
<br>
</span>I’m looking for any existing sample code which does DMA transfers of<br>
UART transmitted data. I looked at the bcm63xx_uart.c, it looks it<br>
does not handle DMA transfers. Even copying the Tx buffer (from<br>
circ_buf) to UART_FIFO_REG happening in ISR.<br></blockquote><div><br></div><div>You can have a look at atmel_serial kernel module (built for ARM).<br><a href="https://elixir.bootlin.com/linux/latest/source/drivers/tty/serial/atmel_serial.c">https://elixir.bootlin.com/linux/latest/source/drivers/tty/serial/atmel_serial.c</a><br> <br></div><div>The dma buffer is linked to uart circular buffer in prepare_tx() function called from uart_startup(). It's released in release_tx() function called from uart_shutdown(). DMA buffer is managed in schedule_tx() function called from a tasklet triggered by the ISR.<br><br></div><div>HTH<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<br>
> thanks,<br>
><br>
> greg k-h<br>
<span class="gmail-HOEnZb"><font color="#888888"><br>
<br>
<br>
-- <br>
Thanks,<br>
Sekhar<br>
</font></span><div class="gmail-HOEnZb"><div class="gmail-h5"><br>
______________________________<wbr>_________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.<wbr>org</a><br>
<a href="https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" rel="noreferrer" target="_blank">https://lists.kernelnewbies.<wbr>org/mailman/listinfo/<wbr>kernelnewbies</a><br>
</div></div></blockquote></div><br></div></div></div>