2009年4月14日星期二

炼心之九层楼

李涵虚《九层炼心》注解
(录自魏尧《一贯天机直讲》)
民国·魏尧 注释

(《人元大道九层炼心文终经》,又曰《九层炼心道言》。)

初层炼心者,是炼未纯之心也。未纯之心多妄想,多游思;妄想生于贪欲,游思起于不觉。学人打坐之际,非不欲屏去尘情,无如妄想才除,游思忽起。法在“止 观”,乃可渐渐销熔。止则止于脐堂之后,命门之前;其中稍下,有一个虚无圈子。吾心止于是,而内观之,心照空中,与气相守,维系乎规矩之间,来往于方圆之 内,息息归根,合自然之造化;巍巍不动,立清净之元基。从此一线心光,与一缕真气相接,浑浑灏灏,安安闲闲,此炼心养气之初功也。
注解:修道炼心之功夫,分为九步,分别讲之。谓为“人元大道”者,丹法分人元、天元。所谓“天元大丹”,亦从人元做起,人元亦合天元。天元纯为先天大道, 始终还虚;人元则下手之初,掺以后天有为有作之法。古者多由人元以进天元,人元即筑基栽补之法也。上德圣智,可以直修天元;若为钝根,自以人元入手为易。 天元为圆顿兼修,人元则为渐法,所谓“道以全形,术以延命”是也。李仙则吕祖亲传道法,所述九层,亦为上乘简易之功。初层炼未纯之心,即炼己也,由后天之 身心做功夫。后天之心多妄想,更有游思,妄想即念也。游思者,未起念而忽动于中,并无目的,往来无定,忽起忽落者是也。游思本无中生有,时有时无,念则有 所专注,随想而生,故念可强制而克去之,游思则无从制止。譬如贫而思富,以贫而有所欲,此是妄想;游思则无论心中有念无念,忽然撞上心来,因其无因而至, 故事前难以防止。修士炼斯二者,法在止观。止者止念,观者观心,止观在习静,在止于至善。以至善之心,止于玄牝之门,为“止观双修”,为佛家名词;道家谓 之“性命双修”、“妙窍双修”也。
止观双修,佛家又有许多层次。初时为“小止观”,后有“大乘止观”,又有“天人止观”。小止观者,渐法也;大乘止观,圆顿兼修之法也;天人止观,最后还虚 之事也,此为了手之事,而非初步之功。此观为止念观空,从空中下手,《小止观》书中有云:“止者,系心于缘中。” 缘中即空也。或者系心于眉间,或者系心于脐下,系心即观系止于何处,即止也。将空空洞洞,无思无虑之心,放之于此三处。有此三处,可分三层。两眉间者,正 与“同善社”之法相同。不过系心眉间,须却入一寸,却者退也,仍在虚空之处也。脐下系心,亦须离开肉一寸三分。两眉间为性光发见之地,所以如来两眉间放白 毫光,此即本性中之光明。所谓“虚室生白”之时,即眉间发光也,两眉间即是虚室。脐下一寸三分,胎息之地也,真息即在此处。廖蟾辉曰:“前对脐轮后对肾, 中间有个真金鼎。”金鼎者,真息凝结也,修功到时,自能知之。脐下一寸三分,有真气一团,圆转如轮,即命蒂也。人自下生以后,命蒂即在此处,由婴而孩,胎 息散,而此处成为空穴矣。单修性功者,从眉间一窍下手;单修命功者,从脐下之处下手。吕祖曰:“单修性而不修命,万劫阴灵难入圣。”只能成为阴神鬼仙耳; “单修命而不修性,寿同天地一愚夫。”(参《敲爻歌》,文字稍异)故必须性命双修。性命双修,必须从“缘中”下手。缘者边际也,边际之中,即为内外虚空相 接之虚窍,即人身天地中虚窍是也。因此处为呼吸之根,又为心神出入之门户,故神气皆聚于此。人欲修道,必先使神气心息相合相依,正好在此下手。盖神属于 性,气属于命,人藉气而有命,藉神而能灵;神气二物,为人之至宝。气自外来,盗之于天地万物,然有神能盗气入身;故人死神散,则气不入矣。而人死亦有二 种,若神先散而死者,临终时先昏迷不醒,只有出气,而无入气,气出尽则绝矣;若气先断,而后神散者,则神志清明,忽然气绝,目自死去多时,仍明是也。神气 二者,有一去身则必死,是必保此神气二者,方能生存。修道即修此神气二物也,修性从神字下手,修命从气字下手;若欲双修,必须在神气相合之处下手。彼眉 间、脐下,皆不当也;唯“缘中”一穴,神气出入,皆在此处。双修下手,由此一窍,则妙窍皆在其中,故三教皆以一中字象之。然此为虚中,而非真中,必神气相 合,心息相依,而后有真中,白玉蟾曰“念头动处为玄牝”是也,故此曰“缘中”。缘中者,真中缘此而生也,道家谓之“圆中”,亦曰“悬中”。“系心于缘 中”,即道家之“妙窍双修”,儒家之“性命双修”,佛家之“止观双修”也。大乘止观,即自然无为,安而行之者也;小止观即知止功夫也。南岳思大师,专讲大 乘止观,先须能空净其心,涵养其气,不止观而自然合于止观,即顿法也。我辈顿渐兼修,先在系心于缘中下手,则无误矣,此天元之工也。
李仙所述,人元初层下手工夫,“止在脐堂之后,命门之前,其中稍下有个虚无圈子,吾心止于是,而内观之”,即系心于脐下之法也,为以术延命之道,故谓“人 元”。其所以谓之“人元大道”,与“天元”不同者,即在以意生玄窍而已。所谓吾心止观于是,其法先以后天呼吸之气,入之深深,聚在脐下,成此虚无圈子,而 以心观之道也,所以云“心照空中(即是脐下离肉一寸三分)”,是即下手工夫也。息到于此,心亦安在此处,心息相依,即能混沌而发生造化矣。先修命而后合 性,性得于天,命立于人,所以云人元也。其法须先调息,入息以意送到内之金鼎处,出息以意送到外之脐下。及脐下元气已动,则以神合息,上住缘中,下止脐 下。方者地也,圆者天也,圆窍以通天气,方窍以通地气;“方圆之内”即天地之间之中也,“规矩之间”即脐下一寸三分之规中真金鼎处也。因脐下元气已生,规 中已成,故自外以达内中,真意来往,以维系之耳。凡六十四岁以上,或身体不健之人,宜用此功以保命。九层炼心,由人元起,而到天元,由上品丹法,进而入于 最上一乘,即此是也。由此心息相依,心合于息,然后真息成立,在先之“虚无圈子”,凝结而成玄窍,即后天中之先天也;复以二心合之,而混沌方入先天。炼到 此,而初层炼心工夫已成矣。但所谓意者,仍是有意无意之意,若过于助长,反起邪火而致疾矣。慎之。

