[其他MCU] imx6配置EIM总线,用于16C554拓展串口使用

[复制链接]
5976|7
 楼主| ofsummer 发表于 2016-1-4 19:59 | 显示全部楼层 |阅读模式
拓展16C554时,用到CS0片选,首先用需要配置EIM总线
  1. /* These registers settings are just valid for Numonyx M29W256GL7AN6E. */
  2. static void mx6q_setup_weimcs(void)
  3. {
  4.         void __iomem *nor_reg = MX6_IO_ADDRESS(WEIM_BASE_ADDR);
  5.         void __iomem *ccm_reg = MX6_IO_ADDRESS(CCM_BASE_ADDR);
  6.         unsigned int reg;
  7.         struct clk *clk;
  8.         u32 rate;

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

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

  18.         rate = clk_get_rate(clk);
  19.         if (rate != 132000000)
  20.                 printk(KERN_ERR "Warning: emi_slow_clk not set to 132 MHz!"
  21.                        " WEIM NOR timing may be incorrect!\n");
 楼主| ofsummer 发表于 2016-1-4 20:01 | 显示全部楼层
  1. /*
  2.          * For EIM General Configuration registers.
  3.          *
  4.          * CS0GCR1:
  5.          *        GBC = 0; CSREC = 6; DSZ = 2; BL = 0;
  6.          *        CREP = 1; CSEN = 1;
  7.          *
  8.          *        EIM Operation Mode: MUM = SRD = SWR = 0.
  9.          *                (Async write/Async page read, none multiplexed)
  10.          *
  11.          * CS0GCR2:
  12.          *        ADH = 1
  13.          */
  14.         writel(0x00620081, nor_reg);
  15.         writel(0x00000001, nor_reg + 0x00000004);

  16.         /*
  17.          * For EIM Read Configuration registers.
  18.          *
  19.          * CS0RCR1:
  20.          *        RWSC = 1C;
  21.          *        RADVA = 0; RADVN = 2;
  22.          *        OEA = 2; OEN = 0;
  23.          *        RCSA = 0; RCSN = 0
  24.          *
  25.          * CS0RCR2:
  26.          *        APR = 1 (Async Page Read);
  27.          *        PAT = 4 (6 EIM clock sycles)
  28.          */
 楼主| ofsummer 发表于 2016-1-4 20:02 | 显示全部楼层
  1. writel(0x1C022000, nor_reg + 0x00000008);
  2.         writel(0x0000C000, nor_reg + 0x0000000C);

  3.         /*
  4.          * For EIM Write Configuration registers.
  5.          *
  6.          * CS0WCR1:
  7.          *        WWSC = 20;
  8.          *        WADVA = 0; WADVN = 1;
  9.          *        WBEA = 1; WBEN = 2;
  10.          *        WEA = 1; WEN = 6;
  11.          *        WCSA = 1; WCSN = 2;
  12.          *
  13.          * CS0WCR2:
  14.          *        WBCDD = 0
  15.          */
  16.         writel(0x1404a38e, nor_reg + 0x00000010);
  17.         writel(0x00000000, nor_reg + 0x00000014);
  18. }
 楼主| ofsummer 发表于 2016-1-4 20:04 | 显示全部楼层
  1. 6个寄存器的配置
  2. 3364      writel(0x00660081, nor_reg + 0x00000000); 片选0  128M 映射空间 数据线16-23 8位的
  3. 3365     writel(0x00000001, nor_reg + 0x00000004);
  4. 3366     writel(0x1c022000, nor_reg + 0x00000008);
  5. 3367     writel(0x0000C000, nor_reg + 0x0000000c);
  6. 3368     writel(0x1404a38e, nor_reg + 0x00000010);
  7. 3369     writel(0x00000000, nor_reg + 0x00000014);
  8. 3370     writel(0x00000001, nor_reg + 0x90);
  9. 3371     printk("GPR1__CSx____is____end%x\n",reg);
 楼主| ofsummer 发表于 2016-1-4 20:05 | 显示全部楼层
  1. 增加拓展串口功能
  2. kernel_imx/drivers/tty/serial/8250_exar_st16c554.c
  3. 16 #define PORT(_base,_irq)                \
  4. 17     {                       \
  5. 18         .iobase     = _base,        \
  6. 19         .irq        = _irq,         \
  7. 20         .uartclk    = 11059200,     \
  8. 21         .iotype     = UPIO_PORT,        \
  9. 22         .flags      = UPF_BOOT_AUTOCONF,    \
  10. 23     }
  11. 24 #define CS0_BASE    0x08000000 //add cjf-_-
  12. 25
  13. 26 #define CARD1_BASE  CS0_BASE + 0x10
  14. 27 #define CARD2_BASE  CS0_BASE + 0x20
  15. 28 #define CARD3_BASE  CS0_BASE + 0x30
  16. 29 #define CARD4_BASE  CS0_BASE + 0x40
  17. 30
  18. 31 #define 16C554_INTA gpio_to_irq(IMX_GPIO_NR(1,10))
  19. 32 #define 16C554_INTB gpio_to_irq(IMX_GPIO_NR(1,15))
  20. 33 #define 16C554_INTC gpio_to_irq(IMX_GPIO_NR(1,14))
  21. 34 #define 16C554_INTD gpio_to_irq(IMX_GPIO_NR(1,11))
  22. 35
  23. 36 static struct plat_serial8250_port exar_data[] = {
  24. 37     PORT(CARD1_BASE, 16C554_INTA),
  25. 38     PORT(CARD2_BASE, 16C554_INTB),
  26. 39     PORT(CARD3_BASE, 16C554_INTC),
  27. 40     PORT(CARD4_BASE, 16C554_INTD),
  28. 41     { },
  29. 42 };
 楼主| ofsummer 发表于 2016-1-4 20:06 | 显示全部楼层
