高通 linux_linux驱动开发教程

高通 linux_linux驱动开发教程笔记:调试步骤:1.BLSPcheck:主要确认GPIO功能和BLSP通道2.pinctrl文件配置3.平台设备树文件配置4.时钟文件修改5.添加从设备:1 设备树注册方法2 设备数节点创建一、I2C配置1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO10作为I2C_SDA,GPIO11作为I2C_SCL为例。2.根据MSM8937DEV

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

笔记:
调试步骤:
1. BLSPcheck:主要确认GPIO功能和BLSP通道
2. pinctrl文件配置
3. 平台设备树文件配置
4. 时钟文件修改
5. 添加从设备:
1 设备树注册方法
2 设备数节点创建

一、I2C配置
1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO10作为I2C_SDA,GPIO11作为I2C_SCL为例。
2.根据MSM8937 DEVICE SPECIFICATION文档,查找GPIO10与GPIO11对应的BLSP,以及检查GPIO10与GPIO11是否可以作为I2C来使用。根据文档,GPIO10对应BLSP3_1,GPIO11对应BLSP3_0。
3.根据80-nu767-1_h_linux_bam_low-speed_peripherals_configuration_and_debug_guide文件,查找I2C部分BLSP3_0与BLSP3_1对应内容,包括其物理地址、reg size、中断号……
4.进入kernel/msm-3.18/arch/arm/boot/dts/qcom/路径下修改msm8937-pinctrl.dtsi文件
GPIO配置如下:
i2c_3 {

            i2c_3_active: i2c_3_active {

                /* active state */

                mux {

                    pins = “gpio10”, “gpio11”;

                    function = “blsp_i2c3”;

                };

                config {

                    pins = “gpio10”, “gpio11”;

                    drive-strength = <2>;

                    bias-disable;

                };

            };

            i2c_3_sleep: i2c_3_sleep {

                /* suspended state */

                mux {

                    pins = “gpio10”, “gpio11”;

                    function = “gpio”;

                };

                config {

                    pins = “gpio10”, “gpio11”;

                    drive-strength = <2>;

                    bias-disable;

                };

            };

        };

5.进入kernel/msm-3.18/arch/arm/boot/dts/qcom/路径下修改msm8937.dtsi文件
添加一个新的设备树节点
(1)添加i2c_3
aliases {

        smd1 = &smdtty_apps_fm;

        smd2 = &smdtty_apps_riva_bt_acl;

        smd3 = &smdtty_apps_riva_bt_cmd;

        smd4 = &smdtty_mbalbridge;

        smd5 = &smdtty_apps_riva_ant_cmd;

        smd6 = &smdtty_apps_riva_ant_data;

        smd7 = &smdtty_data1;

        smd8 = &smdtty_data4;

        smd11 = &smdtty_data11;

        smd21 = &smdtty_data21;

        smd36 = &smdtty_loopback;

        spi3 = &spi_3;

        i2c2 = &i2c_2;

        i2c5 = &i2c_5;

       
i2c3 = &i2c_3;

        sdhc1 = &sdhc_1; /* SDC1 eMMC slot */

        sdhc2 = &sdhc_2; /* SDC2 for SD card */

    };

(2)配置i2c_3
i2c_3: i2c@78b7000 { /* BLSP1 QUP3 */

        compatible = “qcom,i2c-msm-v2”;

        #address-cells = <1>;

        #size-cells = <0>;

        reg-names = “qup_phys_addr”;

        reg = <0x78b7000 0x600>;

        interrupt-names = “qup_irq”;

        interrupts = <0 97 0>;

        qcom,clk-freq-out = <400000>;

        qcom,clk-freq-in  = <19200000>;

        clock-names = “iface_clk”, “core_clk”;

        clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,

            <&clock_gcc clk_gcc_blsp1_qup3_i2c_apps_clk>;

        pinctrl-names = “i2c_active”, “i2c_sleep”;

        pinctrl-0 = <&i2c_3_active>;

        pinctrl-1 = <&i2c_3_sleep>;

        qcom,noise-rjct-scl = <0>;

        qcom,noise-rjct-sda = <0>;

        qcom,master-id = <86>;

        dmas = <&dma_blsp1 8 64 0x20000020 0x20>,

            <&dma_blsp1 9 32 0x20000020 0x20>;

        dma-names = “tx”, “rx”;

        status = “okey”;

    };
6.进入kernel/msm-3.18/drivers/clk/msm路径下修改clock-gcc-8952.c文件
添加时钟节点如下图所示:
static struct rcg_clk blsp1_qup1_i2c_apps_clk_src = {

    .cmd_rcgr_reg = BLSP1_QUP1_I2C_APPS_CMD_RCGR,

    .set_rate = set_rate_hid,

    .freq_tbl = ftbl_gcc_blsp1_2_qup1_4_i2c_apps_clk,

    .current_freq = &rcg_dummy_freq,

    .base = &virt_bases[GCC_BASE],

    .c = {

        .dbg_name = “blsp1_qup1_i2c_apps_clk_src”,

        .ops = &clk_ops_rcg,

        VDD_DIG_FMAX_MAP1(LOWER, 50000000),

        CLK_INIT(blsp1_qup1_i2c_apps_clk_src.c),

    },

};

