找回密码
 注册
关于网站域名变更的通知
查看: 245|回复: 1
打印 上一主题 下一主题

linux字符驱动之自动创建设备节点

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-26 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
问:能不能让系统自动创建设备节点?
" F. I% t0 V) j  W" h/ E3 f7 N$ V7 d
答:可以,linux有udev、mdev的机制,而我们的ARM开发板上移植的busybox有mdev机制,那么就使用mdev机制来自动创建设备节点。
# _2 M2 L0 ^( N$ o3 f" u) E3 W+ |" k! V
问:文件系统里,在哪里设置了mdev机制?2 e+ `/ B0 Z$ n6 h5 Q  ]; Q
: S& Y6 T4 ?! \$ h: E) Z
答:在etc/init.d/rcS文件里有一句:
9 ~/ Y# s- s0 q' I2 X9 s
) K" f( E+ M/ Y0 k! becho /sbin/mdev > /proc/sys/kernel/hotplug
" m2 `: X& z( ]2 q$ O' o' L* v+ V, Z5 M) ]7 [7 d% I  S
问:在驱动程序里面如何编写程序,让系统自动创建设备节点?
3 ~# {" W' U, B* E# c" L: }
# }* D0 R% C: a% G, E( t答:首先创建一个class类,然后在class类下,创建一个class_device,即类下面创建类的设备。  Y8 h' J, @, G( ]8 S; v  H

$ Q# [; m$ n) G/ X0 l
6 y, a  q: U: ]6 j- B  B% a
7 G! W, C/ s' {4 @9 H- J详细请参考驱动源码:! P/ ?9 n! `$ ?

; s2 G2 @: R& {. n2 P6 M
6 J0 B9 p& |1 T. Z) \4 h% E#include <linux/kernel.h>
/ d+ k' `0 ]4 Z0 R2 w3 W#include <linux/fs.h>* {! L1 B! p& C* t/ u
#include <linux/init.h>' _9 `% n8 X7 F5 v. n
#include <linux/delay.h>6 [5 ^- E! Y& g9 h3 j$ `
#include <asm/uaccess.h>
8 V. G. G& P. y- }  I0 @#include <asm/irq.h>. d  u0 _3 z0 Z& h
#include <asm/io.h>) D% k9 U! F. Y* d4 W
#include <linux/module.h>- y( s9 b7 G0 D$ ^5 i. F
#include <linux/device.h>         //class_create4 i6 h! Y7 j0 Z