需要注意的地方:
membase:该成员描述的该串口接口寄存器虚拟地址的基地址。在初始化该成员时,需要自己把该串口接口寄存器的物理地址映射到虚拟地址空间。并且该映射工作需要在内核的板级初始化阶段完成。
.mapbase指的是16C554的物理基地址,注意不是membase;
.uartclk是16C554晶振的频率,其最高波特率为.uartclk/16;
.iotype指的是访问类型,与硬件的连接相关,
                UPIO_PORT 端口地址,8位
        UPIO_HUB6
        UPIO_MEM 8位的内存地址
        UPIO_MEM32 32位的内存地址
                UPIO_MEM32表示为32位总线访问方式,即访问16C554的寄存器时,读取32位数,取低8位;
.regshift也跟硬件的物理连接相关,指的是访问16C554的每个地址时的偏移,也就是16C554的A0对应CPU的A几;
UPF_IOREMAP指16C554寄存器需要映射到虚拟地址访问;
orangebanana 发表于 2016-1-4 20:09 | 显示全部楼层
  1. 8250.c 实行工作流程

  2. serial8250_register_ports
  3.         serial8250_isa_init_ports
  4. platform_driver_register
  5.         serial8250_isa_driver
  6.                 serial8250_probe 4次循环{
  7.                         serial8250_register_port
  8.                                 uart_add_one_port -> (文件serial_core.c) uart_configure_port->uart_report_port(打印串口信息)
  9.                                         uart_ops serial8250_pops
  10.                                                 serial8250_config_port
  11.                                                         autoconfig
  12.                                                                 autoconfig_16550a
  13.                                                 autoconfig_16550a
  14.                                                         uart_config
  15.                                                       
  16.                                                
  17.                                                       
  18. }
evanlyr 发表于 2017-8-1 22:50 | 显示全部楼层
楼主你好,请问这个扩展UART的应用,有参考电路图吗?可否发一份给我,感谢!evan_lin@126.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

71

帖子

1

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