1
|
UndergroundCoding · 技术社区 · 7 年前 |
![]() |
1
1
经过大量研究,我发现了一些有用的链接,如 this one 和 this one . 需要指出的是,GPIOs寄存器1、2和3的默认设置为 时钟已禁用 ,因此在尝试访问寄存器时出现分段错误。当系统请求导出GPIO时,它会启用时钟,GPIO寄存器可供使用。 为了解决这个问题,我们需要手动启用这些GPIO的时钟。我无法对链接中的代码示例执行此操作。 但是,通过使用
在运行插入mod之前,我已经找到了可以正常工作的东西。通过监视每个GPIO上的时钟值,我发现该值从某个值变为“2”。然而,手动在这些值中输入2并不足以让GPIO工作。 如果我想办法通过内存控制正确启用时钟,我会更新这个答案。 编辑: 经过更多的麻烦和研究,我已经让代码正常工作了。我将其作为一个单独的模块编写,并在插入问题上发布的模块之前插入:
从 AM335x and AMIC110 Sitara⢠ProcessorsTechnical Reference Manual ,我们可以看到 CM\U PER\U GPIO#\U CLKCTRL寄存器 组织(其中#代表我们正在查看的GPIO银行):
表8-60:。CM\U PER\U GPIO2\U CLKCTRL寄存器字段描述
它还告诉我们寄存器的重置(默认)值为 30000小时 ,表示时钟已禁用,表示 模块已禁用 . |
![]() |
2
0
关于代码为什么会出现分段错误的答案实际上无关紧要,因为作为一个内核模块,它被误导了,需要抛出,您需要重写它。您的模块绝对无权尝试直接访问“GPIO(控制)寄存器”,这些寄存器已经由pin控制所有( pinctrl公司 )子系统。
GPIO引脚是内核管理的(通用)资源。您是否会编写一个驱动程序,该驱动程序刚开始使用任意内存块作为其缓冲区?
请参阅适当的GPIO文档以了解您使用的Linux内核的确切版本: Documentation/gpio.txt for version 3.8.13 . 模块可以使用的可用例程包括:
(顺便说一句,您的代码忽略了检查 ioremap() ,可能为空,然后可能导致分段错误。) |