二层炼心者,是炼入定之心也。前此一线心光,与一缕真气相接,若能直造杳冥,自当透出玄窍。奈何定心不固,每为识神所迁;心与气离,仍不能见本来面目。法在心息相依之时,即把知觉泯去,心在气中而不知,气包心外而不晓,氤氤氲氲,打成一片。此炼心合气之功也。
注解:二层炼入定之心,即心定于气中是也。心止在虚无圈子之内,是即定于一也。久久纯熟,自然由定而忘,归于混沌,不识不知,内忘其心,外忘其身,自然透 出玄关。张三丰曰:“玄关往来无定位。”又曰:“黄庭一路皆玄关。”所谓“黄庭一路”者,即呼吸之范围也。呼吸之气,从口鼻出入,凡息所能到之处,即“黄 庭一路”也。兹就丹田所在之地位,以明“一路”之范围。
从顶至中,为上田;从中至脐,为中田;从脐至阴跷,为下田。身内之丹田,必内丹成立,方为丹田,无丹则不能有丹田也。譬如土田,田中所种何物,即为何物之 田,如种草者为草田,种麦才为麦田;田中有丹,方为丹田;既未有丹,即无丹田,今所有者,只有丹田地位之空窍。丹田之地位,实只“黄庭一路”而已。黄庭一 路,皆为玄关,故玄关有上下之别,又有内外之分;或现于上,或现于下,并无定在。见于上者,为上玄关;见于下者,为下玄关,其形如环,其白如雪,其软如 绵。如○或如,此皆指外玄关而言也;至内玄关,即丹原是也,佛说为法/轮/常/转。丹原初成,大如黄豆,常在下田之范围内跳动,至静定之时,即能觉之。吾 人下手做功,而现象之玄关为外玄关;至内玄关,须待三元混合,凝结丹原,真息成立之时,方能见之。玄关一窍,最为秘密,从来皆不明说,今为便利后学计,故 详说之。心既止在脐下虚无圈子之内,一线光心,与一缕真息相接,自能杳冥,因杳冥而生恍惚,而透出玄窍,是即外玄关现象也。唯因定心不固,所以不易即见玄 关,必须事先还虚,泯去知觉,心息相依,神气相合,由定到忘,入于混沌,方能见之。所谓入于混沌,即还虚功夫也。吾人对于还虚之功,一步直入,而彼有三步 工夫。脐下一团之气,是为命宝,心定而入于其中,一也;使心息相依,神气相合,二也;渐渐杳冥,而入于混沌,返还虚境,三也。与吾人稍有不同,而到还虚以 后,得药则相同也。

