完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近在做linux驱动,在用到这个函数时有了一个小问题,就是第三个参数num的意义是什么?
struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num) { int i; for (i = 0; i < dev->num_resources; i++) { struct resource *r = &dev->resource; if (type == resource_type(r) && num-- == 0) return r; } return NULL; } 查阅linux内核代码其他地方应用这个函数的地方,发现大多数都用了0,不知道是什么原因,有知道的还请回答一下,谢谢! |
|
相关推荐
1个回答
|
|
内核版本:2.6.32 文件:atmel_lcdfb.c num,说直白一点。就是对资源的标记。很多时候都是0.是因为一般一个资源结构体就可以包含所需的操作了; static int __init atmel_lcdfb_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct fb_info *info; struct atmel_lcdfb_info *sinfo; struct atmel_lcdfb_info *pdata_sinfo; struct fb_videomode fbmode; struct resource *regs = NULL; struct resource *map = NULL; int ret; dev_dbg(dev, "%s BEGINn", __func__); ret = -ENOMEM; info = framebuffer_alloc(sizeof(struct atmel_lcdfb_info), dev); if (!info) { dev_err(dev, "cannot allocate memoryn"); goto out; } sinfo = info->par; if (dev->platform_data) { pdata_sinfo = (struct atmel_lcdfb_info *)dev->platform_data; sinfo->default_bpp = pdata_sinfo->default_bpp; sinfo->default_dmacon = pdata_sinfo->default_dmacon; sinfo->default_lcdcon2 = pdata_sinfo->default_lcdcon2; sinfo->default_monspecs = pdata_sinfo->default_monspecs; sinfo->atmel_lcdfb_power_control = pdata_sinfo->atmel_lcdfb_power_control; sinfo->guard_time = pdata_sinfo->guard_time; sinfo->smem_len = pdata_sinfo->smem_len; sinfo->lcdcon_is_backlight = pdata_sinfo->lcdcon_is_backlight; sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode; } else { dev_err(dev, "cannot get default configurationn"); goto free_info; } sinfo->info = info; sinfo->pdev = pdev; strcpy(info->fix.id, sinfo->pdev->name); info->flags = ATMEL_LCDFB_FBINFO_DEFAULT; info->pseudo_palette = sinfo->pseudo_palette; info->fbops = &atmel_lcdfb_ops; memcpy(&info->monspecs, sinfo->default_monspecs, sizeof(info->monspecs)); info->fix = atmel_lcdfb_fix; /* Enable LCDC Clocks */ if (cpu_is_at91sam9261() || cpu_is_at91sam9g10() || cpu_is_at32ap7000()) { sinfo->bus_clk = clk_get(dev, "hck1"); if (IS_ERR(sinfo->bus_clk)) { ret = PTR_ERR(sinfo->bus_clk); goto free_info; } } sinfo->lcdc_clk = clk_get(dev, "lcdc_clk"); if (IS_ERR(sinfo->lcdc_clk)) { ret = PTR_ERR(sinfo->lcdc_clk); goto put_bus_clk; } atmel_lcdfb_start_clock(sinfo); ret = fb_find_mode(&info->var, info, NULL, info->monspecs.modedb, info->monspecs.modedb_len, info->monspecs.modedb, sinfo->default_bpp); if (!ret) { dev_err(dev, "no suitable video mode foundn"); goto stop_clk; } regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!regs) { dev_err(dev, "resources unusablen"); ret = -ENXIO; goto stop_clk; } sinfo->irq_base = platform_get_irq(pdev, 0); if (sinfo->irq_base < 0) { dev_err(dev, "unable to get irqn"); ret = sinfo->irq_base; goto stop_clk; } /* Initialize video memory */ map = platform_get_resource(pdev, IORESOURCE_MEM, 1); if (map) { /* use a pre-allocated memory buffer */ info->fix.smem_start = map->start; info->fix.smem_len = map->end - map->start + 1; if (!request_mem_region(info->fix.smem_start, info->fix.smem_len, pdev->name)) { ret = -EBUSY; goto stop_clk; } info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); if (!info->screen_base) goto release_intmem; /* * Don't clear the framebuffer -- someone may have set * up a splash image. */ } else { /* alocate memory buffer */ ret = atmel_lcdfb_alloc_video_memory(sinfo); if (ret < 0) { dev_err(dev, "cannot allocate framebuffer: %dn", ret); goto stop_clk; } } /* LCDC registers */ info->fix.mmio_start = regs->start; info->fix.mmio_len = regs->end - regs->start + 1; if (!request_mem_region(info->fix.mmio_start, info->fix.mmio_len, pdev->name)) { ret = -EBUSY; goto free_fb; } sinfo->mmio = ioremap(info->fix.mmio_start, info->fix.mmio_len); if (!sinfo->mmio) { dev_err(dev, "cannot map LCDC registersn"); goto release_mem; } /* Initialize PWM for contrast or backlight ("off") */ init_contrast(sinfo); /* interrupt */ ret = request_irq(sinfo->irq_base, atmel_lcdfb_interrupt, 0, pdev->name, info); if (ret) { dev_err(dev, "request_irq failed: %dn", ret); goto unmap_mmio; } /* Some operations on the LCDC might sleep and * require a preemptible task context */ INIT_WORK(&sinfo->task, atmel_lcdfb_task); ret = atmel_lcdfb_init_fbinfo(sinfo); if (ret < 0) { dev_err(dev, "init fbinfo failed: %dn", ret); goto unregister_irqs; } /* * This makes sure that our colour bitfield * descriptors are correctly initialised. */ atmel_lcdfb_check_var(&info->var, info); ret = fb_set_var(info, &info->var); if (ret) { dev_warn(dev, "unable to set display parametersn"); goto free_cmap; } dev_set_drvdata(dev, info); /* * Tell the world that we're ready to go */ ret = register_framebuffer(info); if (ret < 0) { dev_err(dev, "failed to register framebuffer device: %dn", ret); goto reset_drvdata; } /* add selected videomode to modelist */ fb_var_to_videomode(&fbmode, &info->var); fb_add_videomode(&fbmode, &info->modelist); /* Power up the LCDC screen */ if (sinfo->atmel_lcdfb_power_control) sinfo->atmel_lcdfb_power_control(1); dev_info(dev, "fb%d: Atmel LCDC at 0x%08lx (mapped at %p), irq %lun", info->node, info->fix.mmio_start, sinfo->mmio, sinfo->irq_base); return 0; reset_drvdata: dev_set_drvdata(dev, NULL); free_cmap: fb_dealloc_cmap(&info->cmap); unregister_irqs: cancel_work_sync(&sinfo->task); free_irq(sinfo->irq_base, info); unmap_mmio: exit_backlight(sinfo); iounmap(sinfo->mmio); release_mem: release_mem_region(info->fix.mmio_start, info->fix.mmio_len); free_fb: if (map) iounmap(info->screen_base); else atmel_lcdfb_free_video_memory(sinfo); release_intmem: if (map) release_mem_region(info->fix.smem_start, info->fix.smem_len); stop_clk: atmel_lcdfb_stop_clock(sinfo); clk_put(sinfo->lcdc_clk); put_bus_clk: if (sinfo->bus_clk) clk_put(sinfo->bus_clk); free_info: framebuffer_release(info); out: dev_dbg(dev, "%s FAILEDn", __func__); return ret; }
最佳答案
|
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4694 浏览 0 评论
87077 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4231 浏览 2 评论
3280 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2262 浏览 0 评论
1312浏览 3评论
这是i.mx6ull的关于usb的宏定义,能解释下这些宏定义的意思
962浏览 1评论
537浏览 1评论
1918浏览 0评论
2944浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-25 23:23 , Processed in 0.912224 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号