linux flash驱动设计思想总结

问题1: linux内核中的subsys_initcall是干什么的?

在编译某驱动为内置代码时,subsys_initcall与module_init仅仅是__define_initcall的第二个参数不同而已,前者使用4,后者使用6,因此归纳出仅仅是谁先被执行的差异,subsys_initcall比module_init先执行。

问题2: EXPORT_SYMBOL 是干什么的? EXPORT_SYMBOL(abc_flash_ctrl);

EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。

     使用方法
         1、在模块函数定义之后使用“EXPORT_SYMBOL(函数名)”来声明。
         2、在调用该函数的另外一个模块中使用extern对之声明。
         3、先加载定义该函数的模块,然后再加载调用该函数的模块,请注意这个先后顺序。

问题3: flash_init函数名前面 __init 是干什么的?

对只需要初始化运行一次的函数都加上__init属性,__init 宏告诉编译器如果这个模块被编译到内核则把这个函数放到(.init.text)段,module_exit的参数卸载时同__init类似,如果驱动被编译进内核,则__exit宏会忽略清理函数,因为编译进内核的模块不需要做清理工作,显然__init和__exit对动态加载的模块是无效的,只支持完全编译进内核。

 

问题4: linux内核中的platform_driver_register是干什么的?

platform_driver_register(&abc_flash_drvier) 会向系统注册abc_flash_drvier这个驱动程序,这个函数会根据 abc_flash_drvier中的.name内容(这里就是abc_flash),搜索系统注册的device中有没有这个platform_device,如果有,就会执行 platform_driver(也就是abc_flash_drvier的类型)中的.probe函数。

工程代码中的platform_driver_register与platform_device_register_simple两个函数,会调用到这个文件中定义的abc_flash_probe函数完成通过FLASH_DEVICE_NAME匹配的platform_device——”abc_flash”的注册。对应sys文件系统中的/sys/devices/platform/abc_flash目录。

int platform_device_register(struct platform_device * pdev)
{ device_initialize(&pdev->dev); //初始化设备结构
return platform_device_add(pdev); //添加一个片上的设备到设备层
}

int device_register(struct device *dev)
{ device_initialize(dev); //初始化设备结构
return device_add(dev); //添加设备到设备层
}

device_register()和platform_device_register()都会首先初始化设备
区别在于第二步:其实platform_device_add()包括device_add(),只不过要先注册resources

struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};

platform机制相对于传统的device driver 机制优点在于:将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。

问题4:abc_flash_probe函数什么?

platform_set_drvdata函数的目的是存储用户在probe()中主动申请的内存区域的指针以防止丢失。misc_register  在内核中,misc杂项设备驱动接口是对一些字符设备的简单封装,他们共享一个主设备号10,有不同的次设备号,共享一个open调用,其他的操作函数在打开后运用linux驱动程序的方法重载进行装载。 内核维护一个misc_list链表,misc设备在misc_register注册的时候链接到这个链表,在misc_deregister中解除链接。主要的设备结构就是miscdevice。MISC_DYNAMIC_MINOR,则是动态次设备号。misc设备结构,主要包含次设备号,设备名和文件操作结构指针。设备名最终会出现在/dev下,生成设备文件abc_flash。在/sys/devices/virtual/misc/下生成设备目录,里面包含设备属性文件。在/sys/class/misc/下生成符号链接文件abc_flash指向/sys/devices/virtual/misc/abc_flash目录。

device_create_file函数会在/sys/devices/virtual/misc/下生成设备属性文件test。

Flash_device 结构体s_flash_dev全局变量在abc_flash_probe函数内部分配内存,然后在实际使用的芯片驱动代码中通过调用abc_flash_register函数赋值。

struct flash_device {
    struct miscdevice md;
    const struct abc_flash_driver_ops *ops[ABC_FLASH_MAX];
    void *driver_data[ABC_FLASH_MAX];
    int flashlight_status[ABC_FLASH_MAX];
    unsigned short attr_test_value;
};
static struct platform_device *pdev;
static struct flash_device *s_flash_dev;

各个芯片驱动内部实现flash_device设备结构体内部的操作方法abc_flash_driver_ops与参数结构体flash_driver_data的赋值。