三层炼心,是炼“来复”之心也。前此氤氤氲氲,打成一片,重阴来复,是名天地之心,即是玄关一窍。此刻精气神都在先天,鸿濛初判,并不分真精、真气、真 神。若能一心不动,便可当下采取运行;无奈见所未见,闻所未闻,美景现前,茫无措手,心一动而落后天,遂分为精、气、神矣。法在玄关初现之时,即刻踏住火 云,走到尾闾,坚其心,柔其息,敲铁鼓而过三关,休息于昆仑焉。此炼心进气之功也。
注解:三层炼来复之心,即七日来复,一阳生之时也,此为阳生火候。重阴之下,一阳来复,渐渐真阳充足,即见玄关一窍,此时已达恍惚之境矣。玄关既现,精气 神合而不分,若无杂念,即可采取。因见所未见,闻所未闻,而生惊喜之心,或疑惧之念,立刻即落后天,精气神分立为三矣。人元至此,有作有为,法在玄关初现 之时,不着一相,仍用功夫定神在外,一心不动。少焉阳气充足,即微用意引至尾闾。火云,即阳气也。初,一阳来到尾闾,即是到身。何以不曰身,而曰尾闾?因 阴跷一穴,藏有先天真阳,与外来真阳同类,故能招摄外阳。外面一阳前来,先到尾闾,内外相合,直到命门,而外肾即举,此为活子时;随即冲到心府,而自觉外 肾之举,此为活午时。觉知之后,即须用定,由是而二阳、三阳,阳气充满,自然由尾闾上升泥丸。人元于此,恐因着相生心,当面错过,故先以微意,引之而上, 冲开尾闾,以过三关,先通后天之道路也。天元于此,任其自然,玄窍一开,全身各窍,自无不开。人元有为,用意先之,此亦不同者也。至活子时,指阳生言;活 午时,指知觉而言。吾人为后天破体之身,阴气甚盛,阳之初来也,不甚觉知,仅知皮上跳动而已;其实阳气业已上升到顶。所谓坚心柔息,即定、忘二字之功夫 也。

四层炼心者,是炼退藏之心也。前此踏火云,过三关,心与气随,固已入于泥丸矣。然在泥丸宫内,或有识神引动,则气寒而凝,必不能化为真水洒濯三宫,前功尽 弃矣。法在昆仑顶上,息心主静,与气交融,气乃化为美液,从上腭落下,卷舌承露,吞而送之。注心于绛宫,注心于黄庭,注心于元海,一路响声,直送到底,又 得玄关之现象焉。此炼心得气之功夫也。
注解:四层炼退藏之心,即身内七返工夫也。由阴跷之阳,吸入外阳;外阳到来,冲动命门而肾举,我应定忘在外;阳气即上冲心府,而觉外肾之举,我仍定忘在 外,阳可直到顶上,此阳气内行之路也。天元丹法,任其自然升降,故在我所知觉者,只知身上酥麻,其初如蚤在身上跳动,旋即全身酥麻成片,应即用忘字功夫, 阳气方能化而为液,由昆仑下降,透心清凉,此时心中快乐,不可言喻也。人元有为,处处用意,当气上升,则静守于泥丸,注意久之,引而下降,以腭承之,咽下 重楼;又注意引下绛宫、黄庭,以归元海,此即七返之小周天也。此时应即止火;若再接续做去,身体即不舒适,而其气散矣。心与肾之相交,水火既济,阳气上 升,凉液下降,有声如雷,直达于底。上升时为阳上交于阴,下降时为阴下交于阳,此即小周天运动河车之功夫也。

