|
|
求大神给下面的程序做注解,请稍详细些,谢谢。0 A* d i/ [) s% u' g% o2 j& D! n
#include <linux/init.h>' O) m# x, V& z( o5 C! {
#include <linux/module.h>1 {, }0 v5 p* v7 A9 w+ ?/ W! f+ D
#include <linux/kernel.h>
; _4 O, u9 B. @6 V3 m) m/ o0 b#include <linux/types.h>2 g' s1 [; B( p
#include <linux/gpio.h>
2 ~. t- @" E9 z9 h) c#include <linux/leds.h>1 D: a, m' p, w$ x4 Y Q' ^; z/ X
#include <linux/platform_device.h>
! Y6 o6 d- h9 |) o7 H# Y: R# E9 [, t. G/ [, T
#include <asm/mach-types.h>
4 d4 g! f+ Y! {; y' k6 F# m#include <asm/mach/arch.h>
6 Z j* G- H7 [% [3 u- E#include <mach/da8xx.h> I/ S$ N6 ?2 O+ ?& Y0 e
#include <mach/mux.h>
9 h8 Z' d( g# P" j& [* c+ g K
8 o/ L. N s) g+ k# V#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
8 `# R2 t! q* w& C/ b- R5 ~#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
( _) U' o% h% s' a3 _0 v0 q#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
' X3 p d( E9 i+ ?0 m#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
, G/ g( b4 r# \2 S$ H" Z- u; Y
+ M$ _8 \; N$ P/* assign the tl som board LED-GPIOs*/! O3 x* D' |2 n% O
static const short da850_evm_tl_user_led_pins[] = {. M9 {: V2 s5 M% x- _
/* These pins are definition at <mach/mux.h> file */% f: L9 `7 c5 `! u- k% @* I0 {
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,8 o, {+ {4 z! m7 `
-1# G( H5 r; j5 P* b% E4 o3 `, d. I
};
5 H1 [& `8 Q& m J% r2 a, X
: t7 x; |- h+ [static struct gpio_led da850_evm_tl_leds[] = {
2 y, B) w: T0 p/ w0 H, C7 M; y {. c% k3 ~( U9 k" u- @/ P5 d) B
.active_low = 0,& J. X, ~' V& {7 i
.gpio = DA850_USER_LED0,
# J( w: M* m9 Z9 I: W8 E0 g .name = "user_led0",
$ z$ s& y/ ] u$ M5 z5 q7 `/ c: ~ .default_trigger = "default-on",
( ]4 o8 r' T0 J J# ] },6 c0 j: i4 I2 E/ q9 X9 D
{
+ s4 V. J& S M" _ .active_low = 0,) ?8 g3 J1 P9 _' k* p" t
.gpio = DA850_USER_LED1,& e2 H( J9 u) y& {0 k# U/ d
.name = "user_led1",5 n, { Q/ a a( ]( O
.default_trigger = "default-on",
- ~* O+ S- B/ [1 a7 n' C$ v$ D },; w( `9 D4 u1 k# X. g) F$ V
{4 K* B7 O. y- D" c& [5 a
.active_low = 0,- U$ L" D+ V$ [* I
.gpio = DA850_USER_LED2,8 W; I3 a2 Q/ X! C8 d% d
.name = "user_led2",/ p: D1 W* A! w; ?. t
.default_trigger = "default-on",; D, e: u) D: z# |& Q! Z+ e
},2 r' `+ b% o1 B
{6 Z0 H% A$ \# i4 a5 g% K( h
.active_low = 0,+ I3 u r ]$ g |3 w
.gpio = DA850_USER_LED3,$ a! @, P; c) e
.name = "user_led3",2 T0 P5 h) @) C; u
.default_trigger = "default-on"," ^5 I" b2 K$ e: V$ x% b, B1 A7 v4 R
},
0 J& L$ b" D. H- G9 S};
/ I3 }$ `) g4 `% ^ e" m+ T' Y( }1 Q$ A0 ]. g* r
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
& H& V8 s9 [4 B9 j .leds = da850_evm_tl_leds,$ I4 T- g' Y8 p8 v& x
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),, E+ ]5 N9 t& V: M7 N* e) q
};
1 c/ i" P8 V" X
2 c N# O* s* ?- J0 Mstatic void led_dev_release(struct device *dev)' m( N& c+ m' V9 _( k8 ^
{7 k+ @( q* u) @, L7 l
};
9 L" p V& j) t$ r3 i% j7 ^ [3 j1 Y0 D
static struct platform_device da850_evm_tl_leds_device = {# K- L+ Z! C, p1 f0 i
.name = "leds-gpio",( A1 Z. \& O7 E2 I$ @ ]& K3 C
.id = 1,
" `, `! U& w& W& `2 k .dev = {1 x! z7 U) a3 q" A
.platform_data = &da850_evm_tl_leds_pdata,
/ ?0 h# o+ ]$ Q' ?# G5 C0 X" H .release = led_dev_release,
7 Y" _4 \" j; ~/ t& I& n3 R$ o3 W }
& L, i: |, v7 n7 A; R6 b+ x( L' {};
/ ]. Z2 o, d5 Q1 y1 u* R# @
, E; e; B( _1 T2 Q' ?+ O# nstatic int __init led_platform_init(void)0 u) l( G* ^7 g; F& D
{; q; D/ a5 P' x( ]
int ret;
V# k1 o ?# f9 _$ F) D#if 0
# a* f0 y2 J; P- V1 a ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
_$ i Z$ i$ z# p) A if (ret)2 m* e; }. e( T2 G
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
' F- j% c4 Q) B& A. a; @/ T- E% Q8 j: U "%d\n", ret);
# o- U8 Z4 q9 s( y- @#endif" Y( k& ?' U' A
ret = platform_device_register(&da850_evm_tl_leds_device);
5 f8 I5 p% n' J' }5 {& A9 x+ g$ ? if (ret)
3 Q! d2 s: i& _$ b* a4 i# o pr_warning("Could not register som GPIO expander LEDS");
- L H* y3 i. q( L: Y8 M else
6 m6 P2 O: w8 K printk(KERN_INFO "LED register sucessful!\n");6 ~% O) G0 @- B: f/ ]( q
, t! d3 l; k* t7 }" O
return ret;" Q7 U, q2 g- S' `; _' Q" v" _
}) G9 L8 E& l7 a% O" t( z0 ?+ I' `
4 g) {2 g5 I& T9 D3 v1 V" @
static void __exit led_platform_exit(void)
X) Y# k1 u3 k$ a/ F7 T. f8 Q{
! V3 h2 o5 W+ d/ k) x platform_device_unregister(&da850_evm_tl_leds_device);
% l: c( i% |" m2 ?3 Q, W$ V+ c5 i- X! d2 y- i: B
printk(KERN_INFO "LED unregister!\n");. i( M6 W# ^! w9 A7 q
}: x: M% M- e$ @+ f+ G, h
7 |1 w: m* b/ ^0 p4 R. Qmodule_init(led_platform_init);
; Y5 i' z- p: S8 v2 o8 vmodule_exit(led_platform_exit);
6 I( T4 m. Y% ]$ A. K _6 g9 }- V5 o2 }$ i4 T
MODULE_DESCRIPTION("Led platform driver");- C% l2 J; o1 g# Y4 Z4 C
MODULE_AUTHOR("Tronlong");* y' b2 M6 Q" ^* u' `
MODULE_LICENSE("GPL");3 _6 T7 T& L2 X( l( a
4 r0 u P4 M' {& U+ X |
|