|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
$ t! n2 \5 _/ _/ Q$ y# ~0 z#include <linux/init.h>
2 g+ R, c0 I5 q9 p#include <linux/module.h>
: [5 K3 |4 A" l' T0 T#include <linux/kernel.h>
, K V, X, F5 S$ `#include <linux/types.h>+ p; q) |1 n# U" {4 l
#include <linux/gpio.h>
/ L: e: q! C- v#include <linux/leds.h>2 x0 Q }6 g' o2 B, ^' Y- `% {
#include <linux/platform_device.h>
* Q! Q5 Y' Q4 v( U! D [* \" y+ N& q3 j5 c4 W7 G' j% T: E
#include <asm/mach-types.h>
" k( z! c3 ~9 w0 V#include <asm/mach/arch.h>5 w Z# {9 ^3 Q* u3 f$ W
#include <mach/da8xx.h>$ R, i( w3 v; z3 P
#include <mach/mux.h>9 `- E" ]/ |3 R# `2 r$ v: H5 v
) P: a( V+ N9 V& d3 G. D
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)1 b4 j* S6 A+ P; B4 v
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)% @2 j" ^) b/ e' v
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
1 j7 O' w# ]7 D& `- |" y#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
) S6 W# S2 {% J p: g5 w3 o
% k4 d5 Z* F) x$ {% u+ o `/* assign the tl som board LED-GPIOs*/7 u4 C, V8 X' P) z
static const short da850_evm_tl_user_led_pins[] = {
8 g' V2 B% C$ m1 f /* These pins are definition at <mach/mux.h> file */
+ f3 b/ K' t" P5 f DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,; u T$ i+ G5 w ~
-1) X1 Q P$ ^) T5 H9 G/ f6 g& e. C o
};# A! E! i, j6 S1 N+ x
: N4 n8 v w4 Z- ?3 B3 }static struct gpio_led da850_evm_tl_leds[] = {& ^7 S. i1 U8 R1 n) q" |
{
% G y+ }/ J' V. ~+ |3 s M1 F .active_low = 0,/ A0 C3 H6 z2 j z$ ?, g& M# N
.gpio = DA850_USER_LED0,4 F* w7 o1 ?1 {, b+ C: d$ s
.name = "user_led0",' c& d9 d3 {1 J) P( C1 p
.default_trigger = "default-on",
- Y; W+ X: c1 h },3 F7 X' b- H! }3 E7 x
{9 z- D3 z# L7 u8 w8 ]
.active_low = 0,
0 D$ I4 y4 f' W" u .gpio = DA850_USER_LED1,0 Z& @! }* @5 H' g
.name = "user_led1",! H: U! K6 b3 `4 I: |
.default_trigger = "default-on",
5 B" f( ~% I) i6 E },) k. F! o# f- q
{5 z! `# Q+ L% O X0 C& i
.active_low = 0,9 `7 H: V/ p' [
.gpio = DA850_USER_LED2,
: Z) J. `% P& a) K .name = "user_led2",' I. p2 p: f9 u0 S1 R
.default_trigger = "default-on",' i2 N5 p4 R2 b) r$ E
},$ C5 U3 ?) t# H* ]9 s
{6 p2 J; Y$ Y% Q$ w u& e
.active_low = 0, X2 D" |9 h, F% c7 y4 T
.gpio = DA850_USER_LED3,! [7 M L& w, W- P" ?
.name = "user_led3",9 E& y* m2 d7 u) S% q( m5 K2 C
.default_trigger = "default-on",; U( @# N3 D: f3 ^) I) z4 o2 n! T
},
) M/ V. t# s1 f2 r+ o+ i};# ^. a& w7 [' T# }, T2 a+ Z, O7 v
2 M$ z3 Z( w9 E9 `static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; P+ t+ P8 M- @/ m+ j, Q% d: C9 Y1 r .leds = da850_evm_tl_leds,
: {4 }* v0 f$ ^& P7 g' i" a+ ~' ~2 I .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
/ v+ {, U9 _ z; s/ M9 T};, v/ h! s# n/ P' D* M1 k
7 v, n! O! N- D$ Z& m
static void led_dev_release(struct device *dev)& b' y( Z; y2 {
{
3 p" \, o2 o# ^( L) ~& |5 W};
8 P, m% d- G* [9 _8 E! r
. d& v$ a1 C, V6 v5 \static struct platform_device da850_evm_tl_leds_device = {$ w+ \- Y: M' o g0 q
.name = "leds-gpio",# C$ F( R! _& H8 v
.id = 1,
N& a( y1 Q; b .dev = {
3 {2 n& z! S8 L5 Q) f( c .platform_data = &da850_evm_tl_leds_pdata,
( L8 B- H% N4 ? .release = led_dev_release,) O2 Z7 L4 V' j
}
9 a9 z9 |& I8 F5 |1 N};2 i* x$ a% t/ i9 h6 R
( L4 u7 w" Y0 p6 \' nstatic int __init led_platform_init(void)
d, S; J& D8 {. X{4 O8 `7 U( W& ]7 b
int ret;, K6 I; r1 @" W9 j( A! g( Y
#if 0
5 `7 ?' H% E5 H8 m6 Y ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
8 i% R0 O9 _0 m5 n$ P- C if (ret)- t1 i6 K7 I, x: _) X
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"" v% f+ I- d9 V% N
"%d\n", ret);* c, Q' t- G+ A: x
#endif
5 _" }/ Y* H { ret = platform_device_register(&da850_evm_tl_leds_device);/ B$ P' n' p' o# z/ @ q' q
if (ret)
' K' p" N) d+ i7 X9 i+ Y; {1 S9 u pr_warning("Could not register som GPIO expander LEDS");
# e5 s+ g6 q3 S' t" W* b else
* P0 k8 d5 t6 u( ^& a3 E printk(KERN_INFO "LED register sucessful!\n");
3 F1 K- l( m- R
9 t; D) i: a, M0 ^* i7 ]8 R: w return ret;/ B% R# f' S/ ^5 }. L
} V+ e/ \7 Q$ u% A% g
# C* f) n# F: d6 Gstatic void __exit led_platform_exit(void)
* m4 A' R( `% h! s+ V5 j4 c: A1 D{
: Z! Y% G( I% A; h platform_device_unregister(&da850_evm_tl_leds_device);6 p. K! e; j* i8 L! Q( I
; H/ ^5 A+ J, _* c x* e3 ^ printk(KERN_INFO "LED unregister!\n");
, S! f7 p& P) l0 H( }+ C- x Y}# ?: {- I7 P; P; M( u
/ k; a7 S, P$ F' a& v9 q ~) t( i
module_init(led_platform_init);$ D! d8 ] w5 \4 P! j) h7 H% [
module_exit(led_platform_exit);
5 r+ L' n- y" ]4 v& ^$ N% q) P& y) k. B( q$ x: |- ^" I- ~& c& Y" e! U( Z
MODULE_DESCRIPTION("Led platform driver");/ S$ b! |, S# G( B$ w8 A) a
MODULE_AUTHOR("Tronlong");
/ e' l9 ^2 T5 T, Z) S; P# DMODULE_LICENSE("GPL");8 w- Y' R6 y- a
1 J" Q( B" d/ M! T1 c# z |
|