五层炼心者,是炼筑基之心也。前此入泥丸,而归气穴,已有河车路径,从此一心做去,日夜不休,基成何待百日乎!然或有懈心,有欲心,作辍相仍,丹基难固。 夫筑基所以聚精会神也,工夫不勤,精神仍然散乱,何以延年!奉道法者,在行凭子午,逐日抽添,取坎填离,积金实腹。此炼心累气之功也。
注解:五层是炼筑基之心也。上功行之不怠,有三百周天,既筑基成功矣。然或时作时辍,行功不勤;或动于外诱,定心不固;行功不能合法,则虽行之甚勤,而仍 无金可积,难以进步。夫筑基,即筑其丹基而固之之意也。若优游玩忽,何能日起有功,而使之永固!故道在聚精会神,日新又新。功夫不勤者,必改之使勤;行持 不合法者,必矫之使合法。要在行一周天,有一周天之效用,逐日抽添,积金实腹,则三百周天自易毕而成功矣。人生修持,每多始勤终怠。能加一番矫正鞭策之 功,自能不蹈往辙,而渐臻有成。此炼心累气之功夫,最要而不可忽者也。

六层炼心者,是炼了性之心也。前此河车转动,聚精会神,则灵根充实矣。从此心液下降,肾气上升,是为坎离交。杳冥中有信,浩浩如潮,一半水气;蒙蒙如雾, 一半云气。是名金水初动,方修玉液还丹;但用心不专,则尽性之事难了。法在于金水初生之日,由丹田分下涌泉,霎时合到尾闾;调停真息,鼓之舞之,乃能滔滔 逆上,至于天谷;涓涓咽下,落于黄庭。如此则朝朝灌溉,心地清凉,血化为膏,意凝为土,土中生汞,汞性圆明,遇物不迁,灵剑在手。孟子谓:“尽其心者,知 其性也。”(见《孟子·尽心上》)仙家名为“阴丹”、“内丹”。此炼心明性之功也。
注解:六层炼了性之心,即炼己以生真意之功也。天元炼己,为最初下手之功,炼到真意已成,即由真意调停火候,故一面任之自然。人元先以己意导气,此意不 真;必于筑基后,作此炼己之功,使真意成而真息立,此关于性字之功夫也。盖前此心肾相交,肾气上升,心液下降;升者为坎中真火,阳交于阴也;下者为离中真 水,阴交于阳也。在内心肾相交,在外金水自然合并,即有一团真意,氤氤氲氲,周于玄关,聚而不散,二土成圭,此在外者也。至在内,则心肾相交,水火既济, 行满三百周天,自生一团真息,即是丹元,日夜跳动,自脐而下,由跷而上,往来不息,以意封固,则在脐下,圆转如轮。又能自然开阖,而真息升降,上达于顶, 下达至踵,周流上下,此时应用温养丹元功夫。只有定忘两字,每日忘若干时,定若干时,亦可安若干时;六时做工,六时必须定、忘平均。经过一年温养之后,丹 元化为还丹,外方有象,眼前见有黑球,仍守定忘,渐渐黑球变为红球。是即得到内丹,而了性之时也,将进大周天七日之功矣。