2 T/ U: c: `. nstatic struct class *firstdrv_class;
, m# G+ k  v+ Z6 a5 l' tstatic struct device *firstdrv_device;
& r. h/ Z3 O  _* _- k, i, m1 p+ w( }) [, s. M
int major;
: o5 ]+ o/ x/ m3 ?3 D0 ?/ Ystatic int first_drv_open(struct inode * inode, struct file * filp)
3 b' {* [6 A( V6 o7 f2 }{. |8 ]; m# F% X  g5 R( t" c
        printk("first_drv_open\n");& |0 r8 |7 q. L- a& M
        return 0;
) K6 _! J+ B+ F  o, H" _}% y' x0 ]2 F1 {
static int first_drv_write(struct file * file, const char __user * buffer, size_t count, loff_t * ppos)$ `% {2 p/ p; N2 Z  P; Z7 Q- W
{
" _( g: d% \: t        printk("first_drv_write\n");2 Y1 V% a; A, K, q4 T5 }' Y% m
        return 0;
# Q: \6 V2 X- H0 ]  J}
+ P! i0 S" `+ [4 A/ I- E1 j
( N) [. y& @4 X/ O, e2 J, p* z/* File operations struct for character device */
4 G- x2 s! Y$ x8 ?: X' Qstatic const struct file_operations first_drv_fops = {) T1 M7 G  Y" D
        .owner                = THIS_MODULE,+ @- k' z$ |1 U* t# n! j  N1 l
        .open                = first_drv_open,
7 O- y1 L) W; L! @! u! D( _        .write      = first_drv_write,9 A3 _; ~/ p7 x8 {
};" Y( v3 E6 ^3 L* ^8 n. E1 R
8 G6 T$ l5 z) L2 N+ s; r# T
/* 驱动入口函数 */* q& Q5 Z- Q5 G* V
static int first_drv_init(void)& W, D3 f" x8 r3 ?% H
{
# C  |2 V7 P0 H" Q' ^9 m& w        /* 主设备号设置为0表示由系统自动分配主设备号 */8 w/ P4 z) A5 X, J: i4 t. ?
        major = register_chrdev(0, "first_drv", &first_drv_fops);
; V- R3 T2 i" x) e# G+ F% V/ }* E; v. T; m4 G. }
        /* 创建firstdrv类 */& m6 _7 A2 B: z% E9 y* U& [
        firstdrv_class = class_create(THIS_MODULE, "firstdrv");5 i( z6 j  m3 X% Y; r! |

8 r2 e; c; a0 y( {: f# ]/ C        /* 在firstdrv类下创建xxx设备,供应用程序打开设备*/
) @  b0 A2 L# G  W        firstdrv_device = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xxx");
* f2 h2 {1 o+ Q; B        return 0;+ ?* w% `8 n1 a3 e0 `. n9 H( u
}
: V1 J% N+ i) i/ S& n8 ^1 j, ]; r- s% C" v/ H
/* 驱动出口函数 */" K, V! G9 m. K4 r( n8 N
static void first_drv_exit(void)
2 k' o/ J/ q0 a{! t: i5 d# c, X
        unregister_chrdev(major, "first_drv");
6 |+ x8 X# E5 x- E9 n* A+ O        device_unregister(firstdrv_device);  //卸载类下的设备& G" n+ T* p5 h- H4 F1 }1 H
        class_destroy(firstdrv_class);                //卸载类
# R# a6 p& g2 W: l! b3 C& ?; |}
) y3 Z. x% o9 t9 D* V1 q  \) _7 Y# O7 T5 b- W4 @" K
module_init(first_drv_init);  //用于修饰入口函数) c# ]) a1 }; E: A! t
module_exit(first_drv_exit);  //用于修饰出口函数        9 d' r# g1 U2 @" |; ^$ W
2 i$ C# U, Q; Y
MODULE_AUTHOR("LWJ");9 f# h  `7 U5 a; q
MODULE_DESCRIPTION("Just for Demon");
, P' l9 G$ |' o: F5 e2 BMODULE_LICENSE("GPL");  //遵循GPL协议
2 j4 z4 M4 p+ ]
  F; W$ G* G0 z; B0 b2 |) p' p* z+ W; _: c6 U! v3 I/ c% l
注意事项:
+ |% P' j, Q; F4 Y; q6 p7 N% {1.因韦老师使用的linux版本跟我使用的linux版本不一致,头文件路径可能有所变动。
# Y: X2 {+ d+ f/ \
# S3 J2 e2 Q6 v# M: }8 Q$ R8 k2.使用的函数名可能也不一样,例如:  j3 o* B0 U3 n  L
8 ]; T/ B2 V) b; u! \, M5 R- P
韦老师是这样子创建类和创建类的设备:2 a  h8 `2 C# H* h4 I

' X9 h- ]4 a1 Y. S" J' @一、定义. ~& f+ u( w, [) V+ n

$ T0 f5 o; o, bstatic struct class *firstdrv_class;
% I5 y; b1 u6 ostatic struct class_device *firstdrv_class_dev;' \& \- h- I* ~7 u  `, J
  ^- g4 y" L" d; |: k
二、入口函数里
3 a  t1 [9 J% D$ ^6 g% F* R+ T; d3 p3 y
firstdrv_class = class_create(THIS_MODULE, "firstdrv");3 x5 z1 D3 I; ^) q% V
firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */
: m8 g1 N9 ]) E: y* j6 Y# W
- v0 o1 `, L. x- x' p三、出口函数里3 `9 L, c! f- u: H) [
; k- _' C8 @+ j# x& y4 v
class_device_unregister(firstdrv_class_dev);/ c/ N! C! D& ?
class_destroy(firstdrv_class);& s3 Q1 G6 |# E: X( `) j$ L- X
- Y9 R/ D) g) @5 Z: c. H- D

