Firefly开源社区

打印 上一主题 下一主题

dts中修改SPI,如何实现SPI平台数据在dts中的实现?

98

积分

0

威望

0

贡献

技术小白

积分
98

dts中修改SPI,如何实现SPI平台数据在dts中的实现?

发表于 2015-1-20 18:30:05      浏览:17366 | 回复:8        打印      只看该作者   [复制链接] 楼主
各位大侠,我现在弱爆了,真心求助,请大家帮我解决一个问题
我现在在做一个SPI驱动,我这个SPI驱动是需要中断信号线,复位信号线的,在SPI从设备驱动里面,他需要我把中断和复位,还有片选的IO给传进去

以前我做SPI驱动的时候都是在board-xxx.c文件里面,直接在static struct spi_board_info __initdata cm_a510_spi_flash_info[] = {
{
  .modalias       = "m25p80",
  .platform_data  = &fpc1020_platform_data ,
  .irq            = -1,
  .max_speed_hz   = 20000000,
  .bus_num        = 0,
  .chip_select    = 0,
},
};



然后比如说把这些中断,复位,片选通过platform_data传进去,我现在的这个SPI驱动要求通过平台数据传进去,在驱动里面我的平台数据结构体是这样定义的
struct fpc1020_platform_data {
int irq_gpio;
int reset_gpio;
int cs_gpio;
int external_supply_mv;
int txout_boost;
};

所以我就修改了dts中对应SPI的部分&spi0 {
status = "okay";
max-freq = <48000000>;
  fpc1020@00 {
         compatible = "fpc,fpc1020";
         reg = <0>;
         spi-max-frequency = <24000000>;
       //  spi-cpha;
       //  spi-cpol;
  irq_gpio = <&gpio0 GPIO_A7 GPIO_ACTIVE_HIGH>;
  reset_gpio = <&gpio7 GPIO_A3 GPIO_ACTIVE_HIGH>;
  cs_gpio    = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;
         poll_mode = <0>;
         type = <0>;
  enable_dma = <0>;         
};
};
我把这些平台数据定义为 irq_gpio = <&gpio0 GPIO_A7 GPIO_ACTIVE_HIGH>;
  reset_gpio = <&gpio7 GPIO_A3 GPIO_ACTIVE_HIGH>;
  cs_gpio    = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;在dts里面,这样可以吗
我发现我这样定义后,似乎这些中断,复位,片选还是没有传到我的驱动里面去,我的驱动现在的确要求我通过spi的platform_data传进去,我这样的格式在dts中定义对吗,各位高手指点下,如果我说的不清楚,我可以再描述啊!







回复

使用道具 举报

600

积分

21

威望

25

贡献

技术大神

Rank: 3Rank: 3

积分
600

活跃会员

发表于 2015-1-21 09:01:20        只看该作者  沙发
驱动中获取dts定义的引脚应该可以用:of_get_named_gpio_flags()
具体的可以看SDK中的文档:RKDocs/RK平台移植3.10内核.doc
里面对DTS有详细说明
回复

使用道具 举报

98

积分

0

威望

0

贡献

技术小白

积分
98
发表于 2015-1-21 09:21:56        只看该作者  板凳
HI,linjc
我刚才看了下那个RK平台一直3.10内核的文档,那个是主要针对I2C的呢,SPI应该和他类似吧,
现在我需要传进去3个参数,分别是irq_gpio   reset_gpio  cs_gpio,
我把我的spi dts定义修改如下:
&spi0 {
status = "okay";
max-freq = <48000000>;
  fpc1020@00 {
         compatible = "fpc,fpc1020";
         reg = <0>;
         spi-max-frequency = <24000000>;
       //  spi-cpha;
       //  spi-cpol;
  irq_gpio = <&gpio0 GPIO_A7 GPIO_ACTIVE_HIGH>;
  reset_gpio = <&gpio7 GPIO_A3 GPIO_ACTIVE_HIGH>;
  cs_gpio    = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;
         poll_mode = <0>;
         type = <0>;
  enable_dma = <0>;         
};
};
不知道我这样修改对不对,反正我当前似乎感觉没有传进去

另外,我的驱动是供应商给的,我感觉不动驱动似乎好一点的哦

fpc1020_pdata = spi->dev.platform_data;

        if (!fpc1020_pdata) {
                error = fpc1020_get_of_pdata(dev, &pdata_of);
                fpc1020_pdata = &pdata_of;

                if (error)
                        goto err;
        }
我的驱动似乎是通过fpc1020_get_of_pdata这样一个函数去获取平台数据的