七层炼心,是炼已明之心也。前此金水河车,仙师名为“内炼”,到此还有外炼工夫,以外合内,真心乃聚而不散,盖内体虽明,好飞者汞性;内修虽具,易坏者阴 丹。设或保养不纯,则心性复灭矣。法在以虚明之心,妙有之性,和砂拌土,种在彼家;彼家虚而自我实之,彼家无而自我有之,以有投无,以实入虚,死心不动。 霎时间,先天一炁,从虚无中来,一候为一阳,有如《震》;二候为二阳,有如《兑》。时值二候,正宜合丹,那边吐出一弦真气,其喻为虎向水中生;这边落下一 点玄光,其喻为龙从火里出。两边龙虎会合,性情交感,一场大战,宛如天地晦冥,身心两静矣。俄而三阳发动,有如《乾卦》,如潮如火,如雾如烟,如电如雷, 如雪如花;身中阳乾晃耀,我即持剑掌印,踏罡步斗,鼓动元和,猛烹极炼,透三关而上泥丸,一身毛窍皆开,比前玉液河车,更不同也。吞而服之,以先天制后 天,性命合而为一,即大还也。性属火,其数七;命属金,其数九,返本还原,故名七返九还金液大丹。从此铅来制汞,其心常明,汞不动摇矣。此炼心存神之功 也。
注解:七层炼心,是炼已明之性也,即炼气化神之功也。炼己明之性,即以我之虚灵,通天地之虚灵,我心完全在于空中,于是须增忘减定。忘者,身心两忘也。我 之身心,化入于虚,与虚空无异,而虚中生出造化,显现应过大周天之景,黑球变为红球,又称“朱桔”,所谓火里炼丹,即其时矣。红球回绕吾身,忽上忽下,由 后而上,由前而下,绕后绕前,可分为子午卯酉。到子午卯酉之位,球行必稍舒缓;过此位后,忽而升入极高,忽而落下极低,如狐炼丹,人但见其红球起落也。此 子午卯酉,完全在外也;彼家即是虚空,而我以真意实于虚中。至在身内者,“白云朝顶上,甘露洒须弥”,红球升而热气与之同升。少焉红球落下,甘露亦即下 降,有声如雷;过七日后,红球变为紫气,笼罩身上,此时阴魔如潮如火,汹涌而来,此为过大周天之景,即《西游记》过火焰山之时也。
过大周天之时,宿业发现,万魔齐来,吾人所有贪、嗔、痴、爱及历劫宿业,皆发现于目前;所有曾入眼帘人物,亦皆于眼前出现。所谓“持剑掌印”者,剑即慧 剑,是为灵觉真心,须以真心镇之,譬之于剑,以斩断一切。印为天印,即天心也。阴魔既潮,心动便倾丹鼎,故须持剑印,镇伏一切,应以心放在空洞之中,不使 起意。“罡”者四正,即子午卯酉是也;“斗”者斗柄,亦即定盘星也。“此时应鼓动元和,猛烹极炼。”即是《西游记》之过火焰山是也。此山八百里,无路可 通,中有万魔聚集,火烈如焚。过此难关以后,方得平安,身上毛窍,皆已展开,有如炒豆,又痒又热,人则如醉如痴,血气全身倒流,少时凉液下降,而全身清凉 矣。过火焰山所以须芭蕉扇者,因芭蕉是木叶,虽为木质而极柔,以比木液,扇以生风,风即真阴之气。此气到口,方化液体,而甚清凉,未到口时,本为气体也。 三调芭蕉扇,煽风灭火,三即乾也,金也;芭蕉木也,此为金木交并。孙悟空见铁扇公主时,情话绵绵,以比真阴真阳相见,而阴阳交感和合也。火焰山之火,识神 之火,牛魔王为牛,即雪山之大白牛也。是为坤土,亦是意土。意多邪妄,去妄即真;意本相续,故杀之而落头生头。唯牛魔王为妄意,妄意之火,须以阴柔克之, 熄其妄而归真,乃是明心见性,故牛王皈正,全赖金刚合围,喻遍体乾金也。人生七情六欲,皆妄意也,此时真妄相战,阴阳相激。既过大周天,妄返为真,浊阴已 尽,真阳返入吾身,而成为纯阳之体,故曰“七返九还金液大还丹”,与小周天之玉液还丹不同也。小周天为七返,大周天为九还,若单举一种而言,则大小周天, 皆有七返九还也。过大周天后,止心不动,与太虚一体,此后即是出神功夫矣。