struct abc_flash_driver_ops {
    int (*open_torch)(void *drvd, uint8_t idx);
    int (*close_torch)(void *drvd, uint8_t idx);
    int (*open_preflash)(void *drvd, uint8_t idx);
    int (*close_preflash)(void *drvd, uint8_t idx);
    int (*open_highlight)(void *drvd, uint8_t idx);
    int (*close_highlight)(void *drvd, uint8_t idx);
    int (*cfg_value_torch)(void *drvd, uint8_t idx);
    int (*cfg_value_preflash)(void *drvd, uint8_t idx);
    int (*cfg_value_highlight)(void *drvd, uint8_t idx);
};

问题5: Flash_drv.c函数中还包含一个flash_sysfs_test函数,它的作用是?

DEVICE_ATTR可以在sys fs中添加“文件”,通过修改该文件内容,可以实现在运行过程中动态控制device的目的。DEVICE_ATTR的功能就是定义一个device_attribute结构体对象。
device_create_file利用该对象在device下创建文件。

类似的还有DRIVER_ATTR,BUS_ATTR,CLASS_ATTR。
这几个小编的区别就是,DEVICE_ATTR对应的文件在/sys/devices/目录中对应的device下面。
而其他几个分别在driver,bus,class中对应的目录下。

DEVICE_ATTR(_name, _mode, _show, _store)

_name:名称,也就是将在sys fs中生成的文件名称。

_mode:上述文件的访问权限,与普通文件相同,UGO的格式。

_show:显示函数,cat该文件时,此函数被调用。

_store:写函数,echo内容到该文件时,此函数被调用。

flash_sysfs_test函数作为DEVICE_ATTR的第四个参数:_store:写函数,echo内容到该文件时,此函数被调用。

使用echo向该设备文件写入内容举例:

开手电筒     echo 10 > /sys/devices/virtual/misc/abc_flash/test       
关手电筒     echo 11 > /sys/devices/virtual/misc/abc_flash/test

 

 

 

 

 

 

 

 

 

