|
|
求大神给下面的程序做注解,请稍详细些,谢谢。* Q0 s' e0 z$ r: {
#include <linux/init.h>
2 }, f) `" C/ S% r. {2 X/ v- f#include <linux/module.h>
1 \: e: X) ^! v; M% Q1 r; r#include <linux/kernel.h>% ^- H) }$ W' t$ s4 W
#include <linux/types.h>
: T6 v* ?5 v! N* s#include <linux/gpio.h>- D3 b; G4 W' I; g, K9 n/ c x# r+ ~
#include <linux/leds.h>
2 s& I/ n6 f5 [! M ^#include <linux/platform_device.h>
9 R% l) z; m8 S# w0 a4 \& {3 D. v8 J1 @$ \# t/ `) e) B
#include <asm/mach-types.h>
3 P2 o. E8 N. \9 N) T#include <asm/mach/arch.h>
" C6 d1 |3 E* R" j1 ^ U7 `#include <mach/da8xx.h> \4 B) |; o/ i9 { k
#include <mach/mux.h>% c7 V7 C4 @ s, j
/ s8 }" A( O! D#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)+ R: D' n8 x. t$ w6 J' D3 Q I
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
- |" f# e; c& m5 Q$ @2 ^#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
/ Z/ g+ X7 Z I#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
2 g: w, i5 G! @% W7 S
' h0 p+ A8 {, M' C/* assign the tl som board LED-GPIOs*/
' J5 U, S; U; Istatic const short da850_evm_tl_user_led_pins[] = {
- }* _* T& K' K6 O" Z: @! W( y /* These pins are definition at <mach/mux.h> file */
! Q$ n* g" ~. j$ @) P$ u DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,( ?% _& I7 F. l9 R( d, h1 S
-1/ ^7 z# r4 P# q( X; v7 ]# L
};
- M- D( _% z+ j
/ w+ n* J$ D1 w$ C: I, } Pstatic struct gpio_led da850_evm_tl_leds[] = {3 d' e/ u. `7 G" b7 s' ^+ P2 F; b2 T
{+ u, p: N' b' N. N
.active_low = 0,
. i, r( j4 `% R. S9 j. n" P @! [ .gpio = DA850_USER_LED0,
5 L1 a! N8 [- {* @3 c8 D& A- s .name = "user_led0",
, e! L, @, W$ i* Z5 `# ]2 g8 ~ .default_trigger = "default-on",
: @0 d$ G6 b! w+ i) f# N },
" I8 c* i) ?1 ]2 D7 Y {
7 y/ r2 L* t+ U# D. ?6 d7 E$ T% V$ ~ .active_low = 0,
k% h4 d* |- ^/ E& R3 h .gpio = DA850_USER_LED1,
; B3 y E. X( z# S1 g .name = "user_led1",# a% v: `+ G9 M
.default_trigger = "default-on",
& J9 t+ L8 p# n! T: h },
% U9 X% ]) ~' ~! W0 U' K {
5 W6 _; A% w; f. P! O0 E7 F0 t, k .active_low = 0,- b/ t, \1 Q4 P) x( a1 _0 ]# { P
.gpio = DA850_USER_LED2,$ |; l1 J! m) M+ h- i
.name = "user_led2",
8 }( c) }* J) ?! t/ r/ Z .default_trigger = "default-on",# M; T( ?% m! f: z' W( V' _
},
2 G" B3 K. t. w4 u' ~4 @% c- H1 J3 l {
/ ?' Z7 u5 ~) v/ y5 G7 O: d .active_low = 0,
1 G9 `% a3 @6 n0 ? .gpio = DA850_USER_LED3,4 y+ c# _2 g0 _4 a0 E( X
.name = "user_led3",- d6 j8 S! A4 _2 M) h4 H
.default_trigger = "default-on", c+ S6 I8 s, u! u* m7 ?
},- g: ^) q' v6 ]" e
};
. T# M& ^( ?: l$ n& _
7 G* p6 v1 }; M( Q* q: V: E2 qstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {0 Q3 L x' I( Q, |( b
.leds = da850_evm_tl_leds,
9 l! W1 l( m' ?! W, f! ?" h6 p2 p .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
! g+ Y6 b/ e# S* \+ H I$ @};8 d$ o c4 Z* V# {; g
" M( A' P) x3 ]: i
static void led_dev_release(struct device *dev)# n. i9 `) i% j. d' |- q
{
/ _8 \: t; F& p' u) j7 ?};
, [# `! l! {& H: i' X$ N0 i3 [! S7 P: g, ^
static struct platform_device da850_evm_tl_leds_device = {
7 U: Z3 k. S+ m .name = "leds-gpio",: Z# d" w4 ]( Z2 D2 v4 X
.id = 1,& i% f* D; [. ?. N t3 V
.dev = {
/ ~8 t T" u, P( Q6 H7 u4 R& s9 ? .platform_data = &da850_evm_tl_leds_pdata,! d* M+ M0 F9 @1 {! g' M5 e3 s% q
.release = led_dev_release,
. h0 ~0 A* Y3 i/ {% u e }' s4 f: m4 U! W. v
};8 ^1 a1 p( i; J) I- y- k
9 z" t: E, F, d! Rstatic int __init led_platform_init(void)6 ]+ P. I4 j. r+ i& F, P) H( g
{: v9 ^( V( }& a& S2 `" f& x/ J- [! X
int ret;' g. u4 J$ Q; r3 S+ `
#if 0 ]( Y! g, Q% W/ G6 r! N
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
/ c2 [. i8 H1 V9 J) A% K if (ret)& T$ V" _' ?7 e/ S
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"6 q) F, Y5 r( |; ^1 d
"%d\n", ret);
/ f3 n4 [/ {8 @1 A) ^#endif
) g3 q+ f9 p' L0 k* K* o ret = platform_device_register(&da850_evm_tl_leds_device);) @0 a9 U% i- {- v0 P# m
if (ret)' m8 x, [0 |9 p0 i
pr_warning("Could not register som GPIO expander LEDS");8 }" g4 u1 T$ `+ G8 j* r
else1 [% K& C F5 K6 J
printk(KERN_INFO "LED register sucessful!\n");
* `$ D ~# H' e* ]( Z! Y
- o" h1 u5 j' [( R& T6 N$ K, [ return ret;/ X( {, v9 g# b$ Y; P7 T3 b
}
8 s0 m' V, ^8 L9 k- j
0 @+ W) z8 b, A# L/ ]4 c+ wstatic void __exit led_platform_exit(void)8 B/ ?; G) s8 [; X0 J
{ Q( O6 F) v* l. |( D
platform_device_unregister(&da850_evm_tl_leds_device);
6 W( d7 Y2 E, t
7 ]3 ~$ w- n6 s1 C4 i5 u" i printk(KERN_INFO "LED unregister!\n");
" k: n+ F, R1 v$ W. B7 {$ C}* t! U+ P, H% z% Y* l
. j# z8 M0 G; l- g
module_init(led_platform_init);
8 w# I3 V9 g0 g; wmodule_exit(led_platform_exit);
* B% [8 O9 p0 j9 ~2 ~5 m' c( I6 O8 i+ Q' J0 n& p
MODULE_DESCRIPTION("Led platform driver");& Y2 A8 B/ V% l2 t
MODULE_AUTHOR("Tronlong");1 R- [& \, \6 c% f+ ?* W" q
MODULE_LICENSE("GPL");5 w" P! }% B! E. n8 V+ T1 S2 x L
, P, G1 R/ D) J Q" U) `* j& B9 H2 } |
|