Linux2.6内核驱动移植.doc_第1页
Linux2.6内核驱动移植.doc_第2页
Linux2.6内核驱动移植.doc_第3页
Linux2.6内核驱动移植.doc_第4页
Linux2.6内核驱动移植.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux2.6内核驱动移植8J$ u#I!a5x嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA嵌入式应用论坛5n*h7B$bR#d 随着Linux2.6的发布,由于2.6内核做了教的改动,各个设备的驱动程序在不同程度上要进行改写。为了方便各位Linux爱好者我把自己整理的这分文档share出来。该文当列举了2.6内核同以前版本的绝大多数变化,可惜的是由于时间和精力有限没有详细列出各个函数的用法。6Y65c)x A.R嵌入式系统|linux|ARM|单片机特别声明:该文档中的内容来自,该网也上也有各个函数的较为详细的说明可供各位参考。如果需要该文档的word版的朋友, 请mail到索取。 +H7)v4D*h3Z)C6w1S$A#?9j8k+*P嵌入式系统,linux,VxWorks,ARM,单片机1、 使用新的入口 嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA8|,T+R*#w+q$O&b必须包含 *5z5N8L1Y嵌入式系统|linux|ARM|单片机module_init(your_init_func);嵌入式系统,linux,VxWorks,ARM,单片机c(p5x$Z8j)8u7x#dmodule_exit(your_exit_func);嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA*N!h$P$m)Q#|-s老版本:int init_module(void);g)N:W(void cleanup_module(voi);4c:Q w1N3c0E;?.Q(s2.4中两种都可以用,对如后面的入口函数不必要显示包含任何头文件。嵌入式应用论坛0e.G,?|6w3F)o&H&N6c1&l!e5i嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA2、 GPL 5D6c)i$ex2P&SMODULE_LICENSE(Dual BSD/GPL);嵌入式系统|linux|ARM|单片机%G0C6C-z.2F8D#老版本:MODULE_LICENSE(GPL); 0_0I.C1_*b;$d#M嵌入式系统,linux,VxWorks,ARM,单片机*h-b$v/J6x&ex/F0W2k3、 模块参数 ;Q* X+)V+U ?2N嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA必须显式包含2?01md:n5t:H%r(S;r/rmodule_param(name, type, perm);嵌入式系统|linux|ARM|单片机*O 0q7r2T9y:Mmodule_param_named(name, value, type, perm);9P7y*k%G7f9n参数定义8n.a2K$D&u/c1hmodule_param_string(name, string, len, perm);0t!l.Z5_,f+M4V3Fmodule_param_array(name, type, num, perm);.S4L)Q7+B&V老版本:MODULE_PARM(variable,type);嵌入式系统,linux,VxWorks,ARM,单片机#L*L4i3j8T(0|+;W1vMODULE_PARM_DESC(variable,type); 2s?6J2D;M(f(8n*B33_11N(8u#,J7A嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA4、 模块别名 /N;t%,.S+v ZMODULE_ALIAS(alias-name);$p/6h+f1f$m*H5这是新增的,在老版本中需在/etc/modules.conf配置,现在在代码中就可以实现。 v+1y8x3M3g+6F:d+G(h1y9D B2|0W,x5、 模块计数 #1j$e/v3O+N5P+y3J*k$Z6Y6Hint try_module_get(&module);)v*H4E$TQ+d-x6U(pmodule_put();$K.e.g6d,J!h,K嵌入式系统|linux|ARM|单片机老版本:MOD_INC_USE_COUNT 和 MOD_DEC_USE_COUNT D,n(JF7x嵌入式应用论坛嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA0g3y!GE80L-x8/Q7t6、 符号导出 嵌入式系统,linux,VxWorks,ARM,单片机3y)t2Q/i9W*?9|只有显示的导出符号才能被其他模块使用,默认不导出所有的符号,不必使用EXPORT_NO_SYMBOL*2|&+a1t(B&e*U;a*z嵌入式系统,linux,VxWorks,ARM,单片机老板本:默认导出所有的符号,除非使用*PORT_NO_SYMBOLS 嵌入式应用论坛 n)v h%|/O9u4z9H.v9S)%Q/KQ6v&s+#j嵌入式系统|linux|ARM|单片机7、 内核版本检查 !T!uR:S*n$K5P8B需要在多个文件中包含时,不必定义_NO_VERSION_ F%h;g5O,x F老版本:在多个文件中包含时,除在主文件外的其他文件中必须定义_NO_VERSION_,防止版本重复定义。 )l L|19%d.e嵌入式系统|linux|ARM|单片机!m&u8P/A8x*y,P,P!B&g4m嵌入式系统,linux,VxWorks,ARM,单片机8、 设备号 嵌入式系统|linux|ARM|单片机-?0Xq5y U$y#ckdev_t被废除不可用,新的dev_t拓展到了32位,12位主设备号,20位次设备号。-x5M7C%q/Qunsigned int iminor(struct inode *inode);嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA*A$P/s8vunsigned int imajor(struct inode *inode);$i.C4D3BV:v/u$?老版本:8位主设备号,8位次设备号d$y#s$TRC3Y&C,lint MAJOR(kdev_t dev);%u9a5K8f%#nint MINOR(kdev_t dev); 嵌入式系统,linux,VxWorks,ARM,单片机;f,9W;d.D.y/:L9HC.y;T%r5_-s0X;K4C9、 内存分配头文件变更 8m3o7u%c9z5Y嵌入式系统,linux,VxWorks,ARM,单片机所有的内存分配函数包含在头文件,而原来的不存在(F4w&a#O-H(c f+u嵌入式系统|linux|ARM|单片机老版本:内存分配函数包含在头文件嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA:K-,e:R8bP6T嵌入式系统|linux|ARM|单片机5j&d6Ws4_7c2E.Y1Y $B10、 结构体的初试化 嵌入式系统|linux|ARM|单片机4v !e/(y3G9j&l7z*egcc开始采用ANSI C的struct结构体的初始化形式:)#u$x0U*B,8B+K7Rstatic struct some_structure = &e9s;x&y.field1 = value,1h*I.3M-u)R2C Lu-F-+J嵌入式系统,linux,VxWorks,ARM,单片机.field2 = value, z9;R%r3N42L4Q5O.1m5t:H0X/;&(t!l!g;&A%r)v+b4gt)a老版本:非标准的初试化形式嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA9o L.x3|127_static struct some_structure = (UB,h,-S%F1s)嵌入式系统,linux,VxWorks,ARM,单片机field1: value,(L1.R;r%V嵌入式系统,linux,VxWorks,ARM,单片机field2: value,6g.t$F!D4p12T6L$a嵌入式系统|linux|ARM|单片机.2H0K9e0g$L9; .M9R9I&u(y6.u#Q!%F)m1f&f5w;J嵌入式应用论坛11、 用户模式帮助器K6W$W c-kK嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAint call_usermodehelper(char *path, char *argv, char *envp,0k6d$i4I:int wait);嵌入式系统,linux,VxWorks,ARM,单片机-A(G-g6L4_:C 新增wait参数 (K+n&n)H.s(z9/P嵌入式系统|linux|ARM|单片机,_,n7O:p)B*h12、 request_module() ;M8b2x:c0V2J/%l2I嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGArequest_module(foo-device-%d, number);嵌入式系统|linux|ARM|单片机/s/t,ec/s老版本:g,d,H/o*V6w8I!_$嵌入式系统|linux|ARM|单片机char module_name32;嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA.l)c)X4f*i63X)_:Kprintf(module_name, foo-device-%d, number);嵌入式系统|linux|ARM|单片机5k%R mb5Grequest_module(module_name); 嵌入式应用论坛W.I#n8)H0fG嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA)f;K%r%s:h8z13、 dev_t引发的字符设备的变化 1M2V U3X#Q7E!Y(y42I-g)嵌入式系统|linux|ARM|单片机1、取主次设备号为嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA9V/)t$U*5v6!punsigned iminor(struct inode *inode);1P(h6M8t)U.gunsigned imajor(struct inode *inode);嵌入式系统,linux,VxWorks,ARM,单片机8E9XI%x%.K嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA*w3l$T2D:d9L7H2、老的register_chrdev()用法没变,保持向后兼容,但不能访问设备号大于256的设备。嵌入式应用论坛7z8F)o8K6P.?8*p嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA&.Z!b/A*u&f2E3、新的接口为1A5d9P6K9w0x)P*H$r:H.嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA嵌入式系统,linux,VxWorks,ARM,单片机7rg.x, 1s;3xa)注册字符设备范围嵌入式系统,linux,VxWorks,ARM,单片机7r-G)p)kUint register_chrdev_region(dev_t from, unsigned count, char *name); 嵌入式应用论坛.w.k-C+d(s%m#?*J嵌入式应用论坛+b*D)ju2 f&n Gb)动态申请主设备号&o-n2M;8Y6r嵌入式系统|linux|ARM|单片机int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, char *name);.S#F1R#看了这两个函数郁闷吧_!怎么和file_operations结构联系起来啊?别急!cd8v(w*7P嵌入式系统|linux|ARM|单片机G27Q)A48V!d mbc)包含 ,利用struct cdev和file_operations连接pZ:Y(T:u4struct cdev *cdev_alloc(void);#K.o+oW%M:P.Tvoid cdev_init(struct cdev *cdev, struct file_operations *fops);-fQ+p#X5j1 Oint cdev_add(struct cdev *cdev, dev_t dev, unsigned count); b(d#o+_7W(分别为,申请cdev结构,和fops连接,将设备加入到系统中!好复杂啊!)6_0_9c1h.C5u;/E-o6m嵌入式系统,linux,VxWorks,ARM,单片机 嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA-v9z)p-L%g2d)void cdev_del(struct cdev *cdev);2n5m&0u)_嵌入式系统,linux,VxWorks,ARM,单片机只有在cdev_add执行成功才可运行。 嵌入式应用论坛/N+e$;T,T!f5+U/6V;g嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA/ O7O7X5$?B6V+3noe)辅助函数Z:p#R(Z2V+h4zl J4l%M$kobject_put(&cdev-kobj);$6X*p6y,M&W$B 3ystruct kobject *cdev_get(struct cdev *cdev);._&i#K9S30A嵌入式系统,linux,VxWorks,ARM,单片机void cdev_put(struct cdev *cdev);9u;7n4X6K$l)d!?这一部分变化和新增的/sys/dev有一定的关联。79o)i;J$#V4I+嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAM7#D5m0F-k;j:x$14、 新增对/proc的访问操作 嵌入式应用论坛+d+Z(s *e:M!Z/M5h0e1P4h;l;R嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA8Q3f)?)|0si7y0|)i8?0以前的/proc中只能得到string, seq_file操作能得到如long等多种数据。6e6_%:d*w4c8C4Q相关函数:$HL:H|3g,k 1K.rstatic struct seq_operations 必须实现这个类似file_operations得数据中得各个成员函数。嵌入式系统,linux,VxWorks,ARM,单片机7p)?1M$!u,i.bseq_printf();i7j5P!6f嵌入式系统,linux,VxWorks,ARM,单片机int seq_putc(struct seq_file *m, char c);&B,n9S4?c1q/2V(int seq_puts(struct seq_file *m, const char *s);+B2d4w%P($8N1o3Vint seq_escape(struct seq_file *m, const char *s, const char *esc);&u(2u2g8Y.e+k.D)a1P嵌入式系统|linux|ARM|单片机int seq_path(struct seq_file *m, struct vfsmount *mnt,(D6S,d&X*R*ystruct dentry *dentry, char *esc);嵌入式系统,linux,VxWorks,ARM,单片机*t&L&X*N/H9jX#seq_open(file, &ct_seq_ops);6a/j/u;9B-u1&I等等 嵌入式系统|linux|ARM|单片机!t%C8K(Z-嵌入式系统,linux,VxWorks,ARM,单片机1v)b:O1ea,k2M-U15、 底层内存分配 :q;Y.r/F1q,n7嵌入式应用论坛1、头文件改为4H4?S0C5C3b-R4s-B/y6A嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA2、分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO 和 GFP_NOFS&o$C t:e+z.z:G%.m嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA3、新增_GFP_REPEAT,_GFP_NOFAIL,_GFP_NORETRY分配标志!|5_1F+%&i4、页面分配函数alloc_pages(),get_free_page()被包含在中6LX2A Y%Y +嵌入式系统|linux|ARM|单片机5、对NUMA系统新增了几个函数:-f+t&/sH8s.L#W:n嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAa) struct page *alloc_pages_node(int node_id,嵌入式系统|linux|ARM|单片机(N*c0y;E*u3Y9K;N8(w-Ounsigned int gfp_mask,1a69H-Xunsigned int order);嵌入式系统,linux,VxWorks,ARM,单片机O*A#t0c:S*l4v7tb) void free_hot_page(struct page *page);嵌入式系统|linux|ARM|单片机* H-5H$A)?0Mc) void free_cold_page(struct page *page);嵌入式系统,linux,VxWorks,ARM,单片机8S+h)Z0v+T%o!(e$I)z$V6、 新增Memory pools嵌入式应用论坛:B$8:q7#i-C!u$T5H,+p+m,Y!n&d;Mmempool_t *mempool_create(int min_nr,嵌入式应用论坛 s!j(y8R*N;z3A6)mempool_alloc_t *alloc_fn,嵌入式系统|linux|ARM|单片机8u7i#rl5H:g9y5U%Dmempool_free_t *free_fn,?!(j8c!z/k;s/void *pool_data);:c,x9F75a.s嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAvoid *mempool_alloc(mempool_t *pool, int gfp_mask);0|/_;w9z5V3U%O嵌入式系统,linux,VxWorks,ARM,单片机void mempool_free(void *element, mempool_t *pool);)Y,21k0J6int mempool_resize(mempool_t *pool, int new_min_nr, int gfp_mask); &b.S9i38b:i9Z,P/b07Q16、 per-CPU变量 !:H5Ps$K1v*u嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAget_cpu_var();*z/S$J3!h,Y,d&S嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAput_cpu_var();嵌入式系统|linux|ARM|单片机4G94n2N:vvoid *alloc_percpu(type);7 _$Y:m:;3su+q,s-jvoid free_percpu(const void *);&p+C57x0F/Q$_嵌入式应用论坛per_cpu_ptr(void *ptr, int cpu)嵌入式系统,linux,VxWorks,ARM,单片机* z9E/R V71Lget_cpu_ptr(ptr),X d5G0+a7t8i8c嵌入式系统|linux|ARM|单片机put_cpu_ptr(ptr).z;t6h6c$?&K0嵌入式系统,linux,VxWorks,ARM,单片机老版本使用&u,o$R4I%w.E6i-Q/r(N嵌入式应用论坛DEFINE_PER_CPU(type, name);嵌入式系统|linux|ARM|单片机&bZ7f1n+A/IEXPORT_PER_CPU_SYMBOL(name);-H)rD3x&E 嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAEXPORT_PER_CPU_SYMBOL_GPL(name);2Fa S$2x-C6A2IDECLARE_PER_CPU(type, name);嵌入式系统,linux,VxWorks,ARM,单片机l-u4H:7E)_8Q,m-vDEFINE_PER_CPU(int, mypcint);&H1f$T;D/Zo2.6内核采用了可剥夺得调度方式这些宏都不安全。 r#O5O#E,d7Y 0q7T6M)c;x2s:J嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA17、 内核时间变化 0_!j+U6m8|,X(Y-w-wS1f5u&x)b1O9x1嵌入式系统,linux,VxWorks,ARM,单片机1、现在的各个平台的HZ为嵌入式系统,linux,VxWorks,ARM,单片机2N+y/z77c-Alpha: 1024/1200; ARM: 100/128/200/1000; CRIS: 100; i386: 1000; IA-64: 1024; M68K: 100; M68K-nommu: 50-1000; MIPS: 100/128/1000; MIPS64: 100; PA-RISC: 100/1000; PowerPC32: 100; PowerPC64: 1000; S/390: 100; SPARC32: 100; SPARC64: 100; SuperH: 100/1000; UML: 100; v850: 24-100; x86-64: 1000.$Q9R.-a:84M;r嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA2、由于HZ的变化,原来的jiffies计数器很快就溢出了,引入了新的计数器jiffies_64嵌入式应用论坛$o;k;_0z(q#y3、#include 8B$I;R9u64 my_time = get_jiffies_64();9a$q:9O5E&u6F:e0嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA4、新的时间结构增加了纳秒成员变量嵌入式系统,linux,VxWorks,ARM,单片机)I;A)M89F-struct timespec current_kernel_time(void);0W0Z/#Zy&N$k嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA5、他的timer函数没变,新增6v,X+Q.J/p4A2J嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAvoid add_timer_on(struct timer_list *timer, int cpu);2#Z)M*E!f+|)U66、新增纳秒级延时函数-y+d*_6b5d7Y.H:f7W-t;H6G嵌入式应用论坛ndelay();8a1H+N/K8c;z4d/;B+7、POSIX clocks 参考kernel/posix-timers.c 嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAy4a1V,Z!V18E/-N6F z7K(b/Y.o4a/W18、 工作队列(workqueue)嵌入式系统,linux,VxWorks,ARM,单片机6g/d7C-|7r;.r$?+k6J,K&:m)R#C1、任务队列(task queue )接口函数都被取消,新增了workqueue接口函数嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA5v*N,Y2g r7K7xstruct workqueue_struct *create_workqueue(const char *name);3p.q+i2K/嵌入式系统,linux,VxWorks,ARM,单片机DECLARE_WORK(name, void (*function)(void *), void *data);(j:q+T8n8iINIT_WORK(struct work_struct *work,5Tww2Q/void (*function)(void *), void *data);嵌入式应用论坛)o!?$O(s%rPREPARE_WORK(struct work_struct *work,#?:w%X:y01Cvoid (*function)(void *), void *data);/G8W0t#-a%!9R+u2、申明struct work_struct结构嵌入式系统,linux,VxWorks,ARM,单片机&Yk5G6U2u#int queue_work(struct workqueue_struct *queue,嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAQ,Y0i-W;q2s3_struct work_struct *work);嵌入式系统|linux|ARM|单片机9w F6R/v$PPint queue_delayed_work(struct workqueue_struct *queue,嵌入式系统,linux,VxWorks,ARM,单片机(e,P2s/p#H$struct work_struct *work,7?(B%r7_.Q/U;V嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAunsigned long delay);&P2_$o T2G6|嵌入式应用论坛int cancel_delayed_work(struct work_struct *work);嵌入式系统,linux,VxWorks,ARM,单片机!oy,D-E%S%Y,ivoid flush_workqueue(struct workqueue_struct *queue);嵌入式应用论坛$S0p+4y)S;2O.f0-lvoid destroy_workqueue(struct workqueue_struct *queue);嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA6Gg#z1Y.G#k#Pint schedule_work(struct work_struct *work);3W/U-;U0W2o!k1b41z(h嵌入式应用论坛int schedule_delayed_work(struct work_struct *work, unsigned long delay); !u-:X9V.n1O;t%a*O:l$T5p;v:h-J8s_&S嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA19、 新增创建VFS的libfs.A00E3C8C*Ye&g嵌入式应用论坛嵌入式系统|linux|ARM|单片机.4j9 V3c(n x;M0Flibfs给创建一个新的文件系统提供了大量的API. b h7a%r$T+X8_主要是对struct file_system_type的实现。嵌入式系统,linux,VxWorks,ARM,单片机:B1e5t,o,?*q.Q*d7O5P/!参考源代码:8-79g!n4Z&Xk.z嵌入式应用论坛drivers/hotplug/pci_hotplug_core.c嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA0i _8K;$)W(Zdrivers/usb/core/inode.c!Xa,s8n9a0p/mdrivers/oprofile/#S!7e%_#K;EIfs/ramfs/inode.c-ct(r%js!x r/r L(b嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAfs/nfsd/nfsctl.c (simple_fill_super() example) -Npy)c);I2A嵌入式系统,linux,VxWorks,ARM,单片机6A$o8Q7t!F$T3s(Y嵌入式系统|linux|ARM|单片机20、 DMA的变化 $j9n5|;I4k7),e9I V+l$V未变化的有:g7E2Z%7qm2n1void *pci_alloc_consistent(struct pci_dev *dev, size_t size,X*V4J*f&O | a(H嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAdma_addr_t *dma_handle);3p+M-Av$P)xM嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAvoid pci_free_consistent(struct pci_dev *dev, size_t size,#F:S;w#l.nvoid *cpu_addr, dma_addr_t dma_handle);#m/_-|-L$V*v4q变化的有:+Q4Se*g4p-T4W1、 void *dma_alloc_coherent(struct device *dev, size_t size,!v15f!m4*Q1c*bdma_addr_t *dma_handle, int flag);24_2?#I1T6avoid dma_free_coherent(struct device *dev, size_t size,1,Y!?.I9x(e嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAvoid *cpu_addr, dma_addr_t dma_handle);v26z(t6g/C/Y嵌入式系统,linux,VxWorks,ARM,单片机2、列举了映射方向:8v8P A!E!benum dma_data_direction 嵌入式系统|linux|ARM|单片机-$.Q;f.d o+Z5BsDMA_BIDIRECTIONAL = 0,嵌入式系统|linux|ARM|单片机7R&x.A79y,v/Y1f,o2NCDMA_TO_DEVICE = 1,$k$m-?5m*l2Q嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGADMA_FROM_DEVICE = 2,-o$Z1$X8?3S!DDMA_NONE = 3,:s$E7a,x+R;嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA$K8e!u0C5j.z9X#l3、单映射5q:aZ6Ph1J)T1J%t嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAdma_addr_t dma_map_single(struct device *dev, void *addr,!E7F3j-H6t+!&r嵌入式应用论坛size_t size,嵌入式系统,linux,VxWorks,ARM,单片机;b-y,x!H%s$|/y*o(tenum dma_data_direction direction);K$L!B.F+F7D(n%R4M嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAvoid dma_unmap_single(struct device *dev, dma_addr_t dma_addr,嵌入式应用论坛9q/p5d$R*q(C.G-size_t size,(v%+W9S2S0U5k-e5Venum dma_data_direction direction);,I!B;K(E(kM7r!a;t嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA4、页面映射7B$I+p1_6C;k4M5Y嵌入式系统|linux|ARM|单片机dma_addr_t dma_map_page(struct device *dev, struct page *page,2M:A7JWv8v嵌入式系统,linux,VxWorks,ARM,单片机unsigned long offset, size_t size,嵌入式系统,linux,VxWorks,ARM,单片机-m6/t70R!6a3menum dma_data_direction direction);+L+V!J)v;O;C2void dma_unmap_page(struct device *dev, dma_addr_t dma_addr,0&e,G9g4f0嵌入式系统,linux,VxWorks,ARM,单片机size_t size,#y5M1D1D.f(c+G,A6p嵌入式系统,linux,VxWorks,ARM,单片机enum dma_data_direction direction);-Xn759A嵌入式应用论坛5、有关scatter/gather的函数:8j!o8z7.MQ;n0|-tint dma_map_sg(struct device *dev, struct scatterlist *sg,嵌入式系统,linux,VxWorks,ARM,单片机9V&6-S#(A#)z(M*kint nents, enum dma_data_direction direction);.E1w+F5 M7z-Q(void dma_unmap_sg(struct device *dev, struct scatterlist *sg,;a7g U&a5C,:R9v6u嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAint nhwentries, enum dma_data_direction direction);嵌入式应用论坛8p;p1w8n%E4W(h6、非一致性映射(Noncoherent DMA mappings)6K,NW&r0X8void *dma_alloc_noncoherent(struct device *dev, size_t size,嵌入式应用论坛6L,e&uy2D-n7Gdma_addr_t *dma_handle, int flag);7$I5f)F83h:J+V#fRvoid dma_sync_single_range(struct device *dev, dma_addr_t dma_handle,+t!) u3P5R,|unsigned long offset, size_t size,:np8X2*q,enum dma_data_direction direction);0i;xx k1R6lvoid dma_free_noncoherent(struct device *dev, size_t size,/f/5w)rS*q%k;X嵌入式系统,linux,VxWorks,ARM,单片机void *cpu_addr, dma_addr_t dma_handle);(j%?*K7s0I6Qv.d7、DAC (double address cycle):q$m:g4C/Dint pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask);嵌入式系统|linux|ARM|单片机3u#U8?*d8t%d$u-P:Pvoid pci_dac_dma_sync_single(struct pci_dev *dev,0H*R1V7y(l嵌入式系统,linux,VxWorks,ARM,单片机dma64_addr_t dma_addr,嵌入式应用论坛f%g8?%n:y(i+Esize_t len, int direction); :4_3Q:(x0f%g9Y&6B-u-z%D/O嵌入式系统,linux,VxWorks,ARM,单片机21、 互斥 4B$C:z5l8k$F3h嵌入式系统|linux|ARM|单片机7I#O*R(n6新增seqlock主要用于:0n0F%?!C(R2f(z0f嵌入式系统|linux|ARM|单片机1、少量的数据保护.A2f-,x*V8V.M)Z-V(e2、数据比较简单(没有指针),并且使用频率很高.$N.p0C3B6g-O3、对不产生任何副作用的数据的访问8xr)X:o/P:_嵌入式应用论坛4、访问时写者不被饿死#&.$p,aR6_o0s D(L$_?.Z0I-!M;dJ嵌入式系统,linux,VxWorks,ARM,单片机初始化$l:.c51T4Yseqlock_t lock1 = SEQLOCK_UNLOCKED;嵌入式应用论坛#Xh.S9j&%l,W$A.A8w或seqlock_t lock2; seqlock_init(&lock2);嵌入式系统|linux|ARM|单片机3E-y-h:8J void write_seqlock(seqlock_t *sl);!M!d Z Z7e%Vvoid write_sequnlock(seqlock_t *sl);+A;D3r3B(&v/U)D6m嵌入式系统,linux,VxWorks,ARM,单片机int write_tryseqlock(seqlock_t *sl);#F,|1e79,V($c)X$Lvoid write_seqlock_irqsave(seqlock_t *sl, long flags);7:C3n+p#D-A1I%N嵌入式系统,linux,VxWorks,ARM,单片机void write_sequnlock_irqrestore(seqlock_t *sl, long flags);*V(Y5i,-G(Svoid write_seqlock_irq(seqlock_t *sl);%Z1a%l/w,p:h)a9xvoid write_sequnlock_irq(s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论