原文地址:https://blog.csdn.net/u011624475/article/details/112044080

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


  译序:JWMediaPlayer是开源的网页使用的Flash播放器。本文采摘于JWPlayer的官方文档,讲解了JWPlayer对于RTMP的使用方法,我们可以从JWPlayer客户端的角度来了解RTMP协议。以下是官方原文:      简介    RTMP(RealTimeMessagingProtocol
    Flash编程原理都是只能将1写为0,而不能将0写成1.所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是将所有位都写为1的过程,块内的所有字节变为0xFF.因此可以说,编程是将相应位写0的过程,而擦除是将相应位写1的过程,两者的执行过程完全相反.一、Nor和NandFlash
 上传setenvgatewayip192.168.1.1;setenvserverip192.168.1.7;setenvipaddr192.168.1.156;mw.b0x820000000xff0x1000000sfprobe0sfread0x8200000000x1000000tftp0x82000000test.bin0x1000000 下载mw.b82000000ff1000000tftp82000000test.bi
Error:FlashDownloadFailed-"Cortex-M3"出现一般有两种情况:1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/HWreset/sysresetReq/Vectreset)默认是AutoDetect,改成SysResetReq即可。2.Jtag模式下,主要是芯片大小选错。Flash->ConfigureFalshTools配置窗口,切换到“Utilities"
jPlayer是一个用于控制和播放mp3文件的jQuery插件。它在后台使用Flash来播放mp3文件,前台播放器外观完全可以使用XHML/CSS自定义。支持:有一点比较好的是,在支持html5的浏览器上会使用html5的标签audio或者video,而不支持的浏览器上使用swf来播放选择需要播放的Mp3文件。播放、暂停
#ifndef__FONTUPD_H__#define__FONTUPD_H__#include"sys.h" //字库信息结构体定义33字节__packedtypedefstruct{u8fontok;//字库存在标志,0XAA,字库正常;其他,字库不存在u32ugbkaddr;//unigbk的地址u32ugbksize;//unigbk的大小u32f12addr;//gbk12地址u32g
ROM(ReadOnlyMemory)和RAM(RandomAccessMemory)指的都是半导体存储器。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,但是访问速度快。典型的RAM就是计算机的内存。RAM有两大类,一种称为静态RAM(StaticRAM/SRAM),SRAM速度非常快,是目前读写最快的存储
JSpc端和移动端实现复制到剪贴板功能实现在网页上复制文本到剪切板,一般是使用JS+Flash结合的方法,网上有很多相关文章介绍。随着HTML5技术的发展,Flash已经在很多场合不适用了,甚至被屏蔽。本文介绍的一款JS插件,实现了纯JS方法复制文本到剪切板。插件名是Clipboard.js,该插件不依
例子:R0=1R1=1R2=10R3=e000ed10R12=0LR=fffffff9(中断返回值)PC=0PSR=60000013或60000016或60000036(Z、C、EXCEPT_NUM:RTC_WKUP_IRQn、EXTI0_IRQn、USART2_IRQn)BFAR=e000ed38(不关心)CFSR=20000(INVSTATE:Invalidstateusagefault thePCvaluestackedf
 内存接口概念首先来分析下操作GPIO控制器和操作UART控制器两者的区别如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器(接有TXDRXD引脚)配置GPIO控制器相应的寄存器,即可让引脚输出高低电平;配置UART控制器相应的寄存器,即可让引脚输出波形。前者相对简单,类
小编导语:    近几年来,网页游戏成为了游戏界关注的焦点,由于其制作简单,成本低并且收益率较高,因此成为了众多游戏厂商追逐的对象,但是除了商家夸张的炒作宣传外,很少有页游佳作出现。然而,随着Unity3D游戏引擎的出现,网页游戏的3D化成了页游冲出重围的杀手锏,那么在flash网页游戏称
1.指定数组到特定的Flash单元#pragmalocation=0x000FFF00 __rootconstcharFlash_config[]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0
继续研究发现,计算机的固件真的很有趣。参考了一些重要的资料,比如http://donovan6000.blogspot.com/2013/06/insyde-bios-modding-advanced-and-power-tabs.html等,对于IDA的使用也了解了一些。最后,总结一下目前看来可行性的方案:0.基础知识储备,包括UEFIBIOS的概念,InsydeBIOS的
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>navigator对象<itle></head><body><buttononclick="checkFlash()">检测</button>
修改网上流传的flash-marker.js(function(global,factory){typeofexports==='object'&&typeofmodule!=='undefined'?module.exports=factory():typeofdefine==='function'&&define.amd?define(factory
shareObject本地缓存存储位置:win7系统用户到C:\Users\[你的用户名]\AppData\Roaming\Macromedia\FlashPlayer\#SharedObjects\XP或2003用户到:C:\DocumentsandSettings\用户名\ApplicationData\Macromedia\FlashPlayer\#SharedObjects\ ---------------------作者:iteye_
安装谷歌浏览器之后经常遇到Flash崩溃或者浏览器在浏览Flash内容时卡死的情况。在网上查找资料大多都认为应该是浏览器自带的Flash插件工作模式引起的问题,解决方法如下:首先在地址栏输入chrome://plugins/显示浏览器使用的插件。点击右上角的详细信息,可以看到Flash插件为进程外
之前一直使用的W25Q16spiflash都没问题,换了一款W25Q80后发现工作不正常,经过测试,初步定位到问题在于初始化SPI后是否将CS拉高。于是又去查看了一下原厂代码:发现原厂的代码初始化SPI接口时是专门拉高CS的。结论:网上很多代码初始化SPI接口时没有专门拉高CS,对某些型号可能确实
======================================================NANDFlash最小存储单元:写数据操作:通过对控制闸(ControlGate)施加高电压,然后允许源极(SOURCE)和汲极(RRAIN)间的N信道(N-Channel)流入电子,等到电流够强,电子获得足够能量时,便会越过浮置闸(FloatingGate)底下的二氧化硅层(S
安装CnarioPlayer3.8.1.156或其他版本时,有时会出现如下提示:Warning4154.AdobeFlashPlayer13...notcorrectlyinstalled:请前往AdobeFlash网站,并选择下图示的版本下载安装: