编写pwm驱动出现no platform data specified

风筝丶
博客专家认证
2017-08-03 03:57:58
用的4.8.17的Kernel
我看到在pwm-samsung.c这个文件下有pwm的驱动:
static struct platform_driver pwm_samsung_driver = {
.driver = {
.name = "samsung-pwm",
.pm = &pwm_samsung_pm_ops,
.of_match_table = of_match_ptr(samsung_pwm_matches),
},
.probe = pwm_samsung_probe,
.remove = pwm_samsung_remove,
};
然后我就写了一个设备文件:

编译后生成.ko文件,insmod加载后发现:
/my_device # insmod pwm.ko
samsung-pwm samsung-pwm: no platform data specified
samsung-pwm: probe of samsung-pwm failed with error -22

这两句话出现在pwm_samsung_probe,说明platform匹配成功了:

可以看出,是520行if里pdev->dev.platform_data没有设置,导致错误。

但是我就很奇怪了,这个platform_data到底该写什么?一个小小的pwm驱动,设备文件里除了写resource资源,还要写什么吗?

...全文
756 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
风筝丶 2017-08-24
  • 打赏
  • 举报
回复
引用 22 楼 jklinux 的回复:
[quote=引用 21 楼 Guet_Kite 的回复:] [quote=引用 20 楼 jklinux 的回复:] 应是打开"/sys/class/pwm/pwmchip0/period"文件吧
没,最开始的步骤是向export写入0,代表pwm0通道, 所以是/sys/class/pwm/pwmchip0/export 但是好像写入0不成功...[/quote] O_WRONLY打开试试[/quote] 不行,好像这个文件比较特殊啊,我只好用system函数了 我发现这个文件的执行属性是-w---------,即使改了权限也没用 不纠结这个pwm了,有空我先把iic和dts给啃了
jklinux 2017-08-21
  • 打赏
  • 举报
回复
引用 21 楼 Guet_Kite 的回复:
[quote=引用 20 楼 jklinux 的回复:] 应是打开"/sys/class/pwm/pwmchip0/period"文件吧
没,最开始的步骤是向export写入0,代表pwm0通道, 所以是/sys/class/pwm/pwmchip0/export 但是好像写入0不成功...[/quote] O_WRONLY打开试试
风筝丶 2017-08-21
  • 打赏
  • 举报
回复
引用 20 楼 jklinux 的回复:
应是打开"/sys/class/pwm/pwmchip0/period"文件吧
没,最开始的步骤是向export写入0,代表pwm0通道, 所以是/sys/class/pwm/pwmchip0/export 但是好像写入0不成功...
jklinux 2017-08-21
  • 打赏
  • 举报
回复
应是打开"/sys/class/pwm/pwmchip0/period"文件吧
风筝丶 2017-08-19
  • 打赏
  • 举报
回复
引用 18 楼 jklinux 的回复:
[quote=引用 17 楼 风筝丶的回复:][quote=引用 16 楼 jklinux 的回复:]
[quote=引用 15 楼 风筝丶的回复:][quote=引用 14 楼 jklinux 的回复:]
[quote=引用 13 楼 Guet_Kite 的回复:]
[quote=引用 12 楼 jklinux 的回复:]
[quote=引用 11 楼 Guet_Kite 的回复:]
[quote=引用 10 楼 jklinux 的回复:]
[quote=引用 9 楼 Guet_Kite 的回复:]
[quote=引用 8 楼 jklinux 的回复:]
pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .

而且也要注意一个pwm通道被request后,再request是不行的.

pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.


“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .”
按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1,

“而且也要注意一个pwm通道被request后,再request是不行的.”
我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方:
if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) {
dev_warn(chip->dev,
"tried to request PWM channel %d without output\n",
pwm->hwpwm);
return -EINVAL;
}

所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后
cd /sys/class/pwm/pwmchip0/
echo 0 > export
终于出现pwm0目录了,cd进去这个目录
echo 1000000000 > period
echo 100000000 > duty_cycle
echo normal > polarity
echo 1 > enable
pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了,
但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,,


“pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的”
现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的......

代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
.bits = 16,
.div_base = 1,
.has_tint_cstat = false,
.tclk_mask = (1 << 4),
.output_mask = 1,
};

static struct resource s3c_pwm_resource[] = {
DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
.name = "samsung-pwm",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_pwm_resource),
.resource = s3c_pwm_resource,
.dev = {
.platform_data = &s3c_pwm_pdata,
},
};

static int S3C_PWM_init(void)
{
/* 2. 注册 */
int result = platform_device_register(&s3c_device_pwm);
if (result != 0) /*注册失败*/
printk("register false \n");
return 0;
}

static void S3C_PWM_exit(void)
{
platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote]


你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote]

老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!![/quote]

期待你的大作哈。 [/quote]
好了,就写在这了http://blog.csdn.net/Guet_Kite/article/details/77275492
搞了好久才知道是要配置输出引脚,还要配置成复用模式.....
不过我还有个疑问,就是这些操作:
echo 1000000000 > period
echo 100000000 > duty_cycle
能把他写成一个可执行文件吗》就是我一执行某个文件,就自动echo
[/quote]

可以啊,就是open, read, write函数调用就可以了[/quote]

对某个文件读写,要获取他的句柄吧?不知道是不是叫句柄....
就像这样 fd=open("/dev/pwm",NULL);
要获取这个fd吧?不然怎么读写?[/quote]
就是这样啊,句柄是window的叫法,linux叫文件描述符[/quote]、、
那我要 :echo 1000000000 > period
如何要获取他的文件描述符[/quote]
open那个period属性文件就可以了[/quote]

老哥,好像不行啊,我这样算是往export写入0吗?
jklinux 2017-08-19
  • 打赏
  • 举报
回复
引用 17 楼 风筝丶的回复:
[quote=引用 16 楼 jklinux 的回复:] [quote=引用 15 楼 风筝丶的回复:][quote=引用 14 楼 jklinux 的回复:] [quote=引用 13 楼 Guet_Kite 的回复:] [quote=引用 12 楼 jklinux 的回复:] [quote=引用 11 楼 Guet_Kite 的回复:] [quote=引用 10 楼 jklinux 的回复:] [quote=引用 9 楼 Guet_Kite 的回复:] [quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote] 老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!![/quote] 期待你的大作哈。 [/quote] 好了,就写在这了http://blog.csdn.net/Guet_Kite/article/details/77275492 搞了好久才知道是要配置输出引脚,还要配置成复用模式..... 不过我还有个疑问,就是这些操作: echo 1000000000 > period echo 100000000 > duty_cycle 能把他写成一个可执行文件吗》就是我一执行某个文件,就自动echo [/quote] 可以啊,就是open, read, write函数调用就可以了[/quote] 对某个文件读写,要获取他的句柄吧?不知道是不是叫句柄.... 就像这样 fd=open("/dev/pwm",NULL); 要获取这个fd吧?不然怎么读写?[/quote] 就是这样啊,句柄是window的叫法,linux叫文件描述符[/quote]、、 那我要 :echo 1000000000 > period 如何要获取他的文件描述符[/quote] open那个period属性文件就可以了
风筝丶 2017-08-19
  • 打赏
  • 举报
回复
引用 16 楼 jklinux 的回复:
[quote=引用 15 楼 风筝丶的回复:][quote=引用 14 楼 jklinux 的回复:] [quote=引用 13 楼 Guet_Kite 的回复:] [quote=引用 12 楼 jklinux 的回复:] [quote=引用 11 楼 Guet_Kite 的回复:] [quote=引用 10 楼 jklinux 的回复:] [quote=引用 9 楼 Guet_Kite 的回复:] [quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote] 老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!![/quote] 期待你的大作哈。 [/quote] 好了,就写在这了http://blog.csdn.net/Guet_Kite/article/details/77275492 搞了好久才知道是要配置输出引脚,还要配置成复用模式..... 不过我还有个疑问,就是这些操作: echo 1000000000 > period echo 100000000 > duty_cycle 能把他写成一个可执行文件吗》就是我一执行某个文件,就自动echo [/quote] 可以啊,就是open, read, write函数调用就可以了[/quote] 对某个文件读写,要获取他的句柄吧?不知道是不是叫句柄.... 就像这样 fd=open("/dev/pwm",NULL); 要获取这个fd吧?不然怎么读写?[/quote] 就是这样啊,句柄是window的叫法,linux叫文件描述符[/quote]、、 那我要 :echo 1000000000 > period 如何要获取他的文件描述符
jklinux 2017-08-18
  • 打赏
  • 举报
