DSP

[DM814x笔记]引脚复用配置

2019-07-13 12:04发布

在TI814x设备中,复位时,默认的引脚复用配置被设置为Mode0(FUNCTION 1)。如果想将某些引脚配置成其他的功能而不是Mode0,或者说重载在U-Boot中已经设置好的引脚配置,内核需要重新配置。        引脚配置可以有两种方法: 1、在arch/arm/mach-omap2/board-ti8148evm.c中的board_mux数组中添加特定的复用入口。比如在board_mux中添加
TI814X_MUX(MTSI_DCLK, OMAP_MUX_MODE1|OMAP_PULL_UP)或TI814X_MUX(MTSI_DCLK, OMAP_MUX_MODE1),要注意必须放在{.reg_offset=OMAP_MUX_TERMINATOR}之前。
2、在arch/arm/mach-omap2/devices.c中的初始化omap2_init_devices()函数中调用函数omap_mux_init_signal()。比如:omap_mux_init_signal("gmiil_rxclk",OMAP_PULL_UP)或omap_mux_init_signal("gmiil_rxclk",0)。        其中引脚复用信号的名字及其使用的模式种类在内核源码目录中的arch/arm/mach-omap2/mux814x.c中的muxmodes[]数组指定。        查看引脚的复用情况,可以使用debugfs。 # mount -t debugfs none /sys/kernel/debug # cat /sys/kernel/debug/omap_mux/clkin32        关于引脚复用有比较特殊的几个IO需要注意。比如GP0[1]、GP1[7]~GP1[10],要使用其GPIO的功能,需要做如下配置。        首先,使能时钟: //enable GP0 GP1 Clock,见TMS320DM816x Technical Reference Manual.pdf中的RCM_ALWON_GPIO_0_CLKCTRL Register /* PRCM Base Address */ #define PRCM_BASE 0x48180000 #define CM_ALWON_GPIO_0_CLKCTRL (PRCM_BASE + 0x155c) #define CM_ALWON_GPIO_1_CLKCTRL (PRCM_BASE + 0x1560)
__raw_write(0x102,CM_ALWON_GPIO_0_CLKCTRL); while((__raw_read(CM_ALWON_GPIO_0_CLKCTRL)&0x03)!=0x2);
__raw_write(0x102,CM_ALWON_GPIO_1_CLKCTRL); while((__raw_read(CM_ALWON_GPIO_1_CLKCTRL)&0x03)!=0x2);
//GP0_1 Mode7 __raw_write(0x00040080,0x4818081c);
       其次,在U-Boot中定义如下变量: #define MLBP_SIG_IO_CTRL_FOR_GPb7b8  0x48140E18 #define MLBP_SIG_IO_CTRL_FOR_GPb9b10 0x48140E1C #define MLBP_SIG_IO_CTRL_VAL 0x3F //set 3LB to enable;2 lvcmos buffer, padn receiver, padp receiver
#define GPIO1_OE 0x4804C134 #define GPIO1_SETDATAOUT 0x4804C194 #define GPIO1_CLEARDATAOUT 0x4804C190 #define GPIO1_DATAOUT 0x4804C13C
#define WR_MEM_32(addr,data) *(unsigned int *)(addr)=(unsigned int)(data) #define RD_MEM_32(addr) *(unsigned int *)addr WR_MEM_32(MLBP_SIG_IO_CTRL_FOR_GPb7b8, MLBP_SIG_IO_CTRL_VAL); WR_MEM_32(MLBP_SIG_IO_CTRL_FOR_GPb9b10, MLBP_SIG_IO_CTRL_VAL);
//将引脚配置成GPIO功能并上拉 (*(volatile unsigned int *)(0x481408F4))=(volatile unsigned int)((1<<19)|(1<<18)|(1<<17)|(1<<7)); //GP1_7 (*(volatile unsigned int *)(0x481408F8))=(volatile unsigned int)((1<<19)|(1<<18)|(1<<17)|(1<<7)); //GP1_8 (*(volatile unsigned int *)(0x481408FC))=(volatile unsigned int)((1<<19)|(1<<18)|(1<<17)|(1<<7)); //GP1_9
//输出使能 val=__raw_readl(GPIO1_OE); val&=(~((1<<7)|(1<<8)|(1<<9))); __raw_writel(val, GPIO1_OE);
//置位 val=__raw_readl(GPIO1_SETDATAOUT); val|=((1<<7)|(1<<8)|(1<<9)); __raw_writel(val, GPIO1_SETDATAOUT);
//清零 val=__raw_readl(GPIO1_CLEARDATAOUT); val|=((1<<7)|(1<<8)|(1<<9)); __raw_writel(val, GPIO1_CLEARDATAOUT);
Reference: http://repository.timesys.com/buildsources/u/u-boot/u-boot-2010.06/u-boot-2010.06-ti81xx-201202011623.patch http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/716/t/153934.aspx
转载地址:http://weimenlove.blog.163.com/blog/static/177754732012101311230450/