八层炼心,是炼已伏心,而使之通神也。前此七返九还,以铅制汞,心已定矣。但要温之养之,要使身中之气,尽化为神;身中之神,能游于外。于是取一年十二月 气候,除卯酉二月为沐浴,余十月为进退,故名“十月温养”。非言要十个月功夫也,否则心虽定而不灵。炼之煅之,灵心日见;灵则动,动则变,变则化,故有出 神之事,而不为物情所迷。此炼心成神之功也。
注解:八层炼已伏之心,而使之通神,是即出神之功夫也。既得外丹之后,须用温养工夫,为时约须一年。除卯酉二月,应沐浴外,共有十月,是即“十月怀胎” 也。法以我身之虚空,通天地之虚空,久之而罩身之紫光,化为金光,渐渐金光大如车轮,覆于顶上,此即出神之景也。在此时多不自觉,以一意于忘之故,不识不 知,宜有伴侣,以守护之、警提之,而使其觉。则其神一觉,而即出矣。初时其神幼稚,不能远出,仅及五步、十步而止,渐炼渐远,到后来可远至千里万里也。此 时回视色身如粪土,故多有到此时,即尸解而化去者。且此后炼神还虚,皆为神上之事,即无色身,亦可修炼,故无妨舍去;然即舍去,而其色身亦可历久不坏矣。

九层炼心者,是炼已灵之心,而使之归空也。前此温养功深,神已出而不惑,随心所欲,无往不宜,高踏云霞,遍游海岛,致足乐矣。但灵心不虚,则不能包涵万 有,此所以有炼虚一著也。炼虚者,心胸浩荡,众有皆无,清空一气,盘旋天地间,是我非我,是空不空;世界有毁,唯空不毁;乾坤有碍,唯空无碍,此所以神满 虚空,法周沙界也。此炼心之始末也,无以加矣。
注解:九层炼已灵之心,是还虚也。已灵之神,应打扫干净,使之虚空粉碎,成为千百亿万化身,则神通变化无穷矣。此时神已脱胎,故可以神还虚,亦可带躯壳而 还虚,遍虚空皆我神之所到,遍虚空皆为我之法身。于是九层炼心,大功告成。本章从初步说起,到还虚而止,因先从接命入手,功夫稍有不同。至入大周天以后, 则与现在所讲之先天大道,无以异也。

2009年4月13日星期一

linux下面开发PS2驱动过程

PS2键盘鼠标驱动开发文档

-------以及USBHID keyboard/mouse验证

 

 

 内容简介: 键盘鼠标作为基本的输入输出设备,特别是键盘更是与终端有关联,以下将简要分析其设备接口及终端输入相关处理机制, 以及驱动开发中的硬件相关配置部分.

 

目录索引:

 一.        PS2键盘鼠标驱动的硬件相关部分.

二.        PS2鼠标驱动的软件层次.

三.        USBHID keyboard/mouse验证.


一.  PS2键盘鼠标驱动的硬件相关部分.

 

文件: linux-2.4.21\drivers\char\ Ep93xx_w83977_keyb.c

同类参照文件: linux-2.4.21\drivers\char\ pc_keyb.c

 

基于w83977的键盘及鼠标设备,是完全与标准的8042键盘兼容的,因此本驱动基本直接从8042的标准驱动pc_keyb.c来进行修改,当中须要修改的地方相当的少,主要集中如下几点:

 

1.       中断的设置.

edb9302_enable_eint1()

ü         键盘的中断为EGPIO[0].

ü         鼠标的中断为EGPIO[3].

 

有关这一部分,也是必须进行相关改动的地方,主要是配置w83977的设备以及设备GPIO中断等,在这相关设备的初始化函数当中调用,主要包括如下几个简单的函数:

 

此处须要修改的地方如下:

 

[1]. pckbd_init_hw函数当中加入如下键盘GPIO中断设置函数:

// houhh 20070809, init the keyboard gpio int...

w83697uart_set_gpio(GPIO_INT_A, GPIO_KEYB_BITPOS);

 

[2]. psaux_init函数的mouse中断设备及w83977内部中部设备:

// houhh 20070809...

w83697uart_set_gpio(GPIO_INT_A, GPIO_MOUSE_BITPOS);

w83977mouse_set();

 

 