* R: }" D. c1 ?
' k3 s. |2 {3 M. G1 q* Y而在linux2.6.30.4里,并没有class_device_create和class_device_unregister函数
9 r( _7 k) N. P
# ?; r1 `. {! G& B2 Z我是这样子创建类和创建类的设备:
4 Y2 U) z( u( Q3 R+ k% ?7 z9 a. K; {  u+ n! I
一、定义7 p, ?+ Q& k2 v! b

6 v: @+ [' [: r9 k$ Gstatic struct class *firstdrv_class;! \+ [" ^' `  h  U
static struct device *firstdrv_device;
) t8 d+ z; G! C& _- d7 X- C4 b" J
二、入口函数里
7 S$ m- u0 H# M1 A! P$ J; G2 w7 H! s1 @9 [
/* 创建firstdrv类 */
. b+ z9 o" S" R" ?1 V% {& ]6 I1 F+ ^9 \0 i
firstdrv_class = class_create(THIS_MODULE, "firstdrv");6 x" b1 H: q% `7 }7 T
; z0 q8 o8 ]+ m
: V9 D) p6 M0 W8 v  K  @
/* 在firstdrv类下创建xxx设备,供应用程序打开设备*/
7 B# z& P. B7 afirstdrv_device = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xxx");  ]7 u& I7 R9 O1 H% S# `

4 g! |' r) n- V- n1 H三、出口函数里! c- \7 C! j- z0 E# A0 F$ C6 j
9 f* p% J, v& v3 w
device_unregister(firstdrv_device);  //卸载类下的设备
9 L. }) z3 m% b) z# hclass_destroy(firstdrv_class); //卸载类
: m) _$ C* M3 p6 g% T0 `0 m5 @% f, N8 S3 P" N; n6 ?1 {/ Y
( ^3 d2 r* U% S' }2 I
1 d8 t& m. t+ Y5 c, z
linux2.6.30.4使用device_create函数替代class_device_create函数;% Y# u. [1 V* K' W$ F

& i, z9 U7 K0 g& y0 w& o0 ]7 q使用device_unregister函数替代class_device_unregister函数。  q8 b7 t5 S- g) k- t% [! K

3 |1 N: ^+ b. Y; X; G, a3 U" {( k1 J0 T% l" `  N: b& t9 d  a

# T) G  H; \+ I! K3 Q/ z测试程序和Makefile没有修改。& d& x5 I3 F* J/ j& p8 ]

8 K' O: v5 K1 F) I7 k4 `# w* X; `) S. J/ O& F; Y$ C
测试步骤:4 z. G- N( D  Z  f+ s2 L

' c7 L. [+ i7 ]3 j! ~* D/ @! |8 u7 Y6 y
[WJ2440]# ls
4 `0 L' R) f; M- ?4 g' sQt            driver_test   lib           root          udisk# o. K. a; T% y" i1 j! A! E
TQLedtest     etc           linuxrc       sbin          usr5 ~9 M- Y0 x' i3 P2 p  q
app_test      first_drv.ko  mnt           sddisk        var
4 B6 E  i9 i7 k# Obin           first_test    opt           sys           web6 q4 L/ v, @! V, W
dev           home          proc          tmp
2 }! r' I) O) S! n2 P[WJ2440]# ls -l /dev/xxx
( e4 I3 L6 L( Jls: /dev/xxx: No such file or directory
3 N! z% v4 g" c, F% c) U5 s[WJ2440]# insmod first_drv.ko - A0 k, l1 w! ]1 e* t& S
[WJ2440]# lsmod" Y: O5 C7 z) b2 U/ U* ]- `
first_drv 1912 0 - Live 0xbf000000
! f9 v. K3 d' s[WJ2440]# ls -l /dev/xxx
  z; s1 o/ ?3 W8 Tcrw-rw----    1 root     root      252,   0 Jan  1 23:17 /dev/xxx
: ]4 ]! e$ f7 j0 ^0 y) D[WJ2440]# cat proc/devices # G2 H7 I: ]( Q% _
Character devices:
1 a  y+ t' y6 U$ ?: w6 r  1 mem& u* }' ?2 Q, U
  4 /dev/vc/0' I, U: S& d. q# V% ~
  4 tty* u9 E  C+ v+ E4 t) j4 \
  5 /dev/tty
