|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
6 x& o& T1 Y1 W# `1 W6 ]: }' m#include <linux/init.h>
; I# b0 U- F; `; n; H#include <linux/module.h>$ o" [- E% j$ A- j1 y+ L
#include <linux/kernel.h>/ S0 @4 Q+ V: z
#include <linux/types.h>" ?$ h+ G& R5 ]! J* a w0 O
#include <linux/gpio.h>
8 R, w2 ~0 F8 w* I1 H+ L#include <linux/leds.h>
- B/ k/ H# O7 x) t#include <linux/platform_device.h>
" c0 a9 B0 g3 y8 x
, H2 V: [3 T! X4 _#include <asm/mach-types.h> n9 `) x0 I2 H% U% a
#include <asm/mach/arch.h>; C* L8 ]5 h$ c- c9 f6 }
#include <mach/da8xx.h>
9 f! |2 e3 }$ a7 V#include <mach/mux.h>0 S) g% p; D6 H7 y) Z( O. z
& ~0 ~ e2 _4 c9 @$ ~$ X#define DA850_USER_LED0 GPIO_TO_PIN(0, 0): Y& |& u: {+ @- M- ^7 d6 v7 b$ _
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)+ o; `/ f% V/ W+ G6 e* J
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)3 \" A' G# _1 b
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
% d' _7 x8 c% C `% |
5 n* e8 f" K! \; P/* assign the tl som board LED-GPIOs*/( J- w& R" x* _+ s& h
static const short da850_evm_tl_user_led_pins[] = {
+ k! u$ l3 F' L5 e% } /* These pins are definition at <mach/mux.h> file */4 A) l5 F- J$ K4 A& S
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
P2 o- T( j7 w- T# g( `: a -1
! Q D* b5 B% \& n: x3 H};
! F' y7 k& N( a& D% J" Y. `+ H5 D% G" o, k2 J
static struct gpio_led da850_evm_tl_leds[] = {0 E& F6 o* C) _( n
{
( [9 P0 X* ^2 X8 m7 R- y .active_low = 0,
) Y; e6 d7 c, I5 E* v* _. V .gpio = DA850_USER_LED0,
1 o+ }3 V( B. t$ j7 u .name = "user_led0",+ }2 \# |+ J j
.default_trigger = "default-on",7 P: r2 Z6 g) l; I/ _8 o% D& E
},: D+ i4 U8 e' G* m$ J& r# m
{
1 P6 ^# F" g1 ]% b& a .active_low = 0,' ^; _& O+ [- n0 `' ^" \$ i
.gpio = DA850_USER_LED1,- D2 Y8 l! O2 T* w/ y/ D/ G
.name = "user_led1",
! K; `, |: s4 x4 X% v .default_trigger = "default-on",
% y/ C% {5 D$ r9 Q4 m },
{6 H D& o. K {
; j" H" [8 Q3 [+ g+ h .active_low = 0,
2 f) d8 J7 N/ a( v- H" F .gpio = DA850_USER_LED2,
+ o, ~9 N. o, H7 X4 K2 I# j .name = "user_led2",# G5 d% W) p4 h. X) u
.default_trigger = "default-on",
. j: J& x' n4 F },' q4 M+ A( e& o& k& ~( v9 v0 H
{
3 q& K+ E, ^' \3 w .active_low = 0,
& y q# v, H r$ n .gpio = DA850_USER_LED3,3 B2 a) P8 p5 i, O5 `
.name = "user_led3",
' r, J. z, c. Q5 ~4 |7 m' [" y0 I .default_trigger = "default-on",
4 l, w! H& @, N9 N },( ]( X- U% F. ?* E5 g. R5 p
};3 }1 s* L0 A. ]; T( N! l; K0 a+ `
1 N l( K3 v# g, B: Q d) V/ L! V
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {8 U4 Z6 _% q1 l! l+ W' L. M$ b8 j+ Y3 {
.leds = da850_evm_tl_leds,
! g2 s g4 J. R0 q" F .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
# a8 u7 z2 e O/ x c, x};( P! ~! G; o, o5 M- _8 C
0 G% y9 k1 f3 J z. j
static void led_dev_release(struct device *dev)5 O. e4 n8 u; M* t3 r' k8 y
{
) R; ^8 @1 [) q9 t};
! `7 N' k. K' o* k
$ U7 T, L, n8 R5 v- Astatic struct platform_device da850_evm_tl_leds_device = {
& m# A. l( g# t2 F w6 e" } .name = "leds-gpio",
- L$ g# T( n S- ^5 ^ .id = 1,
7 c# {. ?/ o1 x" F .dev = {+ R* z1 c& B# n7 p& C% n
.platform_data = &da850_evm_tl_leds_pdata,
0 F9 [( E4 M3 k* c6 U+ ` .release = led_dev_release,
3 h" P7 u$ a2 c5 Q }5 O) J) [% P6 g! H8 A3 ]2 ?
};
8 w4 H$ T7 j4 d8 U5 t. f$ _" e
& o4 T5 h! q; u+ d5 O% \' \' w' Pstatic int __init led_platform_init(void)8 d% J% V# A" _' ~1 E( j, a$ T
{+ ^' c4 i+ P& A. `) q1 N: B- Q; f. p
int ret;
5 z$ Q3 _ r; B$ P7 I#if 06 \5 `3 ` K4 e' l# X, n0 A
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);, q9 |; n p( G# n% v
if (ret)" Y# r1 u+ P! B! q( \) J1 v2 F
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 P( ^% _ }" g _ u' x3 \9 i
"%d\n", ret);3 V- L: o M7 T, G0 m
#endif D6 x1 w0 U7 S/ U
ret = platform_device_register(&da850_evm_tl_leds_device);
4 k$ k' `- y* b" b if (ret)8 d2 n' [( m" k% A) s
pr_warning("Could not register som GPIO expander LEDS");
. l7 C) g; z1 A1 Q' Z1 p4 O else
) b' Y. E6 q$ j/ k# U8 m2 c printk(KERN_INFO "LED register sucessful!\n");3 N) r% Z% v0 A( b
4 _3 J3 s) ]& g1 V2 S3 d return ret;1 r3 n+ E5 E# I' q m
}4 l5 Y2 Z U9 }/ T; H& Z
+ n" |& E: B( c n. ]$ j
static void __exit led_platform_exit(void)
9 {7 m. _5 y5 u% h+ U: E4 }7 F{
6 k6 m' K- e9 h% d1 U! |0 F platform_device_unregister(&da850_evm_tl_leds_device);
" u& R! F1 }4 \7 y
" X5 r* U, J! W5 ~9 H printk(KERN_INFO "LED unregister!\n");
1 j# S9 X: r1 o/ c- G1 [/ ?}" o7 `4 i5 v$ d
2 f! w, c" Q7 X- q6 w' G2 W
module_init(led_platform_init);
0 Y0 H' x; r B0 p* C* qmodule_exit(led_platform_exit);
6 b" [7 ]3 d- u, j( b! M2 \7 K' B" x4 U: y* }2 L# C! n
MODULE_DESCRIPTION("Led platform driver");1 T& r/ s* y' _
MODULE_AUTHOR("Tronlong");5 M! V* V& R5 P) f3 Z
MODULE_LICENSE("GPL");
d% A: l# }. P/ j
% E) M* T8 n, O0 i# Y. z |
|