二、I2C BUS验证
配置好I2C后,我们需保证I2C BUS被注册
验证过程如下:
adb shell //——-> Get adb shell
cd /dev/
ls i2c* //——–> to list all the i2c buses
如果显示i2c-3,则表示I2C BUS已被注册
三、I2C调试检查
1、检查I2C配置的相关内容,是否存在错误,或者漏配。
2、确保SDA和SCL所配置的GPIO没有被配置,否则会硬件配置出问题或者GPIO设置无效。
3、若I2C配置无误后,检查相关硬件问题
使用万用表测量I2C_SDA以及I2C_SCL的供电电压,如果与原理图中所示供电电压相差无几,则表示I2C供电电压没有问题。反之,则代表供电电压存在问题。
4、添加从设备
(1)、 通过设备树来注册一个从设备
如果I2C总线正常工作,我们就可以创建一个从设备驱动程序并注册到i2c总线上
我们使用st1663i触摸屏的驱动注册作为范例,引用文件:
kernel/drivers/input/touchscreen/st1663i/sitronix_i2c_touch.c.c
(2)、创建一个设备树节点
文件修改:
/kernel/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5.dtsi
添加一个新的设备树节点:
i2c@78b7000 {

        status = “ok”;

            st1663i@70 {

                compatible = “sitronix-tp”; 

                reg = <0x70>;

                interrupt-parent = <&tlmm>;

                interrupts = <65 0x00>;

                reset-gpio = <&tlmm 64 0x00>;

                irq-gpio = <&tlmm 65 0x2002>;

                /*avdd-supply = <&tp_power>;*/

                vdd-supply = <&pm8917_l17>;

                vcc_i2c-supply = <&pm8917_l5>;

                /* pins used by touchscreen */

                pinctrl-names = “pmx_ts_active”,

                    “pmx_ts_suspend”,

                    “pmx_ts_release”;

                pinctrl-0 = <&ts_int_active &ts_reset_active>;

                pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;

                pinctrl-2 = <&ts_release>; 

                st1663i,i2c-pull-up;

                st1663i,no-force-update;

                st1663i,num_max_touches = <10>;

                st1663i,panel-coords = <0 0 480 800>;

                st1663i,display-coords = <0 0 480 800>;

                st1663i,button-map= <139 172 158>;

                st1663i,have-touch-key;

                st1663i,driver-send-cfg;

            };

    };
(3)、编译完成后,利用示波器测量I2C_SDA以及I2C_SCL波形
测试流程如下
adb root
adb remount
adb push i2c_test system/bin
adb shell
cd system/bin
chmod 777 i2c_test
./i2c_test /dev/i2c-3 0xaddr(从设备物理地址) 0(读) 0xaddr(寄存器地址)
如果I2C没有问题,所示I2C_SDA波形应为以下形式
I2C start > 0xE0 (write of 0x70) > 0x1 (reg offset ) > I2C stop > delay > I2C start > 0xE1 (read of 0x70) > > 8 bytes > I2C stop
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184315.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux tomcat自动重启(linux关闭服务器命令)

    这里重启的条件是之前已经启动了tomcat服务器的情况下第一步:进入linux下tomcat目录,这里需要看你的tomcat配置在linux的哪个位置下,下面只是我个人的配置目录,不代表全部cd/usr/local/src/tomcat/bin第二步:查看当前启动的tomcat使用的进程,通过查看,我们发现tomcat占用了1630端口ps-ef|greptomc…

    2022年4月11日
    113
  • 银行家算法 C语言实现

    银行家算法 C语言实现C语言实现银行家算法这几天老师要求使用C语言实现银行家算法,数据可以自定义。想来想去还是照着书现成的数据来模拟一下。教材使用的是西安电子科大出版社的《计算机操作系统》汤小丹第四版。模拟数据使用的是P121页第4题的数据。听到老师布置题目的第一时间我还是有点懵,看了下书更懵了,这条条框框的判断条件怎么这么多。。沉下心来慢慢看,其实还是挺简单的算法。/*Author:Cnkizy…

    2022年6月10日
    30
  • docker复制文件到宿主机_下面哪几个属于docker网络模式

    docker复制文件到宿主机_下面哪几个属于docker网络模式自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求。容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信。 一、端口映射(局域网,外网此方式均可)。此种方式是将容器的某个端口映射到宿主机的某个端口,其它主机访问容器提供的服务需要通过宿主机的IP进行访问:dockerrun-p9000:8000–namec…

    2022年8月21日
    5
  • SVN安装配置以及启动[通俗易懂]

    SVN安装配置以及启动[通俗易懂]SVN是一个开放源代码的版本控制系统,全称叫做Subversionwindows下载链接地址1.下载并安装下载好之后直接双击,然后安装就没什么好说的了,这个软件安装及其简单。2.验证cmd中敲svn–version,如果出现下面的结果,则说明安装成功了!(上面没问题的可以忽略这一段!)如果有问题,检查自己的环境变量有没有把对应的bin目录配置进去,现在安装的svn大部分都会自动配置的,如果他没有自动配置,则需要手动编辑path:3.配置svn仓库:我的做法是在安装目录下建一个空文

    2022年10月21日
    0
  • 分布式Session一致性入门简介

    Session简介是什么?Session在网络中表示“会话控制”,用于存储特定用户所需的属性和其他的配置信息;Session表示一个特定的时间间隔,可以指用户从登陆系统到注销退出系统之家的时间。为什么出现?因为http 是一种无状态协议,如果没有Session的话,服务器无法识别请求是否来自同一个用户! 在一些业务场景中需要知道前面的操作和后台的操作是不是同一个用户…

    2022年2月27日
    42
  • P1983 [NOIP2013] 车站分级(拓扑排序)[通俗易懂]

    P1983 [NOIP2013] 车站分级(拓扑排序)[通俗易懂]原题链接题目描述一条单向的铁路线上,依次有编号为 1, 2, …, n1,2,…,n的 nn个火车站。每个火车站都有一个级别,最低为 11 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 xx,则始发站、终点站之间所有级别大于等于火车站xx 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)例如,下表是55趟车次的运行情况。其中,前44 趟车次均满足要求,而第 55 趟车次由于停靠了 33 号火车站(22 级)却未停靠途经的 66 号火车站(亦为

    2022年8月8日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号