|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
3 u% V2 L0 F2 l#include <linux/init.h>
7 U4 L: [2 J7 P2 U) L9 B8 r#include <linux/module.h>
8 G# J4 Y- Y3 G" V#include <linux/kernel.h>
3 L5 R. ?( G, V#include <linux/types.h>
+ U7 O, m4 a0 z3 G0 |#include <linux/gpio.h>
( n, D# B. {0 k4 u. W X/ r% ^0 \#include <linux/leds.h>: {" c4 `2 p3 t l
#include <linux/platform_device.h>+ _8 f; u9 G2 X! k- u
/ v. [8 ~7 \, |% _: D2 X3 C
#include <asm/mach-types.h>1 W6 Z; A% X: {7 e+ o6 \1 f
#include <asm/mach/arch.h>6 y: J6 a) @0 F) E, G
#include <mach/da8xx.h>. o; W5 Q0 C3 M4 B
#include <mach/mux.h>
# F5 J, C) j+ O
" r! x1 o* S J#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
8 G6 U6 R# M: I" q#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)1 x( l% I! t. d: W y. I
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)9 u# O; Y% ^' c2 n" |* L" T# W1 |$ ~
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
j/ Y8 w( Z, g
; B1 Z; D* v3 j( y/* assign the tl som board LED-GPIOs*/9 `# g& ^/ W! l x
static const short da850_evm_tl_user_led_pins[] = {
, T1 @1 x% D* f4 S+ y. z0 u9 q /* These pins are definition at <mach/mux.h> file */
% E- h- U. ~8 G" b0 U/ l3 Q DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
8 m6 B( k: J; ?" R -12 e5 e2 y( G. h. J% B' _
};. |* x! i: v; ]9 ]! p
# f" x6 j% O: }) Q& `; m4 f
static struct gpio_led da850_evm_tl_leds[] = {2 _% V0 d- k4 E# D! X
{
' C* ~. B" w" k; P1 I) \2 w7 B% _ .active_low = 0,
' @' i+ x# a0 L P .gpio = DA850_USER_LED0,) `/ l& J: @. k0 K# y _/ g; u
.name = "user_led0",8 R" J8 X+ w h3 `
.default_trigger = "default-on",
4 a0 l/ L% j, p2 k }," n G* i1 i6 ]
{
. h% b, `) D, r+ s2 u5 Q .active_low = 0,! O+ |( e) L! T- ]
.gpio = DA850_USER_LED1,
7 K7 E, P# H5 A1 h$ O7 m& r .name = "user_led1",
7 w- p% N: \ r* @/ S; _+ A .default_trigger = "default-on",
: K/ d( W& g7 d& i7 Z },0 s. [2 d3 b, R) e2 ?* b
{( N1 J* p* e" u/ C
.active_low = 0,
& i; {: o* f) [: a" q .gpio = DA850_USER_LED2,
5 l' R# j" I1 [4 v .name = "user_led2",
B6 Y- x' i, o |0 E .default_trigger = "default-on",
. C! N9 J# y' q1 M% i3 J4 S },
0 V) s. V0 g( \8 [ {
& t8 ^2 y0 U h" ^9 j) V: {3 _/ T( } .active_low = 0,7 K0 z$ U6 z1 L' @
.gpio = DA850_USER_LED3,
; r- O! v! E- Y7 P3 z3 i! l .name = "user_led3"," f: y) a: q& Q4 @, H* d
.default_trigger = "default-on",
2 E5 F, N" c+ t },
7 n2 S' d. U$ h};
. C1 |$ O# q& T; e( I ^& ~" I+ ]& ^0 {
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {. V# V7 z+ r& n# w" f: p1 b
.leds = da850_evm_tl_leds,
' P6 d9 S ~0 ]. d1 B .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
* x6 E4 b$ Q2 n! a v" T};
: S) B2 i+ n, {3 {
! {* Y8 I9 Y v, lstatic void led_dev_release(struct device *dev)
' Q1 d3 v- Y& U% Y+ U& ?3 B+ [{+ R3 y; g! S( l3 P. v
}; b1 L: U, s L
5 B2 J+ g r* I& a8 o% r# ^* E
static struct platform_device da850_evm_tl_leds_device = {
+ ?6 B+ c! R( {7 g .name = "leds-gpio",
( Y8 O4 F8 f0 T1 W0 J3 r; u1 k9 r1 Q2 b .id = 1,8 ~" _. k* P* o! s1 M7 L
.dev = {
1 l6 g$ k' w. L .platform_data = &da850_evm_tl_leds_pdata,) H3 P$ B" G$ P; X/ p
.release = led_dev_release,
( Y3 Z: A( U5 C u, T. Z. ^ }
1 F6 h- l* Y+ j& D$ q) V9 c};3 A- Q$ Q4 u/ V7 s$ Q& l
# N' P: l/ l5 R* Pstatic int __init led_platform_init(void)' }5 g' I: k! K7 L; G5 q4 F
{
" U' F! d; @, U9 M2 `: } int ret;
# V# P, M- |. J8 ^2 \#if 0
. T( o, m* L* u/ ^4 p/ t ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
8 f g5 ?! w+ n6 o* A2 j* r if (ret)7 y, ]/ b- y1 I1 q
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"- t4 Q1 ~4 A3 A, ^& S. \5 S3 c
"%d\n", ret);2 `. b) i6 i( K2 q
#endif/ a& {5 `. ]6 @9 l$ @
ret = platform_device_register(&da850_evm_tl_leds_device);! ~0 D& f) ^* O/ R9 D' { z
if (ret)0 [( w7 o/ J# W
pr_warning("Could not register som GPIO expander LEDS");6 D+ u7 ]4 t" L1 ], h$ z
else
& K7 X9 N% H d' h p printk(KERN_INFO "LED register sucessful!\n");
9 \$ p W: h' n0 v1 a
* P2 [$ l6 W8 ?& k return ret; l$ G' p! K$ A2 j$ p( P# ]. w
}' a" L2 m" L4 ? b
) M" `% a& F0 B4 c# q* ?static void __exit led_platform_exit(void): e! ^6 s/ G& [7 J5 r
{
* G: ~ }9 v0 j9 U+ M( }6 ^ platform_device_unregister(&da850_evm_tl_leds_device);& N k5 q- ]2 M8 ]' w
) S1 W8 a9 D: p
printk(KERN_INFO "LED unregister!\n");
0 x7 p" u2 L/ q: ~. P9 S}: V7 V+ S0 }/ m9 O
) k5 F' M* X* |- _8 d3 k
module_init(led_platform_init);
6 ]9 H: e! V% H+ Qmodule_exit(led_platform_exit);, l8 d0 ^# B2 U/ |" P7 Q
2 p' W" z2 \+ p9 y7 a: h# `% L" \2 S- n
MODULE_DESCRIPTION("Led platform driver");9 v9 B" ^# _$ E5 R7 Y& S
MODULE_AUTHOR("Tronlong");
2 ] J: P' Y7 y! R4 XMODULE_LICENSE("GPL");
: M( L% C6 t8 Q2 K2 \6 F$ m% a6 Z) {
|
|