Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)
在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题。在现在的Linux内核中,对于TI的ARM芯片,早已经有了比较通用的MUX配置框架。这对于许多TI的芯片都是通用的,这次看AM335X的代码顺手写一下分析,以备后用。
- TI的CPU芯片手册有两种:
- 一种是datasheet(DS:数据手册),较小,只是大概介绍下芯片的结构;
- 另一种是Technical Reference Manual(TRM:技术参考手册),较大,详细介绍芯片的各部分功能原理和寄存器定义。
- 在开发过程中,这两个手册都需要参考,是互补的。
- mux.h
- mux.c
- mux33xx.h
- mux33xx.c
- board-am335xevm.c
- (还有一些用到了:arch/arm/plat-omap/include/plat/omap_hwmod.h)
![](http://blog.chinaunix.net/attachment/201202/7/20543672_1328599181Utcf.jpeg)
- /**
- * struct mux_partition - 包含分区相关信息
- * @name: 当前分区名
- * @flags: 本分区的特定标志
- * @phys: 物理地址
- * @size: 分区大小
- * @base: ioremap 映射过的虚拟地址
- * @muxmodes: 本分区mux节点链表头
- * @node: 分区链表头
- */
- struct omap_mux_partition {
- const char *name;
- u32 flags;
- u32 phys;
- u32 size;
- void __iomem *base;
- struct list_head muxmodes;
- struct list_head node;
- };
- /**
- * struct omap_mux_entry - mux信息节点
- * @mux: omap_mux结构体
- * @node: 链表节点
- */
- struct omap_mux_entry {
- struct omap_mux mux;
- struct list_head node;
- };
- /**
- * struct omap_mux - omap mux 寄存器偏移和值的数据
- * @reg_offset: 从Control Module寄存器基地址算起的mux寄存器偏移
- * @gpio: GPIO 编号
- * @muxnames: 引脚可用的信号模式字符串指针数组
- * @balls: 封装中可用的引脚
- */
- struct omap_mux {
- u16 reg_offset;
- u16 gpio;
- #ifdef CONFIG_OMAP_MUX
- char *muxnames[OMAP_MUX_NR_MODES];
- #ifdef CONFIG_DEBUG_FS
- char *balls[OMAP_MUX_NR_SIDES];
- #endif
- #endif
- };
- #define _AM33XX_MUXENTRY(M0, g, m0, m1, m2, m3, m4, m5, m6, m7) \
- { \
- .reg_offset = (AM33XX_CONTROL_PADCONF_##M0##_OFFSET), \
- .gpio = (g), \
- .muxnames = { m0, m1, m2, m3, m4, m5, m6, m7 }, \
- }
- /**
- * struct omap_board_mux - 初始化mux寄存器的数据
- * @reg_offset: 从Control Module寄存器基地址算起的mux寄存器偏移
- * @mux_value: 希望设置的mux寄存器值
- */
- struct omap_board_mux {
- u16 reg_offset;
- u16 value;
- };
- #ifdef CONFIG_OMAP_MUX
- static struct omap_board_mux board_mux[] __initdata = {
- AM33XX_MUX(I2C0_SDA, OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
- AM33XX_INPUT_EN | AM33XX_PIN_OUTPUT),
- AM33XX_MUX(I2C0_SCL, OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
- AM33XX_INPUT_EN | AM33XX_PIN_OUTPUT),
- { .reg_offset = OMAP_MUX_TERMINATOR },
- };
- #else
- #define board_mux NULL
- #endif
- /* 如果引脚没有定义为输入,拉动电阻将会被禁用
- * 如果定义为输入,所提供的标志位将确定拉动电阻的配置
- */
- #define AM33XX_MUX(mode0, mux_value) \
- { \
- .reg_offset = (AM33XX_CONTROL_PADCONF_##mode0##_OFFSET), \
- .value = (((mux_value) & AM33XX_INPUT_EN) ? (mux_value)\
- : ((mux_value) | AM33XX_PULL_DISA)), \
- }
- /**
- * omap_mux_init - MUX初始化的私有函数,请勿使用
- * 由各板级特定的MUX初始化函数调用
- */
- int omap_mux_init(const char *name, u32 flags,
- u32 mux_pbase, u32 mux_size,
- struct omap_mux *superset,
- struct omap_mux *package_subset,
- struct omap_board_mux *board_mux,
- struct omap_ball *package_balls);
- /**
- * am33xx_mux_init() - 用板级特定的设置来初始化MUX系统
- * @board_mux: 板级特定的MUX配置表
- */
- int __init am33xx_mux_init(struct omap_board_mux *board_subset)
- {
- return omap_mux_init("core", 0, AM33XX_CONTROL_PADCONF_MUX_PBASE,
- AM33XX_CONTROL_PADCONF_MUX_SIZE, am33xx_muxmodes,
- NULL, board_subset, NULL);
- }
- /**
- * omap_mux_init_signal - 根据信号名字符串初始化一个引脚的mux
- * @muxname: mode0_name.signal_name的格式的Mux名称
- * @val: mux寄存器值
- */
- int omap_mux_init_signal(const char *muxname, int val);
- /**
- * omap_mux_get() - 通过名字返回一个mux分区
- * @name: mux分区名
- *
- */
- struct omap_mux_partition *omap_mux_get(const char *name);
- /**
- * omap_mux_read() - 读取mux寄存器(通过分区结构体指针和寄存器偏移值)
- * @partition: Mux分区
- * @mux_offset: mux寄存器偏移
- *
- */
- u16 omap_mux_read(struct omap_mux_partition *p, u16 mux_offset);
- /**
- * omap_mux_write() - 写mux寄存器(通过分区结构体指针和寄存器偏移值)
- * @partition: Mux分区
- * @val: 新的mux寄存器值
- * @mux_offset: mux寄存器偏移
- *
- * 这个函数仅有在非GPIO信号的动态复用需要
- */
- void omap_mux_write(struct omap_mux_partition *p, u16 val, u16 mux_offset);
- /**
- * omap_mux_write_array() - 写mux寄存器阵列
- * @partition: Mux分区
- * @board_mux: mux寄存器阵列 (用MAP_MUX_TERMINATOR结尾)
- *
- * 这个函数仅有在非GPIO信号的动态复用需要
- */
- void omap_mux_write_array(struct omap_mux_partition *p,
- struct omap_board_mux *board_mux);
- /**
- * omap_mux_init_gpio - 根据GPIO编号初始化一个信号引脚
- * @gpio: GPIO编号
- * @val: mux寄存器值
- */
- int omap_mux_init_gpio(int gpio, int val);
- /**
- * omap_mux_get_gpio() - 根据GPIO编号获取一个mux寄存器值
- * @gpio: GPIO编号
- *
- */
- u16 omap_mux_get_gpio(int gpio);
- /**
- * omap_mux_set_gpio() - 根据GPIO编号设定一个mux寄存器值
- * @val: 新的mux寄存器值
- * @gpio: GPIO编号
- *
- */
- void omap_mux_set_gpio(u16 val, int gpio);
- /* 模块引脚复用结构体 */
- struct pinmux_config {
- const char *string_name; /* 信号名格式化字符串,“模式0字符串.目标模式字符串“ */
- int val; /* 其他mux寄存器可选配置值 */
- };
- /*
- * @pin_mux - 单个模块引脚复用结构体
- * 其中定义了本模块所有引脚复用细节.
- */
- static void setup_pin_mux(struct pinmux_config *pin_mux)
- {
- int i;
- for (i = 0; pin_mux->string_name != NULL; pin_mux++)
- omap_mux_init_signal(pin_mux->string_name, pin_mux->val);
- }
- static struct pinmux_config d_can_ia_pin_mux[] = {
- {"uart0_rxd.d_can0_tx", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL},
- {"uart0_txd.d_can0_rx", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLUP},
- {NULL, 0},
- };
- ......
- static void d_can_init(int evm_id, int profile)
- {
- switch (evm_id) {
- case IND_AUT_MTR_EVM:
- if ((profile == PROFILE_0) || (profile == PROFILE_1)) {
- setup_pin_mux(d_can_ia_pin_mux);
- /* Instance Zero */
- am33xx_d_can_init(0);
- }
- break;
- case GEN_PURP_EVM:
- if (profile == PROFILE_1) {
- setup_pin_mux(d_can_gp_pin_mux);
- /* Instance One */
- am33xx_d_can_init(1);
- }
- break;
- default:
- break;
- }
- }
Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)相关推荐
- 安卓 体验linux mux,Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)
对于许多TI的芯片来说,引脚复用的配置是在Control Module(配置模块)的寄存器里配置的,(这个和三星的CPU有点不同,三星的一般在GPIO的寄存器中配置).所以当你需要配置这些寄存器的时候 ...
- LibOpenCM3(一) Linux下命令行开发环境配置
目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3(三) .ld文件(连接器脚本)和startup代码说 ...
- Linux下mysql支持中文,linux下mysql环境支持中文配置步骤
sql脚本执行前加上: CREATE DATABASE IF NOT EXISTS mydatabase DEFAULT CHARSET utf8 COLLATE UTF8_GENERAL_CI; u ...
- Linux下samba的安装与配置
physique 博客园 首页 新随笔 联系 管理 订阅 随笔- 203 文章- 0 评论- 33 Linux下samba的安装与配置 转载来源:http://blog.chinaunix.net ...
- Linux下USB suspend/resume源码分析【转】
转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...
- Linux下Nagios的安装与配置
Linux下Nagios的安装与配置 2017-03-23 17:40:20 来源: 点击:0 Nagios是企业普遍使用的最具影响力的网络信息监视系统之一,它可以动态监视指定的网络状态 ...
- Linux下MySQL数据库主从同步配置
操作系统:CentOS 6.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备篇: 说 ...
- WINDOWS与LINUX下的DNS轮询配置
11月12日我参加了51CTO的技术沙龙"Exchange Server系统升级与迁移",两位老师的分享都比较精彩,也让我学到了一些EXCHANGE在升级和迁移方面的知识和经验.记 ...
- linux下jdk的安装与配置jdk-6u45-linux-i586.bin
linux下jdk的安装与配置 一.安装JDK从sun网站上直接下载JDK:http://download.oracle.com/otn-pub/java/jdk/6u45-b06/jdk-6u45- ...
最新文章
- 《简明电路分析》——1.6节简单电路分析实例
- SAP各种产品中的客户主数据模型建模详解
- Mysql数据库多实例配置
- oracle中长字符串长度吗,Oracle 字符串长度函数
- 03-17 APP自动遍历测试技术
- 电脑账户与用户账户编码规则
- awt中监听输入框textField
- Andrew Ng机器学习课程17(1)
- AppStore图片尺寸以及内容要求Screenshot specifications
- 复制移动VMware Workstation虚拟机文件产生的问题【转】
- matlab 数据拟合相关
- Android iTOP-4412全能版 CAN通信集成(完整篇)
- 软件测试面试题(面试前准备篇)
- 维基百科放弃php,部署维基百科后页面出现的错误
- Linux系统 应急响应自动化检测工具 GScan ——使用教程
- 全面了解IDC数据中心
- 使用命令行生成文件目录树
- 巴拿赫空间的基本概念
- 老哥教你如何将springboot打包成exe程序
- MTK BROM 作用
热门文章
- Centos7 Greenplum6.1开源版本集群部署
- linux查看命令类型,查看linux命令类型
- 天猫整站SSM-分页-limit(做个人学习笔记整理用)
- 艾创机器人_世界教育机器人大赛 2019赛季世界锦标赛落幕曲靖代表队获多个奖项...
- 掘金浏览器插件安装图文教程
- 移植U-BOOT之支持烧写YAFFS文件系统以及制作U-BOOT补丁
- SpringBoot 使用教程
- 谈一下我对如何设计微服务接口的理解和思考
- ABAP:从例子学习ABAP
- $(document).ready()和window.onload之间的差异