本人用的是3.0.35内核,现在想通过CH438q芯片扩展8路串口,ch438q和cpu通过eim总线通信,但是我发现3.0.35内核里面没有eim总线的驱动代码,然后在Board-mx6q_sabreauto.c文件里面找到 下面这段代码(我用的板级文件是Board-mx6q_sabresd.c)- static void mx6q_setup_weimcs(void){
- void __iomem *nor_reg = MX6_IO_ADDRESS(WEIM_BASE_ADDR);
- void __iomem *ccm_reg = MX6_IO_ADDRESS(CCM_BASE_ADDR);
- unsigned int reg;
- struct clk *clk;
- u32 rate;
- /* CLKCTL_CCGR6: Set emi_slow_clock to be on in all modes */
- reg = readl(ccm_reg + 0x80);
- reg |= 0x00000C00;
- writel(reg, ccm_reg + 0x80);
- /* Timing settings below based upon datasheet for M29W256GL7AN6E
- These setting assume that the EIM_SLOW_CLOCK is set to 132 MHz */
- clk = clk_get(NULL, "emi_slow_clk");
- if (IS_ERR(clk))
- printk(KERN_ERR "emi_slow_clk not found\n");
- rate = clk_get_rate(clk);
- if (rate != 132000000)
- printk(KERN_ERR "Warning: emi_slow_clk not set to 132 MHz!"
- " WEIM NOR timing may be incorrect!\n");
- /*
- * For EIM General Configuration registers.
- *
- * CS0GCR1:
- * GBC = 0; CSREC = 6; DSZ = 2; BL = 0;
- * CREP = 1; CSEN = 1;
- *
- * EIM Operation Mode: MUM = SRD = SWR = 0.
- * (Async write/Async page read, none multiplexed)
- *
- * CS0GCR2:
- * ADH = 1
- */
-
- writel(0x00620081, nor_reg);
- writel(0x00000001, nor_reg + 0x00000004);
- /*
- * For EIM Read Configuration registers.
- *
- * CS0RCR1:
- * RWSC = 1C;
- * RADVA = 0; RADVN = 2;
- * OEA = 2; OEN = 0;
- * RCSA = 0; RCSN = 0
- *
- * CS0RCR2:
- * APR = 1 (Async Page Read);
- * PAT = 4 (6 EIM clock sycles)
- */
- writel(0x1C022000, nor_reg + 0x00000008);
- writel(0x0000C000, nor_reg + 0x0000000C);
-
- /*
- * For EIM Write Configuration registers.
- *
- * CS0WCR1:
- * WWSC = 20;
- * WADVA = 0; WADVN = 1;
- * WBEA = 1; WBEN = 2;
- * WEA = 1; WEN = 6;
- * WCSA = 1; WCSN = 2;
- *
- * CS0WCR2:
- * WBCDD = 0
- */
- writel(0x1404a38e, nor_reg + 0x00000010);
- writel(0x00000000, nor_reg + 0x00000014);
- }
我发现这里对eim总线的初始化就是直接先配置时钟,然后就对eim的寄存器进行配置就可以了。那么问题来了:1、我发现我配置的时钟频率并不是133MHz 而是135MHz,我不知道这对我下面对时序的配置是否有影响
2、因为以前有过在带设备树的内核对相同开发板的调试,发现只有当8250.c文件里面匹配到XScale 才能正常的实现串口的通信
- [PORT_XSCALE] = {
- .name = "XScale",
- .fifo_size = 32,
- .tx_loadsz = 32,
- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
- .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
- },
但是我匹配到的串口类型一直是16550A,- [PORT_16550A] = {
- .name = "16550A",
- .fifo_size = 16,
- .tx_loadsz = 16,
- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
- .flags = UART_CAP_FIFO,
- },
这导致我的串口不能正常通信。求告知这个原因是不是因为我的时序没有配置正确。
|