回复
引用 15 楼 风筝丶的回复:
[quote=引用 14 楼 jklinux 的回复:] [quote=引用 13 楼 Guet_Kite 的回复:] [quote=引用 12 楼 jklinux 的回复:] [quote=引用 11 楼 Guet_Kite 的回复:] [quote=引用 10 楼 jklinux 的回复:] [quote=引用 9 楼 Guet_Kite 的回复:] [quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote] 老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!![/quote] 期待你的大作哈。 [/quote] 好了,就写在这了http://blog.csdn.net/Guet_Kite/article/details/77275492 搞了好久才知道是要配置输出引脚,还要配置成复用模式..... 不过我还有个疑问,就是这些操作: echo 1000000000 > period echo 100000000 > duty_cycle 能把他写成一个可执行文件吗》就是我一执行某个文件,就自动echo [/quote] 可以啊,就是open, read, write函数调用就可以了[/quote] 对某个文件读写,要获取他的句柄吧?不知道是不是叫句柄.... 就像这样 fd=open("/dev/pwm",NULL); 要获取这个fd吧?不然怎么读写?[/quote] 就是这样啊,句柄是window的叫法,linux叫文件描述符
风筝丶 2017-08-18
  • 打赏
  • 举报
回复
引用 14 楼 jklinux 的回复:
[quote=引用 13 楼 Guet_Kite 的回复:] [quote=引用 12 楼 jklinux 的回复:] [quote=引用 11 楼 Guet_Kite 的回复:] [quote=引用 10 楼 jklinux 的回复:] [quote=引用 9 楼 Guet_Kite 的回复:] [quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote] 老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!![/quote] 期待你的大作哈。 [/quote] 好了,就写在这了http://blog.csdn.net/Guet_Kite/article/details/77275492 搞了好久才知道是要配置输出引脚,还要配置成复用模式..... 不过我还有个疑问,就是这些操作: echo 1000000000 > period echo 100000000 > duty_cycle 能把他写成一个可执行文件吗》就是我一执行某个文件,就自动echo [/quote] 可以啊,就是open, read, write函数调用就可以了[/quote] 对某个文件读写,要获取他的句柄吧?不知道是不是叫句柄.... 就像这样 fd=open("/dev/pwm",NULL); 要获取这个fd吧?不然怎么读写?
jklinux 2017-08-18
  • 打赏
  • 举报
回复
引用 13 楼 Guet_Kite 的回复:
[quote=引用 12 楼 jklinux 的回复:] [quote=引用 11 楼 Guet_Kite 的回复:] [quote=引用 10 楼 jklinux 的回复:] [quote=引用 9 楼 Guet_Kite 的回复:] [quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote] 老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!![/quote] 期待你的大作哈。 [/quote] 好了,就写在这了http://blog.csdn.net/Guet_Kite/article/details/77275492 搞了好久才知道是要配置输出引脚,还要配置成复用模式..... 不过我还有个疑问,就是这些操作: echo 1000000000 > period echo 100000000 > duty_cycle 能把他写成一个可执行文件吗》就是我一执行某个文件,就自动echo [/quote] 可以啊,就是open, read, write函数调用就可以了
风筝丶 2017-08-16
  • 打赏
  • 举报
