目前在kernel驱动代码中,都不再建议直接使用printk直接添加打印信息,而是使用dev_info,dev_dbg,dev_err之类的函数代替,虽然这些dev_xxx函数的本质还是使用printk...dev_info():启动过程、或者模块加载过程等“通知类的”信息等,一般只会通知一次,例如probe函数; dev_dbg():一般使用在普通错误,如-EINVAL、-ENOMEM等errno发生处,用于调试; dev_err...的地方,或者程序员不容易猜测系统哪里出了问题的地方; 动态调试使用方法 打开内核动态调试开关,make menuconfig选中CONFIG_DYNAMIC_DEBUG以及CONFIG_DEBUG_FS Linux...代码分析 从代码角度,也很容易看出dev_dbg()的设计: include/linux/device.h include/linux/dynamic_debug.h lib/dynamic_debug.c
1、DTS文件 &keypad { keypad,num-rows = ; keypad,num-columns = ; linux,keymap = <0x00000012...KEY_UNKNOWN */ 0x07060160 /* KEY_OK */ 0x0707006c>; /* KEY_DOWN */ linux...0x00030066 /* KEY_HOME*/ 00行,03列,键值0x66即HOME建 2、驱动 路径 linux\drivers\input\keybord\ 2、1 probe static...keypad_data->rows, &keypad_data->cols); if (err) return err; if (of_get_property(np, "linux...propname) propname = "linux,keymap"; prop = of_get_property(np, propname, &proplen); if (!
在linux内核映射物理地址的简单代码。 使用request_mem_region和ioremap映射物理地址。 映射之后,可通过虚拟地址读写对应的寄存器。...request_mem_region(p_device_info->phy_base, XXX_REG_SPACE, XXX_NAME)) { dev_err(p_device_info...->dev, "xxx_map_mem request_mem_region failed\n"); return -ENOMEM; } dev_err(p_device_info->dev...(p_device_info->phy_base, XXX_REG_SPACE); return -ENOMEM; } dev_err(p_device_info->dev, "xxx_map_mem...ioremap successed, virt address: %px\n", p_device_info->map_virt_base); dev_err(p_device_info-
/spi.c SPI总线驱动层(主机控制器驱动层):drivers/spi/spi_s3c24xx. c SPI设备驱动层:drivers/spi/spidev.c (内核提供的SPI通用设备驱动) Linux...具体的分离策略详细分析可参考Linux驱动之I2C子系统剖析中内核对I2C子系统框架的阐述。笔者在这与I2C子系统类比,列出数据结构名。...i2c_msg struct spi_transfer 多个完整数据包的封装 无 struct spi_message 源码分析 由于子系统架构与I2C等总线类似,所以不会在一些重复部分展开,具体分析可以参考的Linux...res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { dev_err(&pdev->dev, "Cannot...pdata->set_cs) { if (pdata->pin_cs < 0) { dev_err(&pdev->dev, "No chipselect pin\n");
在linux内核系统中,各个模块、子系统之间是相互独立的。Linux内核可以通过通知链机制来获取由其它模块或子系统产生的它感兴趣的某些事件。...notifier_block结构体在include/linux/notifier.h中定义: struct notifier_block { notifier_fn_t notifier_call...data) { dev_err(&client->dev, "%s: Alloc mem fail!"...disable_irq(data->client->irq); err = msg21xx_power_on(data, false); if (err) dev_err...state\n"); return 0; } err = msg21xx_power_on(data, true); if (err) { dev_err
前言 有时我们需要在 Linux 内核中预留一部分内存空间用作特殊用途(给安全模块使用,给其它处理器使用,或是给特定的驱动程序使用等),在 Device Tree 中有提供两种方法对预留内存进行配置:memreserve...会将从地址 0x40000000 开始共 1MB 的内存空间预留出来: /memreserve/ 0x40000000 0x00100000; 使用 memreserve 预留出来的内存一般无法再被 Linux...np) { dev_err(dev, "No %s specified\n", "memory-region"); goto error1; } rc = of_address_to_resource...(np, 0, &r); if (rc) { dev_err(dev, "No memory address assigned to the region\n"); goto error1; }.../* Initialize reserved memory resources */ rc = of_reserved_mem_device_init(dev); if(rc) { dev_err
)i2c-uclass-compat.c 5)rv1126_common.h 4.bootargs参数传递 修改u-boot/arch/arm/lib/bootm.c文件,找到boot_prep_linux...= 6 || is_zero_ether_addr(addr)) { dev_err(dev, "%s: rk_vendor_read eth mac address failed...__func__, ret); } out: dev_err(dev, "%s: mac address: %02x:%02x:%02x:%02x:%02x:%02x"...将此部分注释掉,使用 __setup 函数来获取bootargs中的eth1addr参数,然后传递给mac进行设置,具体实现如下 2.修改rtl8152驱动 首先先从realtek官网下载8152最新的linux...component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-usb-3-0-software](),目前为止linux
来自: http://www.diybl.com/course/6_system/linux/Linuxjs/200871/129585.html 从 Linux 2.6 起引入了一套新的驱动管理和注册机制...Linux 中大部分的设备驱动,都可以使用这套机制 , 设备用 Platform_device 表示,驱动用 Platform_driver 进行注册。...i2c- > clk = clk_get( & pdev- > dev, “i2c” ) ; if ( IS_ERR( i2c- > clk) ) { dev_err...start) + 1, pdev- > name) ; /* 申请这块IO Region */ if ( i2c- > ioarea = = NULL ) { dev_err...res- > end- res- > start) + 1) ; /* 映射至内核虚拟空间 */ if ( i2c- > regs = = NULL ) { dev_err
转载请标明出处floater的csdn blog,http://blog.csdn.net/flaoter Linux SPI驱动分为核心层,控制器驱动层和设备驱动层。...核心层是Linux的SPI核心部分,提供了核心数据结构的定义,总线、设备和驱动的注册、注销管理等,提供与上层的统一接口。...linux将I2C、SPI、USB等总线驱动隔离成控制器驱动和设备驱动,使两者相对独立。 本文以qcom的spi控制器为例,对spi控制器驱动进行解析。kernel代码版本是3.18。...linux驱动与设备是一对多的关系,在spi_master设备注册时,控制器的结构体信息会提供给spi_master作为私有数据。...max_freq || max_freq > SPI_MAX_RATE) { dev_err(dev, "invalid clock frequency %d\n", max_freq); return
/errno.h> #include #include #include #include #include #include #include #include #include #include #include #include #include...= 0) { dev_err(dev,"s3c_ts.c: Could not allocate ts IRQ_PENDN !...= 0) { dev_err(dev, "s3c_ts.c: Could not allocate ts IRQ_ADC !
nfc-nci flags = %x\n", __func__, client->flags); if (platform_data == NULL) { dev_err...nqx_dev->kbuf) { dev_err(&client->dev, "failed to allocate memory for nqx_dev->kbuf...{ r = gpio_request(platform_data->en_gpio, "nfc_reset_gpio"); if (r) { dev_err...) { r = gpio_request(platform_data->irq_gpio, "nfc_irq_gpio"); if (r) { dev_err...; } r = gpio_direction_input(platform_data->irq_gpio); if (r) { dev_err
从Linux 2.6起引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。...Linux中大部分的设备驱动,都可以使用这套机制, 设备用Platform_device表示,驱动用Platform_driver进行注册。...->dev = &pdev->dev; i2c->clk = clk_get(&pdev->dev, "i2c"); if (IS_ERR(i2c->clk)) { dev_err...platform_get_resource(pdev, IORESOURCE_MEM, 0); /* 获取设备的IO资源地址 */ if (res == NULL) { dev_err...platform_get_resource(pdev, IORESOURCE_IRQ, 0); /* 获取设备IRQ中断号 */ if (res == NULL) { dev_err
/*分析DM9000网卡驱动之初始化*/ /*找到DM9000.c 文件路径: linux/drivers/net下 找到模块的入口函数处 */ static int __init dm9000...ndev) { dev_err(&pdev->dev, "could not allocate device....request_mem_region(db->addr_res->start, iosize, pdev->name); if (db->addr_req == NULL) { dev_err...goto out; } db->io_addr = ioremap(db->addr_res->start, iosize); if (db->io_addr == NULL) { dev_err...= DM9000_ID) { dev_err(db->dev, "wrong id: 0x%08x\n", id_val); ret = -ENODEV; goto out; } /*
lux_data; + + lux_data = cm3218_read(client, CM3218_REG_ADDR_ALS); + if (lux_data < 0) { + dev_err...status = cm3218_write(client, CM3218_REG_ADDR_CMD, CM3218_DEFAULT_CMD); if (status < 0) { dev_err...lux_data; - - lux_data = cm3218_read(client, CM3218_REG_ADDR_ALS); - if (lux_data < 0) { - dev_err...}, { .compatible = "ls_stk3171" }, { .compatible = "ls_ap321xx" }, ^M diff --git a/include/linux.../sensor-dev.h b/include/linux/sensor-dev.h index 16e916f..6c21fcd 100755 --- a/include/linux/sensor-dev.h
/types.h> 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include... 22 #include 23 #include 24 #include <linux/input...keymap_data) { 333 dev_err(&pdev->dev, "no keymap data defined\n"); 334...Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中): EV_SYN 0x00 同步事件 EV_KEY 0x01 按键事件 EV_REL 0x02 相对坐标
同时也需要对所有的codec设备进行抽象封装,linux使用snd_soc_codec进行所有codec设备的抽象,而将codec的驱动抽象为snd_soc_codec_driver结构。...wcd_resource) { 21 dev_err(&spmi->dev, "Unable to get Tombak base address\n"); 22 return...msm8x16 = kzalloc(sizeof(struct msm8x16_wcd), GFP_KERNEL); 71 if (msm8x16 == NULL) { 72 dev_err...wcd_reg_write; 81 ret = msm8x16_wcd_init_supplies(msm8x16, pdata); 82 if (ret) { 83 dev_err...87 88 ret = msm8x16_wcd_enable_static_supplies(msm8x16, pdata); 89 if (ret) { 90 dev_err
reg_map) { dev_err(&pdev->dev, "%s :NULL regmap for charge 2721\n", __func__);...IRQF_NO_SUSPEND | IRQF_ONESHOT, "sprdbat_chg_cv_state", sprd_2721); if (ret) { dev_err...devm_gpio_request(&pdev->dev, pdata->gpio_vchg_ovi, "vchg_ovi"); if (ret) { dev_err...IRQF_NO_SUSPEND | IRQF_ONESHOT, "sprdbat_vchg_ovi", sprd_2721); if (ret) { dev_err...power_supply_register(&pdev->dev, sprd_2721->charger.desc, NULL); if (IS_ERR(ret_ptr)) { dev_err
在目录下amp\a53_linux\drv\extdrv\touchpad\ft6236下可以看到ft6236.c的文件 1. init函数 static int __init ft_init(void...stRstInfo.bit_num = RST_GPIO_OFFSET; stRstInfo.value = 1; ret = i2cdev_init(); if (ret) { dev_err...stIntInfo); hi_gpio_set_dir(&stRstInfo); ret = ft_reset(&stRstInfo); if (ret) { dev_err...\n"); goto error_end; } ret = devinput_init(); if (ret) { dev_err(NULL...->id.bustype = BUS_I2C; error = input_register_device(ft_ts_dev); if (error) { dev_err
看门狗是linux驱动的一个重要环节。某些特殊的设备,有时候需要放在一些环境恶劣的地方,比如电信设备。但是,任何软件都不可能100%没有bug。...driver为platform类型,继续在probe函数中查找有用的code ret = watchdog_register_device(&wdt->wdt_device); if (ret) { dev_err...= 0) { dev_err(dev, "failed to install irq (%d)\n", ret); goto err_cpufreq; } 8、有兴趣的话,可以找一个函数阅读一下
pdata) { 22 dev_err(&pdev->dev, "Can't allocate msm8x16_asoc_mach_data\n"); 23 ret...ret = of_property_read_u32(pdev->dev.of_node, card_dev_id, &id); 54 if (ret) { 55 dev_err...card) { 125 dev_err(&pdev->dev, "%s: Card uninitialized\n", 126 __func__)...card) { 133 dev_err(&pdev->dev, "%s: Card uninitialized\n", 134 __func__)...相应的资料: 其实以上便是linux3.10以上的audio内核machine架构,网上搜索相应资料便可找到;贴上借鉴的资料: http://blog.csdn.net/zhaocj/article/details
领取专属 10元无门槛券
手把手带您无忧上云