打印
[i.MX]

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

[复制链接]
1916|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)
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,
        },
这导致我的串口不能正常通信。求告知这个原因是不是因为我的时序没有配置正确。

相关帖子

沙发
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文件里面
#define MX6DL_PAD_EIM_CS1__WEIM_WEIM_CS_1                                      \
                IOMUX_PAD(0x0510, 0x0140, 0, 0x0000, 0, NO_PAD_CTRL)
最后的pad_ctrl没有配置,需要我们自己配置。配置好了问题解决。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