回复
引用 12 楼 jklinux 的回复:
[quote=引用 11 楼 Guet_Kite 的回复:] [quote=引用 10 楼 jklinux 的回复:] [quote=引用 9 楼 Guet_Kite 的回复:] [quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote] 老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!![/quote] 期待你的大作哈。 [/quote] 好了,就写在这了http://blog.csdn.net/Guet_Kite/article/details/77275492 搞了好久才知道是要配置输出引脚,还要配置成复用模式..... 不过我还有个疑问,就是这些操作: echo 1000000000 > period echo 100000000 > duty_cycle 能把他写成一个可执行文件吗》就是我一执行某个文件,就自动echo
jklinux 2017-08-16
  • 打赏
  • 举报
回复
引用 11 楼 Guet_Kite 的回复:
[quote=引用 10 楼 jklinux 的回复:] [quote=引用 9 楼 Guet_Kite 的回复:] [quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote] 老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!![/quote] 期待你的大作哈。
风筝丶 2017-08-15
  • 打赏
  • 举报
回复
引用 10 楼 jklinux 的回复:
[quote=引用 9 楼 Guet_Kite 的回复:] [quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.[/quote] 老哥,多年之后,我终于弄好了!!内牛满面啊,,,,明天分享成果出来,做这行简直太难了!!
jklinux 2017-08-08
  • 打赏
  • 举报
回复
引用 9 楼 Guet_Kite 的回复:
[quote=引用 8 楼 jklinux 的回复:] pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
[/quote] 你这个仅仅是pwm控制器硬件资源部分信息的描述而已,还需要参考下相应的platform_driver来确定每个成员具体值的含义的.
jklinux 2017-08-07
  • 打赏
  • 举报
回复
pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
风筝丶 2017-08-07
  • 打赏
  • 举报
回复
引用 8 楼 jklinux 的回复:
pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 . 而且也要注意一个pwm通道被request后,再request是不行的. pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的.
“pwm_id是表示第几个pwm通道,也就是第几个pwm控制器的输出。不是地址, 最多就是: 0 ~4 .” 按照platform上设备文件(自己写的pwm.c文件)所写:.platform_data = &s3c_pwm_pdata,,,这样pwm_id得到的就是一个地址。除非是这样写.platform_data = 1, “而且也要注意一个pwm通道被request后,再request是不行的.” 我按照之前错误提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output,找打了内核出错的地方: if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { dev_warn(chip->dev, "tried to request PWM channel %d without output\n", pwm->hwpwm); return -EINVAL; } 所以我在我自己写的pwm.c文件加上.output_mask = 1, 之后 cd /sys/class/pwm/pwmchip0/ echo 0 > export 终于出现pwm0目录了,cd进去这个目录 echo 1000000000 > period echo 100000000 > duty_cycle echo normal > polarity echo 1 > enable pwm的通道0是在gpiob0上,我的gpiob0是接在lcd的背光上了, 但是此时lcd的屏幕亮度居然没变化,,,吐血了,,,, “pwm-samsung.c是控制器的驱动来的,控制器都没驱动好,pwm_request用不了的” 现在我pwm-samsung.c文件加载好了,感觉还是不能用pwm_request啊,一个是pwm_id的问题,一个是pwm_tree的问题,我都不知道这个pwm_tree是在哪初始化的...... 代码如下,4.8.17内核

static struct samsung_pwm_variant s3c_pwm_pdata = {
	.bits		= 16,
	.div_base	= 1,
	.has_tint_cstat	= false,
	.tclk_mask	= (1 << 4),
	.output_mask	= 1,
};

static struct resource s3c_pwm_resource[] = {
	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
};

static struct platform_device s3c_device_pwm = {/*platform里注册设备文件*/
	.name		= "samsung-pwm",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(s3c_pwm_resource),
	.resource	= s3c_pwm_resource,
	.dev		= {
		.platform_data	= &s3c_pwm_pdata,
	},
};

static int S3C_PWM_init(void)
{
	/* 2. 注册 */
	int result = platform_device_register(&s3c_device_pwm);
	if (result != 0) /*注册失败*/ 
		printk("register false \n");
	return 0;
}

static void S3C_PWM_exit(void)
{
	platform_device_unregister(&s3c_device_pwm);
}

module_init(S3C_PWM_init);
module_exit(S3C_PWM_exit);
风筝丶 2017-08-06
  • 打赏
  • 举报
回复
引用 6 楼 jklinux 的回复:
[quote=引用 5 楼 Guet_Kite 的回复:]
[quote=引用 4 楼 jklinux 的回复:]
[quote=引用 3 楼 Guet_Kite 的回复:]
[quote=引用 2 楼 jklinux 的回复:]
不是所有的驱动都会在/dev/目录下产生设备文件的。

你配置的是pwm控制器驱动,有些pwm控制器驱动会在/sys目录下产生属性文件,让用户来调用的。

除此之外还可以一套在内核里调用的标准接口, 在<linux/pwm.h>头文件里.

先是用pwm_request请求,再pwm_config, pwn_enable等函数来使用的.


唉,没有在/dev下有设备文件,就颠覆了我对Linux的认知了...
后来我查了sysfs,大致就是udev根据/sys里的属性在/dev下创建或者删除设备节点
但是又有新问题了,在/sys下多了那么多关于pwm的属性文件,我到底对那个文件进行open和read、write呢?
因为我想对pwm硬件进行read和write修改pwm的频率,所以我要自己写read和write函数嘛,我怎么没看到他的file_operations接口?
最后,感慨下,确实在core.c(drivers/pwm/目录下),确实实现有pwm_request函数,在probe函数里调用,platform驱动名字为:.name = "pwm-beeper",
看名字,应该是pwm喇叭的驱动,就一个小小的pwm,搞了那么多东西出来,唉,真难玩,
为何在pwm-samsung(drivers/pwm/目录下,我用的三星的板子),platform的probe函数里没有调用pwm_request函数呢?看了下,关于设备注册的就只有这一句:pwmchip_add......
搞来搞去真让人头大......
[/quote]


芯片厂家把pwm控制器驱动好,由设备驱动人员用pwm_request这些函数接口来调用它。[/quote]
那如果我不想用pwm_request呢?我看pwm-samsung.c(drivers/pwm/目录下)这个文件也是关于pwm的啊?里面没有pwm_request函数的实现以及调用啊,只是在platform注册一个pwm-samsung的驱动,我要是想使用这个驱动,该怎么做?
正如我帖子开头说的,在这个platform的probe里,调用了pwmchip_add函数,使得在/sys下产生了很多属性文件,我该对那个设备进行open?以及在哪可以构造他的read和write函数?[/quote]

pwm-samsung.c这个文件应是pwm控制器的驱动,也就是它里面实现功能,以便支持可以通过pwm_request来调用

/sys目录下属性文件调用是仅仅支持用户操作的, 具体的目录名及属性名记不大清。大概pwm0目录表示第0个pwm控制器, 里面好像有duty属性文件表示占空比的, 还有period表示频率周期。

[/quote]
搞了一整天,渐渐有点明白了。
首先是pwm_request。我找了下整个Kernel,发现在pwm-beeper.c文件下调用,在pwm-beeper驱动的probe函数里调用,如图:

这里我有个地方看不懂:pwm_id = (unsigned long)dev_get_platdata(&pdev->dev);
这是获取设备的platform_data函数,这句话展开就是pwm_id =dev->platform_data;
但是,平时我们写platform里的设备文件时,不是这样写嘛?

在里面:.platform_data = &s3c_pwm_pdata,所以他是指向一个结构体的,他的值是一个地址。
最后,就是pwm_id=一个结构体的地址,pwm_id是unsigned long类型。
这个pwm_id会作为pwm_request函数的第一个参数,但是,pwm_request里面有一句:
if (pwm_id < 0 || pwm_id >= MAX_PWMS)//MAX_PWMS为1024
return ERR_PTR(-EINVAL);
我试过了,这里一定会返回ERR_PTR,地址本来就是一个很大的值,因为返回error了,注册就会失败!!
我insmod 模块.ko时,就会提示:“Failed to request pwm device:-22”
我了解了下pwm_id的作用,原来有个pwm_tree链表,pwm_id代表的是设备应该在pwm_tree的位置。
这可怎么搞嘛,难道.platform_data = &s3c_pwm_pdata这样的写法是错的?
可是我试过.platform_data = 0或者.platform_data = 1,都不行啊,还是会提示Failed to request pwm device
然后我继续搜索pwm_tree,发现是在pwm-samsung.c文件里,samsung-pwm的platform驱动probe函数里调用有pwmchip_add函数,里面操作有pwm_tree,即:radix_tree_insert(&pwm_tree, pwm->pwm, pwm);

好家伙,真累,既然pwm-beeper.c里的驱动我注册不了,一直显示Failed to request pwm device
那我就干脆用pwm-samsung.c文件里的驱动,insmod pwm.ko后,确实注册成功了,
在/sys/class/pwm下出现pwmchip0目录,
我cd /sys/class/pwm/pwmchip0/
然后我看网上教程,我想控制pwm0,就
echo 0 > export
结果提示:samsung-pwm samsung-pwm: tried to request PWM channel 0 without output
sh: write error: Invalid argument
绝望啊,想用个pwm怎么这么难啊......
jklinux 2017-08-05
  • 打赏
  • 举报
回复
引用 5 楼 Guet_Kite 的回复:
[quote=引用 4 楼 jklinux 的回复:] [quote=引用 3 楼 Guet_Kite 的回复:] [quote=引用 2 楼 jklinux 的回复:] 不是所有的驱动都会在/dev/目录下产生设备文件的。 你配置的是pwm控制器驱动,有些pwm控制器驱动会在/sys目录下产生属性文件,让用户来调用的。 除此之外还可以一套在内核里调用的标准接口, 在<linux/pwm.h>头文件里. 先是用pwm_request请求,再pwm_config, pwn_enable等函数来使用的.
唉,没有在/dev下有设备文件,就颠覆了我对Linux的认知了... 后来我查了sysfs,大致就是udev根据/sys里的属性在/dev下创建或者删除设备节点 但是又有新问题了,在/sys下多了那么多关于pwm的属性文件,我到底对那个文件进行open和read、write呢? 因为我想对pwm硬件进行read和write修改pwm的频率,所以我要自己写read和write函数嘛,我怎么没看到他的file_operations接口? 最后,感慨下,确实在core.c(drivers/pwm/目录下),确实实现有pwm_request函数,在probe函数里调用,platform驱动名字为:.name = "pwm-beeper", 看名字,应该是pwm喇叭的驱动,就一个小小的pwm,搞了那么多东西出来,唉,真难玩, 为何在pwm-samsung(drivers/pwm/目录下,我用的三星的板子),platform的probe函数里没有调用pwm_request函数呢?看了下,关于设备注册的就只有这一句:pwmchip_add...... 搞来搞去真让人头大...... [/quote] 芯片厂家把pwm控制器驱动好,由设备驱动人员用pwm_request这些函数接口来调用它。[/quote] 那如果我不想用pwm_request呢?我看pwm-samsung.c(drivers/pwm/目录下)这个文件也是关于pwm的啊?里面没有pwm_request函数的实现以及调用啊,只是在platform注册一个pwm-samsung的驱动,我要是想使用这个驱动,该怎么做? 正如我帖子开头说的,在这个platform的probe里,调用了pwmchip_add函数,使得在/sys下产生了很多属性文件,我该对那个设备进行open?以及在哪可以构造他的read和write函数?[/quote] pwm-samsung.c这个文件应是pwm控制器的驱动,也就是它里面实现功能,以便支持可以通过pwm_request来调用 /sys目录下属性文件调用是仅仅支持用户操作的, 具体的目录名及属性名记不大清。大概pwm0目录表示第0个pwm控制器, 里面好像有duty属性文件表示占空比的, 还有period表示频率周期。
风筝丶 2017-08-05
  • 打赏
  • 举报
回复
引用 4 楼 jklinux 的回复:
[quote=引用 3 楼 Guet_Kite 的回复:] [quote=引用 2 楼 jklinux 的回复:] 不是所有的驱动都会在/dev/目录下产生设备文件的。 你配置的是pwm控制器驱动,有些pwm控制器驱动会在/sys目录下产生属性文件,让用户来调用的。 除此之外还可以一套在内核里调用的标准接口, 在<linux/pwm.h>头文件里. 先是用pwm_request请求,再pwm_config, pwn_enable等函数来使用的.
唉,没有在/dev下有设备文件,就颠覆了我对Linux的认知了... 后来我查了sysfs,大致就是udev根据/sys里的属性在/dev下创建或者删除设备节点 但是又有新问题了,在/sys下多了那么多关于pwm的属性文件,我到底对那个文件进行open和read、write呢? 因为我想对pwm硬件进行read和write修改pwm的频率,所以我要自己写read和write函数嘛,我怎么没看到他的file_operations接口? 最后,感慨下,确实在core.c(drivers/pwm/目录下),确实实现有pwm_request函数,在probe函数里调用,platform驱动名字为:.name = "pwm-beeper", 看名字,应该是pwm喇叭的驱动,就一个小小的pwm,搞了那么多东西出来,唉,真难玩, 为何在pwm-samsung(drivers/pwm/目录下,我用的三星的板子),platform的probe函数里没有调用pwm_request函数呢?看了下,关于设备注册的就只有这一句:pwmchip_add...... 搞来搞去真让人头大...... [/quote] 芯片厂家把pwm控制器驱动好,由设备驱动人员用pwm_request这些函数接口来调用它。[/quote] 那如果我不想用pwm_request呢?我看pwm-samsung.c(drivers/pwm/目录下)这个文件也是关于pwm的啊?里面没有pwm_request函数的实现以及调用啊,只是在platform注册一个pwm-samsung的驱动,我要是想使用这个驱动,该怎么做? 正如我帖子开头说的,在这个platform的probe里,调用了pwmchip_add函数,使得在/sys下产生了很多属性文件,我该对那个设备进行open?以及在哪可以构造他的read和write函数?
jklinux 2017-08-04
  • 打赏
  • 举报
回复
引用 3 楼 Guet_Kite 的回复:
[quote=引用 2 楼 jklinux 的回复:] 不是所有的驱动都会在/dev/目录下产生设备文件的。 你配置的是pwm控制器驱动,有些pwm控制器驱动会在/sys目录下产生属性文件,让用户来调用的。 除此之外还可以一套在内核里调用的标准接口, 在<linux/pwm.h>头文件里. 先是用pwm_request请求,再pwm_config, pwn_enable等函数来使用的.
唉,没有在/dev下有设备文件,就颠覆了我对Linux的认知了... 后来我查了sysfs,大致就是udev根据/sys里的属性在/dev下创建或者删除设备节点 但是又有新问题了,在/sys下多了那么多关于pwm的属性文件,我到底对那个文件进行open和read、write呢? 因为我想对pwm硬件进行read和write修改pwm的频率,所以我要自己写read和write函数嘛,我怎么没看到他的file_operations接口? 最后,感慨下,确实在core.c(drivers/pwm/目录下),确实实现有pwm_request函数,在probe函数里调用,platform驱动名字为:.name = "pwm-beeper", 看名字,应该是pwm喇叭的驱动,就一个小小的pwm,搞了那么多东西出来,唉,真难玩, 为何在pwm-samsung(drivers/pwm/目录下,我用的三星的板子),platform的probe函数里没有调用pwm_request函数呢?看了下,关于设备注册的就只有这一句:pwmchip_add...... 搞来搞去真让人头大...... [/quote] 芯片厂家把pwm控制器驱动好,由设备驱动人员用pwm_request这些函数接口来调用它。
加载更多回复(3)

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