|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
: q. e# x. w3 D. M#include <linux/init.h>
/ o1 I5 y$ \' g" W$ u2 ~& |#include <linux/module.h>7 @5 H$ A6 u. E) n, b
#include <linux/kernel.h>5 {' O" s: g. I5 o! P# a& i. Z
#include <linux/types.h>
4 w, T6 X7 r! |& `- b#include <linux/gpio.h>
( P6 k- n7 _/ U) n! z! ]! ?! u#include <linux/leds.h>( |$ X$ z/ r" Q8 X2 @
#include <linux/platform_device.h>& B) Z* ~; t8 s- ^
6 v, n- a8 C/ F( X0 W#include <asm/mach-types.h>
" ]2 W) V( q. z: f+ w#include <asm/mach/arch.h>
& @) F6 O. _2 o) |+ X* h* M4 F#include <mach/da8xx.h>$ @) y0 p8 J% b- _8 O8 f F$ g
#include <mach/mux.h>! Z5 S1 E4 A: ?
+ K5 J, K( \4 P4 J6 y) e$ u
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
4 q; e3 x1 G5 p# S7 H#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 P! s" d1 G: J& g#define DA850_USER_LED2 GPIO_TO_PIN(0, 1), J9 Z! I# u5 h: y" v
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)7 v9 Z, @3 [/ N* _
' a7 n- J3 d; k$ H1 E$ v/* assign the tl som board LED-GPIOs*/9 V) V! j' X. s) \; G9 l+ C
static const short da850_evm_tl_user_led_pins[] = {
! p+ r; @5 m4 g5 a' o) T /* These pins are definition at <mach/mux.h> file */; C7 P. |# j9 d4 i( D
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,3 _4 y1 e- i9 R" F8 \
-1 v" N. f0 _$ s
};
A0 _7 b1 Q0 j" A8 i9 \4 F4 C
6 k' C3 F6 v1 i+ O8 t, Hstatic struct gpio_led da850_evm_tl_leds[] = {* E6 { F, F. w5 ~6 d" r
{
+ M" _4 h0 F7 Q l; W( E .active_low = 0,
# W, j) D! p. L) b4 T .gpio = DA850_USER_LED0,
, e9 m, Q- e9 a3 H9 C .name = "user_led0",- R& s$ n2 Z$ U7 j. v
.default_trigger = "default-on",
6 G* l+ G q3 g5 n2 ]: L },
" _/ t, M1 g$ r0 @7 e' u {
1 h2 U3 W4 w4 N8 r- v7 _ .active_low = 0,: z7 x% |6 p4 A9 z: E- u/ v
.gpio = DA850_USER_LED1,
6 b5 |. P F5 H: a .name = "user_led1",
7 E+ W B: R: n( }( L* u .default_trigger = "default-on",
( f0 L. u% `% A( c2 `3 e5 | },- u' q9 N0 }9 f3 ~
{
1 {( o) C* r4 X7 H* \0 F, Q9 \ .active_low = 0,% A) P+ L+ O9 Y0 u
.gpio = DA850_USER_LED2,! D" b5 y! q% ?/ F7 n
.name = "user_led2",6 N0 G l2 T* D0 U3 ^3 J# {
.default_trigger = "default-on",( t/ ?$ b3 O1 t6 W' @ r. }/ g
},
q( i: W# K$ S- X0 N. {! D { r" l: D; x/ a- `& O: k- i
.active_low = 0,
8 u/ G& i! Z% j% O. M2 B* U .gpio = DA850_USER_LED3,
# w5 Q% n( Y0 h$ @, F" w .name = "user_led3",
" `4 q8 r7 ]7 ]: r9 q) p s .default_trigger = "default-on",
) y- o. ^" t* Y# f },- S2 h7 P; P% J6 M( p
};
( C. y1 S( c, S% D
" k; y( H: ~8 B( rstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {$ Y% s8 J2 F3 M1 F& T
.leds = da850_evm_tl_leds,
# D- Y4 i8 X& e, ~! L .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
4 G! w5 ?4 i* d3 E. t};. H, {4 Z3 S! ?2 G" ]- v
5 J0 @' N; i; ?, {/ {static void led_dev_release(struct device *dev)( _* k& x7 A* u2 T; @2 i: t
{; n9 B; e. a; Z A+ t' T
};0 Z+ O: ?, q2 G0 R) d
9 U$ c1 ?, ]: F/ f# U# o1 p
static struct platform_device da850_evm_tl_leds_device = {
7 D T; k4 S: n. ? .name = "leds-gpio",) q+ ^/ Y/ N1 b ~
.id = 1,0 V7 _% ]" X! B
.dev = {2 ^3 O4 y+ H- u6 `
.platform_data = &da850_evm_tl_leds_pdata,
* ^0 E, K' e# Q .release = led_dev_release,
+ L& H6 h) ]1 y- _" Q& |6 f! E }+ L) R8 Q3 V* l& u/ x6 T
};
I1 J# `9 m: I
y! U$ [( i4 R7 Mstatic int __init led_platform_init(void)( E2 h! h U G5 K/ B! h2 o# Y
{
3 S: P6 K" x5 q9 {# W3 A2 v9 |/ J int ret;5 H7 b- ~$ v4 p$ F5 [
#if 0
% Y! H' Z4 ?1 i2 e% q, {! @ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
9 ~; O _0 \: g8 _: b if (ret)
& _6 i- a. v- I# N6 d, y j pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
5 c9 [ T1 l/ }. j ?; a "%d\n", ret);
5 x; W A# e" Z! f7 d/ {) ^8 \#endif
! K4 O4 P7 i9 y8 x% b/ r ret = platform_device_register(&da850_evm_tl_leds_device);
6 c1 P5 O1 q# F: q) [: E) n if (ret)6 ~& B0 P" [6 @0 p' t. X! g9 ?: v
pr_warning("Could not register som GPIO expander LEDS");
# s7 x5 t* A1 |9 G9 |7 S else
* A4 d% b" _ Z! q printk(KERN_INFO "LED register sucessful!\n");
; U& D; Q* s/ ]
. O% C: i5 x" M# p- C return ret;0 O9 n. A3 b" J: m. \
}
* B0 Q, W( B% }2 m( C9 Z; R- H' l& q+ _7 Z* J
static void __exit led_platform_exit(void)" W2 B3 L! v2 k% P* \5 Y
{
- {/ ~. U O! ?) J, W platform_device_unregister(&da850_evm_tl_leds_device);
& W6 E1 x9 R+ S W9 `1 a$ M4 o8 ~4 @. M' L) L) T
printk(KERN_INFO "LED unregister!\n");
3 I7 S& b! g$ o}
6 I, ?# h3 V; A& C* a% R- I$ Q7 E" F! o3 s4 t
module_init(led_platform_init);
* R7 \1 W5 {! d3 {- T" X$ `+ s! Qmodule_exit(led_platform_exit);/ k, p) n$ s3 R% m9 e5 [7 K( \
. O+ l6 k1 s& T; y% kMODULE_DESCRIPTION("Led platform driver");
, U% g( U, i3 qMODULE_AUTHOR("Tronlong");2 C" N8 E# a- `2 {* n7 a
MODULE_LICENSE("GPL");
5 Y/ K8 e* m& }$ [
( q. G) f( P0 ~8 k4 I7 l" n |
|