|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
: H: k: ]& N9 g" q F#include <linux/init.h>. W0 V ^0 ^! S O( }! u9 q
#include <linux/module.h>
1 B: z* o, \; i: W#include <linux/kernel.h>
* e9 n1 \0 w" v& ~; E: f: W9 G, [#include <linux/types.h>
" Y. F$ y4 R5 m: C2 ?7 b$ d1 `( D#include <linux/gpio.h>, K: Z* T* t7 K. e1 l7 R
#include <linux/leds.h>+ H' P" M5 n0 _ Y2 }6 S+ {
#include <linux/platform_device.h>$ N9 [9 k4 A5 e6 D
% H8 w; x, A& O8 `
#include <asm/mach-types.h>
+ q. s; F7 H+ o- |#include <asm/mach/arch.h>
6 r! x/ u" O/ _#include <mach/da8xx.h> e. z# O/ D. f
#include <mach/mux.h>$ q, v4 c5 }. X" c& E! {- a
* p0 P7 D; I7 w" P* `#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)4 d' w( x T8 @- z
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)( t, N' n1 }9 [9 {0 q# h, b
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: |* \/ d) @8 a. z#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
6 R: Y) T' D& R. @6 c+ _$ S/ |. o: ]' ]+ F3 i" z& G
/* assign the tl som board LED-GPIOs*/
. j( _( m2 P' ~5 U7 ystatic const short da850_evm_tl_user_led_pins[] = {
7 |5 E- u' Y. M' j' u- m2 A8 ?5 ? /* These pins are definition at <mach/mux.h> file */
2 E& y# W5 `1 g! A DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,- u( r& \; u+ p K7 q; L
-1( H2 o* Z# v) R# w; @7 r8 w- }/ v0 w
};
9 S! Q1 O+ ^! D- c: s$ e9 C5 T1 e0 @, o( D7 l' Q
static struct gpio_led da850_evm_tl_leds[] = {
5 h1 ?# v3 ~0 [ {
$ D8 K2 |$ S( J1 U: @3 [ L* Z .active_low = 0,; V0 P2 E+ _/ j; E2 |& [ t3 j
.gpio = DA850_USER_LED0,# T$ \( Y* A! h; L5 y$ u* I
.name = "user_led0",, Q9 u9 J+ G2 G; A" Y$ O
.default_trigger = "default-on",
4 c+ @" P6 M- p$ O! Q4 U; W },* Q8 {5 o1 Y" ^' D( G4 [( b& ^- j+ q
{
; D0 @3 n& ?: z" D; | .active_low = 0,
3 O# B& X. `8 o) O .gpio = DA850_USER_LED1,. ]4 Y! O9 O: ]. Q! k4 P1 Q
.name = "user_led1",
5 Y z# A) ]* g" ^ .default_trigger = "default-on",
X A* J* {/ c$ v- t },( W0 a4 \' ?* I l6 H) S
{
* ?3 K3 F( y$ B" |2 w .active_low = 0,
& s5 z4 D/ W% @8 A; v/ A! E | .gpio = DA850_USER_LED2,
& t3 i4 N. g1 F$ p$ g& ^6 D .name = "user_led2",' \! G7 x( }/ r2 W6 E! U: j
.default_trigger = "default-on",- |) [, W2 j4 N' ^
},2 k, b6 \3 [1 y; ]+ {* n
{4 a$ ~( R t* n F2 Z
.active_low = 0,
W6 F0 p( F8 Z1 X/ }+ b .gpio = DA850_USER_LED3,
, ~. j m6 H- s9 h; v! K- c .name = "user_led3",* M( |. v3 ^9 V
.default_trigger = "default-on",# m$ b# N3 q3 ]) t. |* B
},
3 N5 r* |2 U( j3 Y0 B! B/ t};
. |/ |/ t1 s* R! Y
# x0 m+ |0 w8 h* Z. pstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
: f9 I. M7 b z$ Y! P2 [! ^/ O# ` .leds = da850_evm_tl_leds,5 }( a9 L* i7 }9 Y
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
, U. K3 J3 S6 O1 O) h$ v};0 s% E) b1 Y* {
/ v* x: A) f! }" l0 s9 ~! `" b
static void led_dev_release(struct device *dev)
$ E$ e- \- R. f# V* G1 ]{
. G4 x. q7 r1 b# n8 f1 j' s};7 Y. s7 Y: c- {5 n
2 c' j0 k+ Z( y7 }2 F( k
static struct platform_device da850_evm_tl_leds_device = {
- Y+ H, d; f3 o .name = "leds-gpio",
! k( q# Y* Z) T .id = 1,
y: g7 j! I% P p( H" g' Q3 \ .dev = {$ `! C4 _; G/ Z% `
.platform_data = &da850_evm_tl_leds_pdata,
- }* |) [+ l2 i h( y0 W7 N/ j% R2 o .release = led_dev_release,5 \4 O9 T s1 j
}
6 b& o8 i" t" i" K: _1 y};0 O' @, s' U. \$ h$ a0 W
( e; S) r0 q5 i# f1 `. sstatic int __init led_platform_init(void)0 ~% \3 Y1 {5 J' T+ o
{; z5 A$ m0 p) P( Q
int ret;
z6 W- O; b0 ~/ ~! M" o# }# v#if 01 K1 R2 S3 u3 x3 R% ?
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
: y0 ~% g4 G4 w# B- V8 z! u9 ? if (ret)
* V+ L/ L3 F$ b8 L/ k pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
% W/ i% |& Z- m, E7 n$ { "%d\n", ret);
% v/ w4 r. o+ p9 e. A6 ?2 W#endif' E/ e C6 x: R( O2 n( i8 R. L" N
ret = platform_device_register(&da850_evm_tl_leds_device);
+ v: m, G' { G1 g* _1 m8 `1 L6 z if (ret)* i& @ p8 ^. w) p' p
pr_warning("Could not register som GPIO expander LEDS");
: @- ^" k; p- _" q/ ` else6 A( r8 o9 M, F( z) f$ P9 V
printk(KERN_INFO "LED register sucessful!\n");
- {/ \$ B, p' n5 z1 W
% g; t. e5 g3 t" A return ret;
+ _0 d5 `- [# Y; B) t6 A}4 E* h! A& U) t" U
* k Y$ K5 |* ^& o1 L. dstatic void __exit led_platform_exit(void)
+ V: h) Y, G9 {8 u{
% e! {9 ]* y! [ platform_device_unregister(&da850_evm_tl_leds_device);
2 W' G3 J4 E, c0 B$ c( ?% [ _& v" ~5 u& S- m5 l! e
printk(KERN_INFO "LED unregister!\n");
8 s/ a: \) Y7 M3 t# H, ~8 a' M3 x. H}9 U) a% y. G M o- p' W9 W' \4 l2 b
' I, Q* ]; ~) b( D) t. }) l8 i, C% I
module_init(led_platform_init);
7 h2 H, w# P1 Bmodule_exit(led_platform_exit);. T% N) ^& t! p
k5 m& x, r5 \9 q
MODULE_DESCRIPTION("Led platform driver");9 f) y) X: g% R. P" R1 q
MODULE_AUTHOR("Tronlong");
8 N$ ~: J/ L5 l- F( o p o- j. ^9 ?- NMODULE_LICENSE("GPL");
% S2 y1 E9 j( v' U7 |5 c4 w& y- Q I. S
|
|