[i.MX] 3.0.35内核,imx6通过eim总线和ch38q扩展8路串口,如何配置时序

[复制链接]
2195|2
 楼主| hrssbyx2341 发表于 2017-3-20 09:34 | 显示全部楼层 |阅读模式
本人用的是3.0.35内核,现在想通过CH438q芯片扩展8路串口,ch438q和cpu通过eim总线通信,但是我发现3.0.35内核里面没有eim总线的驱动代码,然后在Board-mx6q_sabreauto.c文件里面找到 下面这段代码(我用的板级文件是Board-mx6q_sabresd.c)
  1. static void mx6q_setup_weimcs(void){
  2.         void __iomem *nor_reg = MX6_IO_ADDRESS(WEIM_BASE_ADDR);
  3.         void __iomem *ccm_reg = MX6_IO_ADDRESS(CCM_BASE_ADDR);
  4.         unsigned int reg;
  5.         struct clk *clk;
  6.         u32 rate;

  7.         /* CLKCTL_CCGR6: Set emi_slow_clock to be on in all modes */
  8.         reg = readl(ccm_reg + 0x80);
  9.         reg |= 0x00000C00;
  10.         writel(reg, ccm_reg + 0x80);

  11.         /* Timing settings below based upon datasheet for M29W256GL7AN6E
  12.            These setting assume that the EIM_SLOW_CLOCK is set to 132 MHz */
  13.         clk = clk_get(NULL, "emi_slow_clk");
  14.         if (IS_ERR(clk))
  15.                 printk(KERN_ERR "emi_slow_clk not found\n");

  16.         rate = clk_get_rate(clk);
  17.         if (rate != 132000000)
  18.                 printk(KERN_ERR "Warning: emi_slow_clk not set to 132 MHz!"
  19.                        " WEIM NOR timing may be incorrect!\n");


  20.         /*
  21.          * For EIM General Configuration registers.
  22.          *
  23.          * CS0GCR1:
  24.          *        GBC = 0; CSREC = 6; DSZ = 2; BL = 0;
  25.          *        CREP = 1; CSEN = 1;
  26.          *
  27.          *        EIM Operation Mode: MUM = SRD = SWR = 0.
  28.          *                (Async write/Async page read, none multiplexed)
  29.          *
  30.          * CS0GCR2:
  31.          *        ADH = 1
  32.          */
  33.          
  34.         writel(0x00620081, nor_reg);
  35.         writel(0x00000001, nor_reg + 0x00000004);

  36.         /*
  37.          * For EIM Read Configuration registers.
  38.          *
  39.          * CS0RCR1:
  40.          *        RWSC = 1C;
  41.          *        RADVA = 0; RADVN = 2;
  42.          *        OEA = 2; OEN = 0;
  43.          *        RCSA = 0; RCSN = 0
  44.          *
  45.          * CS0RCR2:
  46.          *        APR = 1 (Async Page Read);
  47.          *        PAT = 4 (6 EIM clock sycles)
  48.          */
  49.         writel(0x1C022000, nor_reg + 0x00000008);
  50.         writel(0x0000C000, nor_reg + 0x0000000C);
  51.        
  52.         /*
  53.          * For EIM Write Configuration registers.
  54.          *
  55.          * CS0WCR1:
  56.          *        WWSC = 20;
  57.          *        WADVA = 0; WADVN = 1;
  58.          *        WBEA = 1; WBEN = 2;
  59.          *        WEA = 1; WEN = 6;
  60.          *        WCSA = 1; WCSN = 2;
  61.          *
  62.          * CS0WCR2:
  63.          *        WBCDD = 0
  64.          */
  65.         writel(0x1404a38e, nor_reg + 0x00000010);
  66.         writel(0x00000000, nor_reg + 0x00000014);
  67. }
我发现这里对eim总线的初始化就是直接先配置时钟,然后就对eim的寄存器进行配置就可以了。那么问题来了:1、我发现我配置的时钟频率并不是133MHz 而是135MHz,我不知道这对我下面对时序的配置是否有影响
2、因为以前有过在带设备树的内核对相同开发板的调试,发现只有当8250.c文件里面匹配到XScale 才能正常的实现串口的通信
  1. [PORT_XSCALE] = {
  2.                 .name                = "XScale",
  3.                 .fifo_size        = 32,
  4.                 .tx_loadsz        = 32,
  5.                 .fcr                = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
  6.                 .flags                = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
  7.         },
但是我匹配到的串口类型一直是16550A,
  1. [PORT_16550A] = {
  2.                 .name                = "16550A",
  3.                 .fifo_size        = 16,
  4.                 .tx_loadsz        = 16,
  5.                 .fcr                = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
  6.                 .flags                = UART_CAP_FIFO,
  7.         },
这导致我的串口不能正常通信。求告知这个原因是不是因为我的时序没有配置正确。
 楼主| hrssbyx2341 发表于 2017-3-20 11:24 | 显示全部楼层
KERNEL打印信息是Warning: emi_slow_clk not set to 132 MHz! WEIM NOR timing may be incorrect! emi_slow_clk = 135000000Hz
后面的135000000Hz是我自己打印出来的
 楼主| hrssbyx2341 发表于 2017-3-20 16:44 | 显示全部楼层
最后发现问题在于io的引脚没有配置好,在iomux文件里面
  1. #define MX6DL_PAD_EIM_CS1__WEIM_WEIM_CS_1                                      \
  2.                 IOMUX_PAD(0x0510, 0x0140, 0, 0x0000, 0, NO_PAD_CTRL)
最后的pad_ctrl没有配置,需要我们自己配置。配置好了问题解决。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部