9 [+ t% u- ~' A: W" R  5 /dev/console" m3 c; I/ q1 g
  5 /dev/ptmx
5 {. W, A/ u! N2 W3 G- D  @6 i  7 vcs
2 S% n2 E% P& b% c' ~* ?9 e 10 misc# d. l5 z$ Q! H
13 input+ r( d% y/ _2 N1 X
14 sound2 S0 s$ C8 |' p* @0 }3 O
29 fb, r- M* }8 G. x% W. }0 V0 B0 P
81 video4linux
1 q9 g! G: C( X 89 i2c3 `& U6 F9 e/ F+ E+ u9 W
90 mtd
. K# m6 C! Q- s! ]3 n' k116 alsa4 X" d0 t. f0 H: C. z' C2 P$ R: a) g
128 ptm
7 q$ Q5 V! a/ s, c. M136 pts
4 H0 o) N* t2 |180 usb
0 i8 Z2 x# q) k188 ttyUSB5 B5 e+ L- ?2 U% N7 _8 ]
189 usb_device
4 M2 C$ N9 P6 _4 b- v, ?- F! ]5 G204 tq2440_serial1 M: {: }2 \6 m! b6 L% `
252 first_drv
4 ~/ j" a9 \/ M0 w0 i: ^253 usb_endpoint
8 a9 v6 R$ z+ z5 v# u" c, s3 {254 rtc5 w8 G/ z* m( v9 C% d) r% s
" o- |; N& f8 @1 A( @0 f1 a
Block devices:
& A7 x# l4 e( b. H0 m259 blkext
& b) w# I! B7 G7 {( L% Q% R  7 loop7 G+ Q  l5 z  H  b
  8 sd! I: |3 r! {6 Q; \$ |+ o0 C
31 mtdblock
7 B: ^8 v/ ^; ]2 D! } 65 sd
8 q  {" O: c: w1 l 66 sd4 z; R# B# {7 Y1 |* ?! F4 A' E
67 sd
* j: P( ?9 K  t3 N' |2 S* H 68 sd
" I( D: U! H, m9 M6 E0 H 69 sd, L7 l" r: f& f6 S' \# W6 Z5 q7 Q
70 sd5 i! q, D* A; n' Y; O- J
71 sd* K7 l' C- E7 _
128 sd
$ V2 E3 \1 w+ H) {129 sd
9 h& B6 q! d+ v( W1 T130 sd0 U  ~- q6 E; c4 Q& e- k
131 sd
/ k2 R/ J7 ~. K1 q8 w+ i$ N132 sd. B+ y9 U) ?2 C8 k  D
133 sd" h* x. b$ }2 ~/ x7 q+ F: P: ?
134 sd8 x! h* ?( X: G9 i" A  h5 D* [
135 sd
4 `4 L7 {" A  q( g( x179 mmc
# {8 H1 Q8 I( w* T[WJ2440]# cd /sys/class/
2 N' o. b/ d9 P( e% ~5 ]2 M# V[WJ2440]# ls, M% F  z( n0 `3 Z) e$ w  f/ B0 Z. S
bdi           i2c-adapter   misc          scsi_device   usb_endpoint  [- y. u  ?' S6 l; ]8 p, X
block         i2c-dev       mmc_host      scsi_disk     usb_host# p/ N+ ^2 q% j- E7 t
firmware      ieee80211     mtd           scsi_host     vc
1 J  n: u0 M  h. A& K1 ?firstdrv      input         net           sound         video4linux+ H+ N, X" V5 J, Y, i5 c( P, K
graphics      mem           rtc           tty           vtconsole( o2 b' s# Q* k
[WJ2440]# cd firstdrv/
& f4 g' w' D& R3 q- n[WJ2440]# ls
! i* _" z% L5 M+ Hxxx, X! D4 S6 l- {" P; I
[WJ2440]# cd xxx/$ u* ]0 j' S! q* ~! \
[WJ2440]# ls " ?, S8 _; k. S/ i; b1 k
dev        subsystem  uevent
* \* X! |+ P  K1 _3 D[WJ2440]# cat dev
; ]" v2 V! b2 D# V! W9 K' }, q252:0
1 }* D, X4 L' W& j! J: t- ?- W) e[WJ2440]# cat uevent ) ]( v, H% R0 n6 N
MAJOR=252
! d9 u5 ^2 \) L# h# B8 A- BMINOR=0
7 O& d% Y6 v0 ~) ?3 _7 M# O[WJ2440]# cd /   8 U1 e' n% {" ~! q% X
[WJ2440]# ./first_test
; v+ B* r+ a$ S! B6 o0 r7 Hfirst_drv_open! X& P) H+ @2 g# A! t0 j
first_drv_write
# ^! }9 [4 V) G[WJ2440]# / s; u4 w$ |. }9 i! y" M. W9 q
1 J6 M4 J& \. I9 @4 G( B
7 Y: l- V0 g3 ^) }" `
7 O/ Z, {9 V6 m8 Y0 m) W

9 R) \# @& l/ q& o  g

该用户从未签到

2#
发表于 2020-4-26 14:09 | 只看该作者
linux字符驱动之自动创建设备节点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-26 12:41 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表