1 uart的platform驱动框架
首先看一下在设备树文件imx6ull.dtsi中,串口UART3对应的设备节点,内容如下:
1 uart3: serial@021ec000 {
2 compatible = "fsl,imx6ul-uart",
3 "fsl,imx6q-uart", "fsl,imx21-uart";
4 reg = <0x021ec000 0x4000>;
5 interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
6 clocks = <&clks IMX6UL_CLK_UART3_IPG>,
7 <&clks IMX6UL_CLK_UART3_SERIAL>;
8 clock-names = "ipg", "per";
9 dmas = <&sdma 29 4 0>, <&sdma 30 4 0>;
10 dma-names = "rx", "tx";
11 status = "disabled";
12 };
其中,根据compatible属性值:“fsl,imx6ul-uart”、“fsl,imx6q-uar”和“fsl,imx21-uart”。在内核源码中搜索这三个值即可找到对应的 UART 驱动文件,此文件为drivers/tty/serial/imx.c,在此文件中可以找到如下内容:
267 static struct platform_device_id imx_uart_devtype[] = {
268 {
269 .name = "imx1-uart",
270 .driver_data = (kernel_ulong_t) &imx_uart_devdata[IMX1_UART],
271 }, {
272 .name = "imx21-uart",
273 .driver_data = (kernel_ulong_t) &imx_uart_devdata[IMX21_UART],
274 }, {
275 .name = "imx6q-uart",
276 .driver_data = (kernel_ulong_t) &imx_uart_devdata[IMX6Q_UART],
277 }, {
278 /* sentinel */
279 }
280 };
281 MODULE_DEVICE_TABLE(platform, imx_uart_devtype);
282
283 static const struct of_device_id imx_uart_dt_ids[] = {
284 {
.compatible = "fsl,imx6q-uart", .data = &imx_uart_devdata[IMX6Q_UART], },
285 {
.compatible = "fsl,imx1-uart", .data = &imx_uart_devdata[IMX1_UART], },
286 {
.compatible = "fsl,imx21-uart", .data = &imx_uart_devdata[IMX21_UART], },
287 {
/* sentinel */ }
288 }