2.       键盘设备的读写, 其读写具体定义如下,与具体的平台相台,在w883977当中键盘的I/O定义如下:

         #define EDB9302_VIRT_8042                IO_BASE83977_VIRT

         #define kbd_read_input()                         __raw_readb(EDB9302_VIRT_8042 + 0x60)

         #define kbd_read_status()                       __raw_readb(EDB9302_VIRT_8042 + 0x64)

         #define kbd_write_output(val)                __raw_writeb(val, EDB9302_VIRT_8042 + 0x60)

         #define kbd_write_command(val)           __raw_writeb(val, EDB9302_VIRT_8042 + 0x64)

         #define kbd_request_irq(handler)            request_irq(IRQ_GPIO, handler, SA_SHIRQ, \

                                                                     "keyboard", "kbd"); \

                                                                           edb9302_enable_eint1(1);    

此处须要修改的地方如下:

 

         [1]. 键盘与鼠标数据读写均建立在此四个宏之基础上,其实是两个宏, 这其实是本驱动中修改最多的部分了J,构成与底层硬件通信的最基础.

       [2]. edb9302_enable_eint1(1) 是打开设备相应的GPIO中断位使能, 也是必须修改成与自己设备相关的部分.

 

3.       中断处理

 

须要修改的地方基本已经在前面的1/2点中指出来了, 一共是四处修改,此时即已经完成了驱动,下面具体了解一下有关中断的处理:

 

keyboard_interrupt()是中断处理程序,虽然他的名字叫做keyboard什么的,但是其实它是键盘与鼠标两个中断的入口,因为他们俩共用一个系统中断向量. 叫断到来时根据不同的GPIO位来判断应该处理什么中断,但实际上处理时是根据读写具体设备的相关状态是判断处理的,具体如下处理在handle_kbd_event()函数当中:

 

static unsigned char handle_kbd_event(void)

{

                   {

                            if (status & KBD_STAT_MOUSE_OBF)

                                     handle_mouse_event(scancode);

                            else

                                     handle_keyboard_event(scancode);

                   }

                   status = kbd_read_status();

         }

         if (!work)

                   printk(KERN_ERR "pc_keyb: controller jammed (0x%02X).\n", status);

         return status;

}

 

根据硬件寄存器读取的状态,进行区别是应该处理什么中断, 具体的硬件寄存器的状态可以参见手册,这里因为没作任何修改,因此不进行说明了, 至于具体的中断内部的处理流程参看源码.


二.  PS2鼠标驱动的软件层次.

 

1. 键盘设备初始化部分.

 

void __init pckbd_init_hw(void)

 

这个初始化的调用者有必要指出来,请看keyboard.h文件中有如下定义:

 

#define kbd_setkeycode                 pckbd_setkeycode

#define kbd_getkeycode                 pckbd_getkeycode

#define kbd_translate                      pckbd_translate

#define kbd_unexpected_up           pckbd_unexpected_up

#define kbd_leds                             pckbd_leds

#define kbd_init_hw                       pckbd_init_hw

#define kbd_sysrq_xlate                 pckbd_sysrq_xlate

 

kbd_init_hw调用者是上一层的键盘共用部分代码kbd_init, 该函数位于 keyboard.c文件, 调用层次关系如下

         chr_dev_init()àtty_init()àkdb_init()àkbd_init_hw();

 

__initcall(chr_dev_init); __initcall机制,在系统初始化完成后调用.

 

在此函数的调用中,完成键盘硬件的初始化以及检测配置等,最后就是安装键盘中断处理程序,键盘中断使能.

 

另外如果已经打开了鼠标支持选项, 则还会调用mouse初始化程序.

#if defined CONFIG_W83977_PSMOUSE

         psaux_init();

#endif

 

2. 鼠标设备初始化部分.

 

上面已经提到了鼠标设备如果打开了,则是在键盘设备当中附带初始化的,鼠标设备与键盘初始化时有个不同的地方,那就是要建立一个设备节点如下:

 

static struct miscdevice psaux_mouse = {

       PSMOUSE_MINOR, "psaux", &psaux_fops

};

       if ((retval = misc_register(&psaux_mouse)))

              return retval;

 