这个函数fpc1020_get_of_pdata的定义如下:
static int __devinit fpc1020_get_of_pdata(struct device *dev,
                                        struct fpc1020_platform_data *pdata)
{
        const struct device_node *node = dev->of_node;
        /* required properties */
        const void *irq_prop = of_get_property(node, "fpc,gpio_irq",   NULL);
        const void *rst_prop = of_get_property(node, "fpc,gpio_reset", NULL);
        const void *cs_prop  = of_get_property(node, "fpc,gpio_cs",    NULL);

        /* optional properties */
        const void *vddtx_prop = of_get_property(node, "fpc,vddtx_mv", NULL);
        const void *boost_prop =
                        of_get_property(node, "fpc,txout_boost_enable", NULL);

        if (node == NULL) {
                dev_err(dev, "%s: Could not find OF device node\n", __func__);
                goto of_err;
        }

        if (!irq_prop || !rst_prop || !cs_prop) {
                dev_err(dev, "%s: Missing OF property\n", __func__);
                goto of_err;
        }

        pdata->irq_gpio   = be32_to_cpup(irq_prop);
        pdata->reset_gpio = be32_to_cpup(rst_prop);
        pdata->cs_gpio    = be32_to_cpup(cs_prop);

        pdata->external_supply_mv =
                        (vddtx_prop != NULL) ? be32_to_cpup(vddtx_prop) : 0;

        pdata->txout_boost = (boost_prop != NULL) ? 1 : 0;

        return 0;

of_err:
        pdata->reset_gpio = -EINVAL;
        pdata->irq_gpio   = -EINVAL;
        pdata->cs_gpio    = -EINVAL;

        pdata->external_supply_mv = 0;
        pdata->txout_boost = 0;

        return -ENODEV;
}

我现在就在想,供应商的驱动应该不用修改吧,我会不会是SPI DTS修改的不够对呢,以前是可以直接定义一个结构体,然后把这几个引脚的定义放在platform_data里面就好了,现在变为了DTS,我应该只要把他修改对就OK了吧,不用修改供应商的驱动吧

看看你能不能再给我一些好的建议
回复

使用道具 举报

185

积分

1

威望

0

贡献

技术小白

积分
185
QQ
发表于 2015-1-23 14:03:00        只看该作者  地板
你好!
要正确传递参数,还有一个参数必须设置正确:
就是DTS中
compatible = "fpc,fpc1020";
在您驱动中定义的名字必须和这个一模一样:
下面拿rtc-HYM8563的驱动举个例子:
在firefly-rk3288.dts的I2C0中定义:
rtc@51 {
                compatible = "rtc,hym8563";
                reg = <0x51>;
                irq_gpio = <&gpio7 GPIO_A4 IRQ_TYPE_EDGE_FALLING>;
        };
接着我们来看hym8563得驱动中:
kernel\drivers\rtc\rtc-HYM8563.c中定义了:
static struct of_device_id rtc_dt_ids[] = {
        { .compatible = "rtc,hym8563" },
        {},
};
并且修改了
struct i2c_driver hym8563_driver = {
        .driver                = {
                .name        = "rtc_hym8563",
                .owner        = THIS_MODULE,
                .of_match_table = of_match_ptr(rtc_dt_ids),
        },
        .probe                = hym8563_probe,
        .remove                = hym8563_remove,
        //.shutdown=hym8563_shutdown,
        .id_table        = hym8563_id,
};
在其中加入了.of_match_table = of_match_ptr(rtc_dt_ids),参数!
这样设置了之后才可以使用of_get_named_gpio_flags来获取您DTS中定义的中断脚或者是其它脚了
client->irq = of_get_named_gpio_flags(np, "irq_gpio", 0,(enum of_gpio_flags *)&irq_flags);

希望对您有帮助!

回复

使用道具 举报

98

积分

0

威望

0

贡献

技术小白

积分
98
发表于 2015-1-23 14:30:44        只看该作者  5#
嗯嗯,OK,呵呵
回复

使用道具 举报

132

积分

0

威望

0

贡献

技术小白

积分
132
发表于 2016-8-16 16:23:24        只看该作者  6#
厉害,佩服,虽然我还没有遇到这个情况,不过你这个还是很腻害的样子。
回复

使用道具 举报

149

积分

0

威望

0

贡献

技术小白

积分
149
发表于 2017-4-5 20:31:01        只看该作者  7#
学习了,厉害
回复

使用道具 举报

93

积分

0

威望

0

贡献

技术小白

积分
93
发表于 2018-8-2 15:24:02        只看该作者  8#
楼主,你移植,配置这个FPC的驱动成功了吗?能把你成功的配置贴出来,参考一下吗?
回复

使用道具 举报

81

积分

0

威望

0

贡献

技术小白

积分
81
发表于 2018-9-19 15:29:00        只看该作者  9#
楼主问题解决了么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表