|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
) x1 x- d2 p; y) v, j# ?#include <linux/init.h>
& Q6 u# S) k& {+ ?#include <linux/module.h>
6 U3 ]7 R! r5 ~ Z#include <linux/kernel.h>
# b7 G. H, R# M/ l/ J#include <linux/types.h>4 O/ c& F0 Q% k. R# K* V6 U! U
#include <linux/gpio.h>
V( o2 k7 M% `% m! A#include <linux/leds.h>
1 y, @9 \& ~4 I2 o$ a) o& J- `$ c#include <linux/platform_device.h>
]0 Z) O1 X2 e! {, d+ d- w# j3 ^/ E
" A% s4 N# Y+ i$ g/ \+ S#include <asm/mach-types.h>7 u* Y. F: q" E. B) R7 R$ _
#include <asm/mach/arch.h>3 y5 r. `1 i7 e7 x( N" S" ~) H
#include <mach/da8xx.h>
/ W; j! m5 s9 S#include <mach/mux.h>/ d" V% V, V: Y- r- k9 h
% H8 t4 W* Q# c, c8 Y3 H
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)) w- Z, Z% w! t1 N# S' f- ]) m
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)6 y" C# \! h; C W t4 p* E
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
( B1 v( d: z# T2 }) P#define DA850_USER_LED3 GPIO_TO_PIN(0, 2) A& D% K" d; F" O
4 G; U$ p/ y& o
/* assign the tl som board LED-GPIOs*/4 I0 p2 I7 x2 f! R$ c3 Z0 U# i6 ^' V+ k
static const short da850_evm_tl_user_led_pins[] = {
2 U$ P4 ?9 t) V! X2 L }6 b2 s3 Z /* These pins are definition at <mach/mux.h> file */
& A1 r# Y5 q1 o7 Q& y, B DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
8 v+ f3 e5 D: k. Q -1
" Q2 l! [6 n; b9 |; W$ [};
6 X7 u x/ @4 j- E) R- T
/ h0 p2 X$ o0 I* L$ u1 u+ |6 h) @static struct gpio_led da850_evm_tl_leds[] = {, e; c- _( S0 ?. }4 ^: U3 k
{: O* k, f7 p! x2 [( ~2 J
.active_low = 0,* K; P/ A* r: S6 O/ f
.gpio = DA850_USER_LED0,; t0 D* A% ]$ s/ ~# c: p
.name = "user_led0",- }" {7 x' e9 n5 B
.default_trigger = "default-on",
8 f) G1 x- ~2 W0 N }6 q },
. Z( @1 X7 R0 l- N( k& a$ o: f {
) x1 O: U2 e, z$ ?& N4 |; W7 u .active_low = 0,' }/ _, s! q2 m& c0 B
.gpio = DA850_USER_LED1,
0 ], y2 Z3 N0 ?+ u! @; R; Z .name = "user_led1",3 r! Y: V, N9 N) W. q6 u P
.default_trigger = "default-on",
& c) p' ` K9 {5 U; p; v },: O1 J; Y9 o. Z) A* S& d1 R0 o
{ @* U6 f2 D- S" K+ e# M' D
.active_low = 0,& m9 s' y- R \3 ^% r- B
.gpio = DA850_USER_LED2,$ s' }3 Y. {, u. c
.name = "user_led2",) U1 `% ]7 g- x+ w+ b+ V3 {
.default_trigger = "default-on",/ U+ K, G/ o6 M& p% f8 x8 P
},7 e1 ^2 m4 O- u9 R! a0 K; t
{. R$ Z* a0 i) ?3 ^9 P2 f- M
.active_low = 0,( r! b# i! q. `( O
.gpio = DA850_USER_LED3,! i( {) F9 G$ x1 I% O0 ]
.name = "user_led3",) h) K" o' e9 @( B5 N# F6 X# E
.default_trigger = "default-on",
0 E C' u! W9 g8 i. f },4 Z! v* S: v1 B
};
u0 M% D0 @4 e; q; A" k7 m3 {1 u9 Z. z8 ^; m
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {" c( c- @8 t/ {. V
.leds = da850_evm_tl_leds,, S Z- w4 |( S1 f+ Z7 ?
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),7 Y, P. t% K& s, U9 @4 J
};
/ R" w3 T3 r; h& A' u; F$ i. C3 d" V% Z2 j) Y
static void led_dev_release(struct device *dev)+ h o* Y% O+ E8 `8 p" ^
{
( h: w. {- s: k. @, o( @};
4 X& G7 ^0 g: i9 H" z2 l
8 T* T( Y) ~ g4 H a% lstatic struct platform_device da850_evm_tl_leds_device = {
$ S6 f; J: z. H' h .name = "leds-gpio",
6 \9 ?5 c0 i5 K* |8 r- J- G6 g .id = 1,
0 A! s" t, q: r1 S6 Y .dev = {
; a* U8 ` L& C) _. N. v .platform_data = &da850_evm_tl_leds_pdata,
! Q; L8 s5 k' u: N0 N2 }& {' h .release = led_dev_release,* f" m! H2 B' _! b
}
( R* H: R$ E8 V; T6 j; M/ p};
9 S) a: Y9 L- f& H; w4 b0 }. S
: G; v. b0 b \; V t" u% g- nstatic int __init led_platform_init(void)
# ~: u0 f/ b. }( Q0 ?4 t. B) u{' B" s) A3 W0 X: Z5 a
int ret;
: t: `. f3 R: X& ?, e#if 0
# q1 y) `- M' B$ y# T7 V3 i e0 D4 B ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);9 B( Q% L1 p8 O* d& [3 i4 U
if (ret)
3 E% H9 j( r- t% C pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
' u& j( o: r/ Z3 R "%d\n", ret);
% X" {$ N0 G: @) N% Y5 m#endif8 T, D9 O" D4 |' R Q8 U: y
ret = platform_device_register(&da850_evm_tl_leds_device);8 q: E( s0 _) {$ b) U+ N
if (ret)
# ~7 z0 f/ ?3 Q1 B; n pr_warning("Could not register som GPIO expander LEDS");
1 {# F* C1 x/ }9 N4 e. ^ else
8 \0 }3 g3 E* [( z7 ~ printk(KERN_INFO "LED register sucessful!\n");
% ]8 n3 o8 o7 v% J: Q7 C+ V9 s0 E" N# s# ? u$ A* v+ b
return ret;
: b4 ~6 k1 |; f6 E2 I}
; Z+ h* u* J1 E: E$ V: _3 d
- b. ]8 L- E% C$ U) E6 pstatic void __exit led_platform_exit(void)
* o8 E! Q2 o) t{
3 F9 O: P. V& N( W# W# ^ platform_device_unregister(&da850_evm_tl_leds_device);5 [: W7 D5 G' @) R) b
' l& H$ c# |1 p printk(KERN_INFO "LED unregister!\n");
! L4 I2 H2 d6 N: `3 ^}+ m3 J1 Y9 H: c" o
+ ^ ~/ h: p4 k b; W
module_init(led_platform_init);6 V' `5 T7 e1 [, ?
module_exit(led_platform_exit);+ p' T4 q0 o4 J# A1 X) D8 [
0 D9 R8 c1 `4 h' \3 |- l% f* kMODULE_DESCRIPTION("Led platform driver");
# l6 @0 A k6 M$ XMODULE_AUTHOR("Tronlong");
% h- t8 ]. t& v2 P M5 {MODULE_LICENSE("GPL");
9 ~0 H" M3 \, ^
# s' [8 M8 ~, _# v, B |
|