MISC类型为杂类设备,其主设备号为10, 因此这个ps2 mouse的设备节点为/dev/psaux, 主设备号为10, 次设备号为1; 这里应该讲讲为何键盘设备没有设备节点了,这也是开始时我比较困惑的问题,但经实际源码的分析,得知键盘设备其实就是针对当前终端的,在一开始初始化时就已经完成硬件设备初始化,也挂上了中断服务程序并打开了中断,而且在键盘输入时,直接就是针对当前的TTY设备, 因此键盘设备并不须要一个设备节点来打开它,如果你要读取键盘设备的数据,其实就是读取当前终端即可,这一点要弄清楚.

 

既然有moues设备节点,那就有打开设备以及打开设备号的相应文件操作,具体在如下定义,关于每一项并不做具体说明,可能见源码.

struct file_operations psaux_fops = {

       read:              read_aux,

       write:      write_aux,

       poll:        aux_poll,

       open:       open_aux,

       release:    release_aux,

       fasync:    fasync_aux,

};

 

3.  键盘数据的接收.

 

刚才在上面也讲到了键盘数据没有对应文件结构,并不是通过普通的文件读写操作来处理的,那么他具体是如何处理键盘接收的?现在进一点来看keyboard.c这个公用部分的键盘数据接收机制:

 

首先列出具体的键盘中断的处理代码,我们将分两部分来讲解以下三个问题:

 

[1]. 按下弹起这个过程是如何接收的?

[2]. 重复键盘是如何实现的?

[3]. 键盘功能灯是如何处理的?

 

static inline void handle_keyboard_event(unsigned char scancode)

{

#ifdef CONFIG_VT

         kbd_exists = 1;

         if (do_acknowledge(scancode))

                   handle_scancode(scancode, !(scancode & 0x80));

#endif                                    

         tasklet_schedule(&keyboard_tasklet);

}      

 

带着如上的三个问题,来看上述的中断处理,结论如下:

1.        handle_scancode()带这个公共部分负责完成一次按下与弹起的工作,将键盘最终通过调用put_queue(scancode);来将按键交给当前终端缓冲区, 查看这个函数的代码,我们会发觉与串口的处理相当类似,也是首先将中断中收到的数据插入一个flip缓冲区,然后再启动终端的一个tasklet来完成缓冲区数据的取走加工,这当然是异步的.

 

 

void put_queue(int ch)

{

         if (tty) {

                   tty_insert_flip_char(tty, ch, 0);

                   con_schedule_flip(tty);

         }

}

 

2.        对于后面的两个问题,其实是一并处理的,用的机制当然也是我们已经反复提到的tasklet机制,如果对这个机制还不太了解,可以参考” UART串口驱动开发文档.doc”驱动一文件中的详细关于“软中断的机制的原理介绍”, 至此我应该可以深刻的体会软中断做为一种异步机制,在内核应用广泛程度了!

 

处理键盘按键不放,以及键盘功能灯的bh函数为static void kbd_bh(unsigned long dummy), 这个函数的具体代码不详细贴出,它完成的工作如下:

 

[1]. 调用kbd_processkeycode(kbd_repeatkeycode, 0, 1), 以完成须要处理重复按键产生的情形.

[2]  处理当前终端变化的情况, 如果终端变化后才按键数据送向新的终端.

[3]. 如果键盘功能灯的状态有变,即进行响应, 如此软件即可以设置功能灯的状态了.


三.  USBHID keyboard/mouse验证.

 

这个驱证在驱动方面没有任何的代码修改,主要涉及到两个方面:

 

1.       参照DG930x-linux下面的readme.txt来打开USB模块,以及打开Input core模块,并打开键盘鼠标设备的支持,这在readme文档中已经有详细的说明了.

2.       参照minigui的配置文档MiniGUI.cfg的说明,打开输入设备的配置.

 

[1]. USB MOUSE配制:

# IAL engine

ial_engine=console

#ial_engine=dummy

mdev=/dev/input/mice

mtype=IMPS2

 

[2]. PS2 MOUSE配制:

# IAL engine

ial_engine=console

#ial_engine=dummy

mdev=/dev/psaux

mtype=IMPS2

 

3.       参照建立mouseusb设备节点名/dev/input/mice.

4.       编译minigui时,如果要移动窗体必须打开可移动窗体的配制选项, 这此配置在提交的minigui当中已经全部修改完成,可以参照配置文件buildlib-ep9302.

今天开blog,立贴纪念

欢迎大家的光临。open my heart to the world.