linux 3.18 workqueue使用gpio_direction_output会导致kernel panic

枫雪夜 2018-04-30 05:42:44
1. 在probe函数中init work

INIT_WORK(&work, xxxx_work);
//将flash_led复制给p_data全局变量,flash_led是devm_kzalloc()创建的,没有销毁
p_data = flash_led;

2. 再ioctl函数某个case中调度

schedule_work(&work);

3. 最后在xxxx_work函数中操控gpio

static void xxxx_work(struct work_struct *work)
{
struct led_gpio_flash_data *flash_led = p_data
//flash_en在probe中已经从dts中获得值然后gpio_request了
gpio_direction_output(flash_led->flash_en, 1<<1);
}


问题:
执行到gpio_direction_output这一句后就会触发看门狗然后死机
这一句直接放到ioctl那里替换掉schedule_work就可以正常操控gpio


...全文
759 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
枫雪夜 2018-05-02
  • 打赏
  • 举报
回复
workqueue操控gpio出错的问题已经弄好了,查看log发现操控的虚拟地址为0,代码中是p_data全局变量为空导致的

1,318

社区成员

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

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