linux驱动:TI+DM8127+GPIO(三)之omap_hwmod中添加GPIO资源
三、【GPIO驱动框架》向omap_hwmod中添加GPIO资源】
***将GPIO硬件信息添加到注册到omap_hwmod_list列表中
Arch/arm/plat-omap/include/plat/ti81xx.h中
#define TI814X_GPIO3_BASE 0x481AE000
Arch/arm/plat-omap/gpio.c中
输入输出控制寄存器偏移地址
#define OMAP4_GPIO_OE 0x0134
Arch/arm/mach-omap2/Omap_hwmod_81xx_data.c中
/* L4 SLOW -> GPIO4 */
static struct omap_hwmod_addr_space ti814x_gpio4_addrs[] = {
{
.pa_start =TI814X_GPIO3_BASE,
.pa_end = TI814X_GPIO3_BASE + SZ_4K - 1,
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
},
};
static struct omap_hwmod_ocp_if ti814x_l4_slow__gpio4 = {
.master =&ti816x_l4_slow_hwmod,
.slave =&ti814x_gpio4_hwmod,
.addr = ti814x_gpio4_addrs,
.addr_cnt = ARRAY_SIZE(ti814x_gpio4_addrs),
.user =OCP_USER_MPU | OCP_USER_SDMA,
};
/* gpio4 slave ports */
static struct omap_hwmod_ocp_if *ti814x_gpio4_slaves[] = {
&ti814x_l4_slow__gpio4,
};
static struct omap_hwmod ti814x_gpio4_hwmod = {
.name ="gpio4",
.class =&ti81xx_gpio_hwmod_class,
.mpu_irqs = ti814x_gpio4_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(ti814x_gpio4_irqs),
.main_clk = "gpio4_ick",
.prcm= {
.omap4 = {
.clkctrl_reg= TI81XX_CM_ALWON_GPIO_1_CLKCTRL,
},
},
.opt_clks = gpio4_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(gpio4_opt_clks),
.dev_attr = &gpio_dev_attr,
.slaves =ti814x_gpio4_slaves,
.slaves_cnt = ARRAY_SIZE(ti814x_gpio4_slaves),
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_TI814X |CHIP_IS_DM385 |
CHIP_IS_TI811X),
#if defined(CONFIG_MACH_DM385IPNC) ||defined(CONFIG_MACH_TI8148IPNC)
.flags =HWMOD_INIT_NO_RESET,
#endif
};
static __initdata struct omap_hwmod *ti81xx_hwmods[] = {
。。。。。。
&ti81xx_gpio1_hwmod,
&ti81xx_gpio2_hwmod,
&ti814x_gpio3_hwmod,
&ti814x_gpio4_hwmod,
&ti814x_gpio5_hwmod,
&ti814x_gpio6_hwmod,
&ti81xx_usbss_hwmod,
&ti81xx_elm_hwmod,
NULL,
};
int __init ti81xx_hwmod_init(void)
{
returnomap_hwmod_init(ti81xx_hwmods);//注册到omap_hwmod_list列表中
}
Arch/arm/mach-omap2/io.c
void __init omap2_init_common_infrastructure(void)
{
。。。。。。
}else if (cpu_is_ti81xx()) {
ti81xx_powerdomains_init();
omap2_clockdomains_init();
ti81xx_hwmod_init();
}
。。。。。。
Arch/arm/mach-omap2/board-ti8148ipnc.c
static void __init ti8148_ipnc_init_irq(void)
{
omap2_init_common_infrastructure();
omap2_init_common_devices(NULL,NULL);
omap_init_irq();
gpmc_init();
}
Arch/arm/mach-omap2/board-ti8148ipnc.c
MACHINE_START(TI8148IPNC,"ti8148ipnc")
/*Maintainer: Texas Instruments */
.boot_params = 0x80000100,
.map_io =ti8148_ipnc_map_io,
.reserve = ti81xx_reserve,
.init_irq = ti8148_ipnc_init_irq,
.init_machine = ti8148_ipnc_init,
.timer =&omap_timer,
MACHINE_END
linux驱动:TI+DM8127+GPIO(三)之omap_hwmod中添加GPIO资源相关推荐
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用
文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...
- linux驱动开发篇(三)—— 总线设备驱动模型
linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...
- ESP32修改BootLoader:在boot中添加GPIO和IIC驱动方式
ESP32修改BootLoader:在boot中添加GPIO和IIC驱动方式 1. ESP Bootloader简介 ESP32有着强大的引导加载程序(Bootloader)功能: 主要执行以下任务: ...
- linux驱动学习笔记(三)阻塞与非阻塞IO
Linux驱动中阻塞与非阻塞IO 前言 阻塞 非阻塞 一.等待队列 1.等待队列头 2.等待队列 模板 二.轮询 模板 总结 前言 阻塞和非阻塞io是两种不同的设备访问方式. 阻塞 阻塞IO表示在执行 ...
- Linux驱动编程篇(三)——LED驱动(一)简单LED驱动
一.LED驱动程序的实现目标及流程图 1.打开LED 2.关闭LED 二.LED驱动程序的实现部分 1.内核层LED驱动程序 2.应用层LED测试程序 三.内核层LED驱动程序的编程步骤 1.添加头文 ...
- Linux驱动编程 step-by-step (三) 字符设备中 重要的数据结构
字符设备中 重要的数据结构 大部分字符驱动设计三个重要的数据结构 <linux/fs.h> struct file_operations struct file struct inode ...
- Linux驱动的软件架构(三):主机驱动与外设驱动分离的设计思想
<Linux设备驱动开发详解>的学习笔记 1.主机驱动与外设驱动分离 Linux中的SPI.I2C.USB等子系统都利用了典型的把主机驱动和外设驱动分离的想法,让主机端只负责产生总线上的传 ...
- [ Linux驱动炼成记 ] 15 - 存储器EMMC中Ext4文件系统 中 磁盘空间占用率100%
产品现象 : 设备(Linux 系统) 运行一段时间后,其中某一个分区 /et/config 突然占用率为100%,而实际空间可能1%都不到. 这种问题百思不得其解.谷歌/百度 所遇到的解决方案都是嵌 ...
- linux qt 背景图片,《转》qt中添加背景图片(stylesheet)
摘要: QT Create中,对button或者window等部件设置背景.颜色.透明等样式时,需要用到stylesheet,可以直接在代码里写,也可以在ui设计师里通过右键change styles ...
最新文章
- JavaScript中的字符串操作(转)
- PyQt5 技巧篇-按钮竖排显示方法,Qt Designer设置按钮竖排显示。
- crtlc不能复制文件_ctrl+c不能复制怎么办
- html不用点击自动执行,页面自动执行(加载)js的几种方法
- SSH putty Disconnected: Server protocol violation: unexpected SSH2_MSG_UNIMPLEMENTED packet
- mysql备份更换存储引擎_mysql数据库innodb存储引擎备份脚本
- python三方库之paramiko
- id,rowid,rownum 区别
- C++并发中的条件变量 std::condition_variable
- 更改oracle字符集为utf_oracle字符集AL16UTF16改为ZHS16GBK
- [原创]Eclipse 安卓开发几个异常的处理办法
- Effective C++条款05:了解C++默默编写并调用哪些函数
- python——numpy——roll()函数
- msdtc.exe dll劫持
- 万字详文阐释程序员修炼之道
- 【Nand2tetris】Project02
- 参加计算机比赛英语,高中英语作文关于电脑比赛的
- Go语言学习 二十三 错误处理和运行时恐慌(Panic)
- 2022-2027年中国巴西鲷鱼养殖行业市场调研及未来发展趋势预测报告
- android 设置字体大小不随系统大小变化,App字体大小不随系统改变而改变
热门文章
- kernfs_addrm_start kernfs_add_one
- POJ - 2446 Chessboard 二分匹配+建图
- easy-x库graphics.h图形库安装
- Java编写胖老鼠的交易_猫和胖老鼠
- 解决:vs2013 错误	1	error MSB8031: Building an MFC project for a non-Unicode character set is deprecated.
- php数据库字段类型,mysql 字段类型说明
- 神经网络输出大小(卷积层及池化层)
- 打印几个关键的java环境变量
- CDN和Web Cache领域相关的经典书籍推荐
- UE4场景设计学习教程