Firefly开源社区
标题:
dts中修改SPI,如何实现SPI平台数据在dts中的实现?
[打印本页]
作者:
5454ty
时间:
2015-1-20 18:30
标题:
dts中修改SPI,如何实现SPI平台数据在dts中的实现?
各位大侠,我现在弱爆了,真心求助,请大家帮我解决一个问题
我现在在做一个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中定义对吗,各位高手指点下,如果我说的不清楚,我可以再描述啊!
作者:
linjc
时间:
2015-1-21 09:01
驱动中获取dts定义的引脚应该可以用:of_get_named_gpio_flags()
具体的可以看SDK中的文档:RKDocs/RK平台移植3.10内核.doc
里面对DTS有详细说明
作者:
5454ty
时间:
2015-1-21 09:21
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了吧,不用修改供应商的驱动吧
看看你能不能再给我一些好的建议
作者:
tangyu1121
时间:
2015-1-23 14:03
你好!
要正确传递参数,还有一个参数必须设置正确:
就是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);
希望对您有帮助!
作者:
5454ty
时间:
2015-1-23 14:30
嗯嗯,OK,呵呵
作者:
luminmin882001
时间:
2016-8-16 16:23
厉害,佩服,虽然我还没有遇到这个情况,不过你这个还是很腻害的样子。
作者:
22222
时间:
2017-4-5 20:31
学习了,厉害
作者:
ckh20070903
时间:
2018-8-2 15:24
楼主,你移植,配置这个FPC的驱动成功了吗?能把你成功的配置贴出来,参考一下吗?
作者:
绵薄之力
时间:
2018-9-19 15:29
楼主问题解决了么
欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/)
Powered by Discuz! X3.1