专利名称::计算机系统及用于计算机系统的设备的制作方法
技术领域:
:本发明涉及利用生物测定数据提供安全的个体识别的设备。该设备可用于安全的匿名金融交易,还具有数字签名功能或者安全IT系统密码。
背景技术:
:高保密的数据卡已属于现有技术,在如WO02/41236、US6,592,044中公开,而利用电子事务处理系统的用户鉴别技术也在US6,594,759中公开。本发明所属的
技术领域:
内,用于进入或者联机进入IT系统的指纹与密码结合地系统是已知的。然而这些系统在某些方面需要依赖外部装置进行操作。例如将指纹存入智能卡,将智能卡插入智能卡阅读器,智能卡阅读器要与计算机连接,还要与指纹传感器连接,这样才能对智能卡内储存的指纹与指纹传感器检测的指纹的匹配程度进行验证。已知的是,系统中的智能卡已经被例如存有统计编码和指纹的USB密钥或者记忆装置所替代。USB装置插入计算机,还连接到指纹传感器,将对存储在USB装置上的指纹和由指纹传感器记录的指纹进行比较,并能在显示器中显示USB装置中储存的编码。上面的两个例子都需要将验证过程分成两个功能上彼此依赖的系统,即智能卡和USB密钥在一定程度上依赖外接电源的电流以及在设备和外部计算机中相同的指纹识别算法。这些方法的缺点是由于操作受到对具有固定传感器的外部装置的限制,不便移动,不易实现;而且当智能卡和USB密钥中的指纹数字化时,采用的指纹识别算法或者至少是指纹算法与外部系统的指纹识别算法相同。此外,存储在设备中的编码会被黑客或小偷获得,造成用户信息泄露,或相同持卡个体的滥用。利用生物测定输入装置识别个体的设备已经在WO2004/010372和US2003/0046228中公开。上面所提到的专利文献一并作为本说明书的参考。
发明内容本发明的目的是通过个人的生物测定数据设备提供安全可靠的个人验证,并且在这种情况下很大程度上消除了现有技术和方法中的缺点。上述目的连同许多的优点和特点以及从下面具体说明中明显可以得出的目的与借助计算机的本发明第一方面相符,即用于识别特定的个人的计算机系统,该系统利用生物测定特征进行识别,包括i)至少一个设备包括-确定外表面的外壳,-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,所述生物测定传感器安装在所述外壳内并从所述外表面露出,-控制器设备,其安装在所述外壳内,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接。-第一通信设备,其装在所述外壳内,与所述控制器设备电气连接并受所述控制器设备控制,用于在所述设备和所述计算机系统之间建立通信联络,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述第一通信设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述第一通信设备供应电力,ii)所述计算机系统包括第一数据库以及第二通信设备,第一数据库包含所述动态二进制码转换算法,第二通信设备用于在所述计算机系统和所述设备之间建立通信联络,iii)当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并将第一二进制码从所述设备输出到计算机系统;当通过所述第二通信设备收到所述设备提供的第一二进制码时,计算机系统通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与第一二进制码匹配,则所述特定的个人的身份通过验证。做为选择,上述目的连同许多的优点和特点以及从下面具体说明中明显可以得出的目的与借助计算机系统的本发明第二方面相符,即用于识别特定的个人的计算机系统,所述系统利用生物测定特征进行识别,包括i)至少一个设备包括-确定外表面的外壳,-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,所述生物测定传感器安装在所述外壳内并从所述外表面露出,-控制器设备,其安装在所述外壳内,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接。-显示器设备,装在所述外壳内并从所述外表面露出,所述显示设备与所述控制器设备电气连接并受所述控制器设备控制,-电源设备,与所述生物测定传感器设备、所述控制器设备以及所述显示器设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述显示器设备供应电力,所述计算机系统包括第一数据库和编码输入设备,第一数据库包含所述动态二进制码转换算法,当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并在所述显示器设备上显示变为字母数字的所述第一二进制码,最好是组成个人识别号码的十进制数,以及当收到通过所述编码输入设备输入的所述个人识别号码时,所述计算机系统通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与由所述个人识别号码变成的第一二进制码匹配,则所述特定的个人的身份通过验证。通过对本发明的基本介绍可知,如果验证设备(可以由轻便设备构造,例如智能卡或任何其他的移动或固定设备)和计算机系统(用于对需要进行个人身份验证的个人进行真实性验证)利用同一个动态二进制码转换算法在设备中以及在计算机系统内部生成编码,在设备中生成的编码用作传送或输入到计算机系统,从而与计算机系统内部的编码验证正确的编码,而这样做是为了验证个人的身份或真实性。在本文中,动态二进制码转换算法表示的术语意思是,任何在将输入编码转化成输出编码时,提供可再生并且唯一的转化的转换算法,但每次使用该算法时,转化都有所改变,由于算法自身包括了对动态改变可预知和可再生的确定,因此这种改变是以可预知的方式进行。以下,描述动态二进制码转换算法的例子,然而这些例子并非全部,任何能实现上述必要条件和定义的转换算法都可以作为本文中的动态二进制码转换算法。按照本发明的第一方面,设备和计算机系统之间的通讯可以通过任何本领域熟知的有线或无线通讯技术实现,如传统的并行设备或串行设备和/或无线电通信线路、红外线路、电容耦合连接、感应回路连接或任何其他的不接触的或无线通信技术。类似于通信设备可以通过本领域所熟知的有线或无线技术实现,编码输入设备可以由任何人工操作的或自动的编码输入设备构成,如输入字母数字的键盘、能够将通过简单地向扩音器拼读字母数字转换为第一二进制码来实现个人输入字母数字的话音识别编码输入设备。用于检测在显示器上展示成可视表现的数字或如红外线显示的数字的视频检波器亦可选用为编码输入设备。根据本发明第一方面的计算机系统的最优方案,设备还包括装在所述外壳内并从所述外表面露出的显示器设备,所述显示器设备与所述电源设备和所述控制器设备电气连接,并由所述控制器设备控制,由所述电源设备提供电力;验证所述编码和所述第一编码一致性后,所述显示器设备显示变为字母数字的所述第一二进制码,最好是组成个人识别号码的十进制数。同样,根据本发明第二方面的计算机系统的最优方案,设备还包括装在所述外壳内与所述控制器设备电气连接的第一通信设备,第一通信设备受所述控制器设备的控制,用于在所述设备和所述计算机系统之间建立通信联络,所述计算机系统包括第二通信设备用于在所述计算机系统和所述设备之间建立通信联络。可以知道,上述根据本发明第一方面和第二方面的计算机系统的最优方案基本相同。可以理解的是根据本发明第一和第二方面的计算机系统可以用来实现额外功能,例如为从一个银行帐户向另一个银行帐户转帐或允许进入特定区域或允许访问特定计算机数据库等等的数据传递。本发明的一具体应用涉及独特的,可再生的而动态的生成个人识别号码或任何其他的字母数字,该数字或个人识别号码可在计算机系统中验证。由于计算机系统可为多个个人(如机构雇员或银行、信用组织等的顾客)身份验证提供服务,因此构成本发明基本部分的设备最好要有多个。如上所述,该设备可实施为独立设备,最好是实施成具有符合ISO(国际标准化组织)标准尺寸的信用卡。但是应当清楚的是,除了按照ISO标准的信用卡全尺寸来实现外,还可以是信用卡全尺寸的两倍、一半或四分之一,或者根据特别需要为公司等机构发行有关的卡并运行相关计算机系统,设备基本上以信用卡的形式构成,或者配置成其他形式,可以是箱体或大体为圆形、长方形、正方形、三角形或任何其他的几何形状的薄片。作为选择,设备可以实现为银行机构的终端机、连接到生物测定传感器组件的个人电脑或任何其他的固定便携式设备。如果设备作为信用卡,该信用卡如下所述有利地实施成其总高度不超过1mm,而该技术由下述生产模型的实施例验证,而现在优选的实施例验证将设备小型化成为可弯的塑料体的能力,该塑料体的外形尺寸和厚度与传统的ISO标准信用卡相符。在本发明符合ISO标准的卡的实施例中,电源设备可以是电池单元,也可以根据本发明是太阳能电池、机械或压电电源。生物测定传感器设备可设于与显示器设备同一的外表面,该显示器设备可以是以基于塑料薄片的多数字显示器构成,或在设备的信用卡实施例中位于信用卡的对边或对面。应当清楚的是,由于多于一个生物测定特征可被检测和评价,根据由上述本发明的第一、第二方面所界定的本发明的技术决不是基于一个生物测定特征进行检测的。关于这点,生物测定特征这一术语应当视为通用术语,包括任何个人特定的特征,例如源自个人的唯一的DNA特征。生物测定传感器设备的例子包括虹膜扫描器、血液扫描器、DNA扫描器、话音识别扫描器、面貌识别扫描器以及用于扫描个人手掌的阵列扫描器或者根据本发明第一、第二方面的计算机系统的最优方案将阵列扫描器用于扫描一个完整的手指或最好是个人的指纹。动态二进制码转换算法的应用需要设备和计算机系统在验证中同步,否则,设备产生并通过编码输入设备传输或输入的第一二进制码不能通过计算机系统验证。下面的情况可能造成设备和计算机系统之间不同步,即个人有意或无意造成生物测定传感器设备产生所述第一编码,不可避免地造成设备的控制器设备产生第一二进制码,而且如果第一二进制码没有传输或输入计算机系统,则设备和计算机系统不再同步,当下次设备执行个人身份验证时通过动态二进制码转换算法生成第一二进制码,而计算机系统端产生的第二二进制码是符合并匹配于之前因个人有意或无意使生物测定传感器设备产生第一编码而令设备产生的第一二进制码。为了保证设备和计算机系统总能同步运行,根据本发明第一和第二方面计算机系统的最优方案,计算机系统还包括第二数据库,第二数据库包括通过所述动态二进制码转换算法顺序产生的二进制码序列,以及如果所述第一二进制码与所述第二二进制码不匹配,所述计算机系统将所述第一二进制码与所述第二数据库中包含的所述二进制码序列进行比较,以验证所述特定的个人的身份。由于基于动态二进制码转换算法自身的防止窜改和复制安全验证,设备和计算机系统之间的传输无需任何加密与解密。此外,如果采用无线电线路,例如GSM或卫星通信线路,经系统传输的多样数据自身可确保安全性及保安。不过根据本发明第一和第二方面的计算机系统的一个实施例,系统还包括由所述控制器设备控制的加密与解密设备,用于执行所述控制器设备与所述外部计算机系统之间在加密状态下进行的所述通讯,可采用如DES加密或其他的公知或不公知的密钥。如上所述,设备和计算机系统之间的通讯可按照任何通讯协议实行,因此设备和计算机系统的第一和第二通信设备可以是并行通信接口、串行通信接口、SPI、I2C、USB、如蓝牙、红外线或射频通讯的无线通信接口。上述目的连同许多的优点和特点以及从下面具体说明中明显可以得出的进一步目的与本发明第三方面相符,涉及计算机系统中使用的设备,计算机系统利用特定的个人生物测定特征识别所述特定的个人,包括-确定外表面的外壳,-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,所述生物测定传感器安装在所述外壳内并从所述外表面露出,-控制器设备,其安装在所述外壳内,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-第一通信设备,其装在所述外壳内,与所述控制器设备电气连接并受所述控制器设备控制,用于在所述设备和所述计算机系统之间建立通信联络,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述第一通信设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述第一通信设备供应电力,-当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则所述动态二进制码转换算法产生的所述第一编码变为第一二进制码,并通过所述第一通信设备将所述第一二进制码从所述设备输出到所述计算机系统。同样,上述目的连同许多的优点和特点以及从下面具体说明中明显可以得出的进一步目的与本发明第四方面相符,涉及计算机系统中使用的设备,该计算机系统利用特定的个人的生物测定特征识别所述特定的个人,包括-确定外表面的外壳,-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,所述生物测定传感器安装在所述外壳内并从所述外表面露出,-控制器设备,其安装在所述外壳内,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-显示器设备,其装在所述外壳内并从所述外表面露出,所述显示设备与所述控制器设备电气连接并受所述控制器设备控制,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述显示器设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述显示器设备供应电力,-当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并在所述显示器设备上显示变为字母数字的所述第一二进制码,最好是组成个人识别号码的十进制数。本发明第三和第四方面的设备如上述本发明第一、第二方面的计算机系统所述的部件一样,基本由轻便的或固定的设备构成,在此不再赘述。上述目的连同许多的优点和特点以及从下面具体说明中明显可以得出的进一步目的与借助计算机的本发明第五方面相符,即用于识别特定的个人的方法,该系统利用所述特定的个人的生物测定特征进行识别,包括i)提供至少一个设备包括-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,-控制器设备,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-第一通信设备,其与所述控制器设备电气连接并受所述控制器设备控制,用于在所述设备和所述计算机系统之间建立通信联络,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述第一通信设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述第一通信设备供应电力,ii)所述计算机系统包括第一数据库以及第二通信设备,第一数据库包含所述动态二进制码转换算法,第二通信设备用于在所述计算机系统和所述设备之间建立通信联络,iii)方法包括-当收到所述生物测定传感器设备提供的编码时,将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则利用所述动态二进制码转换算法产生所述第一二进制码,并通过所述第一通信设备将所述第一二进制码从所述设备输出到所述计算机系统,-当收到通过所述第二通信设备提供的来自所述设备的所述第一二进制码时,所述计算机系统通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与所述第一二进制码匹配,则所述特定的个人的身份通过验证。上述目的连同许多的优点和特点以及从下面具体说明中明显可以得出的进一步目的与借助计算机的本发明第六方面相符,即用于识别特定的个人的方法,该系统利用所述特定的个人的生物测定特征进行识别,包括i)提供至少一个设备包括-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,-控制器设备,其包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-显示设备,其与所述控制器设备电气连接,并受所述控制器设备控制,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述第一通信设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述第一通信设备供应电力,ii)所述计算机系统包括第一数据库和编码输入设备,第一数据库包含所述动态二进制码转换算法,iii)方法包括-当收到所述生物测定传感器设备提供的编码时,将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并在所述显示器设备上显示变为字母数字的所述第一二进制码,最好是组成个人识别号码的十进制数,-当收到通过所述编码输入设备输入的所述个人识别号码时,通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与由所述个人识别号码变成的第一二进制码匹配,则所述特定的个人的身份通过验证。对本发明进行更详细的说明中参考以下附图图1表示本发明的智能卡,图2是图1中智能卡部件示意图,图3-6是图1中智能卡上的四层印刷电路示意图,图7是卡验证服务器和应用服务器之间通讯的图解,图8表示初始化过程和同步过程,图9表示卡的布置,图10以框图形式对卡进行说明。具体实施例方式图1表示由发明最优方案和具体实施例的模型机的设备构成的智能卡。智能卡用附图标记10表示。智能卡基于IEC7810标准,卡类型为ID-1,并根据IEC10436-1(ISO781075(e))确定卡的物理尺寸。在本发明的最优方案中,卡厚大约5mm。卡的外形尺寸是85mm×55mm×4mm,并且如图1所示具有长方形的外形。然而,在具体设备中,可以想见卡可以是任何几何形状,圆形、椭圆形、正方形三角形、六角形、五角形或者球形。卡10包括用于依靠指纹数据记录个人身份的指纹传感器12。然而传感器12可以由任何用于感应生物测定数据来验证个人身份的传感器替代。传感器的类型已经在WO02/074168和WO01/150660中披露,在此全部引入作为本说明书的参考。智能卡中还包括显示器,用附图标记14表示。显示器14用于向用户提供信息,例如状态信息或者个人识别号码(后面会进行说明)。卡10还包括用于连接其他系统的智能卡接口16。当卡第一次使用时,必须进行初始化,例如卡必须装入参照指纹或者其他用于正确识别持卡者的生物测定数据。初始化过程包括以下步骤1)开启卡。2)显示器14显示″ready(就绪)″信息。3)用户将某根手指对着生物测定传感器12。4)根据指纹检测成功与否,显示器14显示″good(有效)″或者″error(错误)″。5)用户再一次将同一手指对着生物测定传感器12检验指纹。6)然后显示器14显示″good-1(有效-1)″或者″error(错误)″,如果消息为″error(错误)″则用户必须重复步骤3-5。7)用户再一次将同一手指对着生物测定传感器12检验指纹。8)如果指纹通过检验,则显示器14显示信息″good-2(有效-2)″。9)8个数字代号将在显示器中显示出来,数字通过国际互联网络功能传送到安全防范系统的程控接口卡(PI卡)。图2是卡10内部包含的部件示意图,图3-6表示图2中所示部件之间建立电气连接的四层印刷电路图。上述设备的具体实例参考图1-6,其由以下部件组成部件器件样式说明C10805100nF电容C212061uF电容C30805470nF电容C40805470nF电容C50805470nF电容C60805470nF电容C70805470nF电容C80805470nF电容C90805470nF电容C100805470nF电容C110805470nF电容C120805470nF电容C130805470nF电容C140805470nF电容C150805470nF电容C160805470nF电容C170805470nF电容C180805470nF电容C190805470nF电容C20120610uF电容C21120610uF电容C22080510nF电容C230805100nF电容C24120610uF电容R108053K8电阻器R20805470K电阻器R30805128K电阻器R40805539K电阻器R50805333K电阻器R6080510K电阻器R7080510K电阻器R8080510K电阻器R908050R电阻器R100805100K电阻器R1108050R电阻器R1208050R电阻器R1308050R电阻器R1408050R电阻器R150805100K电阻器R1608051K电阻器R17080510K电阻器33.3Vreg稳压器32MHz_pakke晶体74LVC1G322输入端或门B1电池终端Display显示器7segment,8cifreFDN306P金属氧化物半导体场效应晶体管FPC2010指纹控制器HMS39C70CPUARM792核心LTC1998电池监视器LTC4054L4.2电池充电器LTC4412功率控制器MemRAMS1编制CPU程序的连接器S2连接外电源的连接器S3连接触击传感器的连接器(框图中未表示)SW1开启卡的触点ZHCS750肖特基二极管IC1显示激励器电路中的内存芯片模块18用于存储指纹传感器12记录过的与指纹相关的数据。本发明的最优方案中,控制器20具体为FPC2010用于控制指纹传感器12,由有公司名称的指纹卡传感器构成。控制器20是连接到传感器12的唯一单位或者模块。处理器22也设置在卡10上,用于与控制器20通讯。本发明的最优方案中,处理器22是由HYNIX公司提供的部件名称为HMS39C7092的处理器。处理器包括92-kb闪存器。用于计算安全匿名个人识别号码的算法已经植入处理器22。在文中,处理器作为通用术语包括最小的微控制器及更大的处理器。指纹传感器12是触击传感器,具有紧凑、低成本和低动力消耗的特点。传感器具有152×32像素的分辨度,有效面积10.64×2.24mm,分辨度363点每英寸(DPI)。每一个像素有8位分辨度。触击传感器的功率消耗在工作状态大约45mA,在非工作状态大约5uA。显示器14包括如蜂窝电话或移动电话那样显示剩余电池容量的区域。当电池电压低于一定值时,显示器14显示警告,表示电池需要充电。当电池在一定时间内没有充电,而卡10并未被关闭时,处理器22将关闭卡10。卡装在用于电池充电的适配器中。适配器可以设计成可在任何国家插接交流电源,例如插入110V,60Hz交流电或者230V,50Hz交流电。电池可通过市电电源充电。也可以利用动能为电池充电,例如个人携带智能卡10行走时,将动能变为电能为电池充电。还可以选择在智能卡10中包括太阳能电池,将太阳能转换为电能为电池充电。电池可以是锂铁聚合体可充电电池,这样电池的记忆效应最小。本发明的最优方案中,电池容量大约80-100mAH。本发明中,使用智能卡10的个人只要获得适当受权,便可以利用智能卡10上产生的个人身份号码进入安全系统如金融交易或安全区域。计算数字编码的算法软件包含在本发明处理器22内的存储器中。该算法根据三个号码串计算有效的编码,一个号码串由智能卡上处理器22中的随机数生成程序提供,一个号码串由外部计算机生成,一个号码串由为卡提供保证的公司选择或者由例如帐号、社会保险号或者任何其他的特定个人识别数字所确定。一般而言,算法基于至少两个常量和一个变量。算法根据两个常量和一个变量,为外部系统计算个人识别号码,从而正确地识别个人并准予进入。使用中,拥有卡10并已利用指纹将卡初始化的个人是通过启动开关或通过简单地接触指纹传感器12来启动卡的。然后智能卡要求个人向指纹传感器12提供指纹。于是控制器20将新感应的指纹与记忆装置18中存储的指纹进行比较。如果比较结果为匹配,则计算出有效的个人识别号码提供给个人,最好通过显示器14显示个人识别号码。如果比较结果不匹配,显示器14显示错误信息。智能卡中提供的软件可以包括在未提供有效指纹时,限制个人试图获得有效个人识别号码的次数。本发明的智能卡10并非仅限于为单一系统生成个人识别号码。每个智能卡10可用来授予多个系统的进入许可。个人可以利用智能卡10获准进入例如私人联机银行出纳系统和工作用IT系统。可以选择例如通过至少一个密钥,来选择专门系统生成个人识别号码。本发明的最优方案中,显示器14单行可显示高达8个字符,可以在不够光亮的条件下启动背景光便于智能卡10的使用。实施例中,可以预见到可能会有可变长度或长度不是8个字符的个人识别号码,这也视为本发明的一部分。由于指纹不从卡中传送,或不从与卡分离的设备读入,个人的真实身份不会失密。卡10可以包括传送生成的个人识别号码的模块。模块可以由无线模块构成,也可由与外部系统接线的模块构成。算法包括与位元处理相结合的多个数学函数,例如数字映射(numberreflection),从而用作把特定经使用的编码序列个别的组合以及组合成特定排序。本发明的智能卡可采用两种方式的位元处理,一种是随时间变化的,另一种是定值,两种方法都具有高保密性。本发明执行的应用软件由大约三个独立的数据库组成。第一个数据库称为A,包括与通过出售者或公司操作每个智能卡的人有关的资料。数据库A中的记录称为帐户。第二个数据库称为B,包括与个人卡有关的数据,例如上次使用的编码以及初始化过程中确定的两个常量。数据库还包括保密级编码,例如在察觉卡未同步以前决定接受多少编码。数据库通过用户在每次获准进入时刷新。第三个数据库称为C,包括可进行更换验证的编码序列。如果用户未能验证,编码序列减少。如果可用的编码数目减到零,导致卡和服务器未能同步,意味着智能卡阻断,要求再次进行同步过程。将该数据分入三个数据库,提供高水平的安全管理,使多于一个人管理系统,每个人对个人数据库具有不同的权利。同时人员信息可以排除,这样提供匿名进入系统,便于处理未经识别的个人,例如用于调查内检日志。由于卡包括由电池构成的电源,并且包括与服务器相同的用于计算编码序列的算法,假如卡和服务器没有因例如太多的错误联机导致不同步,则卡和验证系统无需物理连接。现在信用卡和借记卡在卡封闭前仅允许三个错误的个人识别号码,而对本发明的生物测定智能卡来说,用户提供的错误编码的数目可以更多,因为卡内的生物测定传感器增加了安全性。在附录1中,列出了操作图1-6的上述具体实施例的软件程序。图7说明智能卡和验证服务器100以及应用服务器102之间的通讯。卡第一次使用前,必须通过前述的程序初始化。验证服务器100向卡10发送第一个随机数和一个常数,以偏差104表示。第一个随机数和一个常数的传送可以采用智能卡接口设备、USB接口设备、无线接口设备(如蓝牙、红外线或射频),所述的通讯方法可以由本领域普通技术人员都显而易见的其他方法代替。图8表示卡10与验证服务器100的初始化和同步。图中分成灰色和白色两个区域。下方的白色区域表示每个卡仅能进行一次的初始化。上面的灰色区域表示每个卡重复地执行同步。当验证服务器100的初始化通过偏差A表示时,至少一个常数提供给验证服务器,例如帐号、区号或其他的标识号。提供数据的应用服务器可以是适当的银行、护照检查处或其他的公共授权机构。初始化过程启动,有关具体的卡的数据在图8中处于B点的验证服务器中建立。卡设置在智能卡阅读器中,利用智能卡接口设备接收来自应用服务器的常数以及来自验证服务器的随机数字。卡生成计算编码或标记所需的第三个数字。在最优方案中,第三个数字为随机数,但也可以是由指纹传感器提取的数字。由至少有一个可变量组成的三个数字,可以计算标记或编码序列。每个卡的标记或编码序列都是专门的。初始化过程后,卡将被锁定,意味着卡不能再对内存储器执行正确操作。必须由卡向验证服务器提供用于计算标记或编码序列的标记或编码。对于安全性要求不高的情况,可以不采用随机方式,而是对大量的卡进行预初始化。在称为D的方框中,初始化期间,指纹检传感器必须识别指纹三次,随后程序将指纹装载入内存储器。这时将如上所述锁定内存储器。出于安全性考虑,验证服务器在卡同步前可以不启动与卡有关的帐户。在同步的初期,卡把可以是可变量的第三个数字发送给验证服务器从而确保这一过程的安全性。当指纹传感器启动并且提供给指纹传感器的指纹的真实性已经证明时,算法根据卡内存中已存的标记或编码生成下一个序列中的标记。卡可通过各种数据输出装置输出标记或编码。在本最优方案中,采用显示器向用户显示个人识别号码,然而在具体使用时可以包括卡上发出的声音、无线电信号或灯光。无论采用什么输出设备,除了编码或标记,卡中与生物测定特征直接相关的信息都不会输出,而且编码或标记是动态变化的,这样就向持卡用户提供了匿名方式。为了使卡进入应用服务器,卡需要与验证服务器同步。这每次都需要在因应卡供应商的安全需要而行的程序之后执行。服务器算法与卡中执行的算法相同。卡向服务器提供的标记或编码随后也用于计算卡所产生的编码或标记序列的第一步。如果来自于卡的标记或编码通过验证服务器验证,验证服务器与应用服务器即进行信号交换并且卡拥有者或卡即可登录。如果卡和验证服务器产生不同步,例如提供了多于10个错误的编码或标记,则将卡向验证服务器传送下一个标记的程序重复。因为卡和验证服务器都具有相同的编码或标记序列,卡可以向验证服务器提供标记,接着验证服务器可以在卡的序列中计算。随后验证服务器便可与卡同步。在本发明的最优方案中,使用卡的推荐方法是,分别将拇指和食指保持在卡的两侧,拇指放在有标记的一侧,然后用另一只手拉卡,从而使每次在传感器的手指压放基本上相同,手指在触击传感器上移过的速度也基本相同。如果使用传感器阵列,则需标记或指示。计算个人识别号码的算法如下1for(my$i=0;$i<=$sekvens;$i++){2$g=0;$v=100000000000;$d=0;3$x=($a*$x)+$c;4while($x>=1000){$d=$x-(10*floor($x/10));5if($x<$v){6$g=(10*$g)+$d;$v=$v/10;7}$x=($x-$d)/10;8}$x=$g;9}该算法也包括在附录1内,可参见附录1。变量$sekvens表示由服务器计算的标记数目。变量$a表示常数,例如银行帐户或生日。$b表示随机选择的常数。卡上执行的算法与服务器上的相同,但变量$sekvens的值限定为1,即一次仅计算一个个人识别号码编码。为了提高算法程序的安全性,可以变换变量$d,即在计算编码序列之后,可以随机选择新的编码指令。如果第三者获得编码序列的资料,除非他还知道变量$d的变换,否则知道编码序列的资料也还是没有用。在每次使用卡10时,编码提供给验证服务器100(箭头106表示)。验证服务器和应用服务器102不断地保持通讯(双箭头108表示)。卡10不仅可以在需要高安全性的场合使用,也可在不同场合使用。程序的同步是卡安全性的一部分,也为卡的安全级别提供了适应性。如果要求高安全性,可以对同步情况进行监视,例如要求用户本人出现在安全管理员面前,并为卡提供由第三者向验证服务器人工输入新的编码。当安全性要求较低时,可以使用电话或国际互联网进行同步。在本发明的最优方案中,智能卡10包括ARM7TDMI32位RISC处理器用于根据前述算法执行计算。卡内还可以包括存储器,如闪存、EEPROM、RAMorROM存储器。卡10还包括7数据段8位显示尺寸为35mm×15mm的显示器。指纹传感器为具有大于15千伏静电放电保护的电容式触击传感器。电池为容量10-100mAH的锂铁聚合体可再充电电池,还可以包括充电电路。本发明的最优方案中卡必须符合国际标准组织的ISO7810/7816/10536/14443标准。为了与外部系统通讯,卡可以包括射频通信方式。微控制器可以包括COS操作系统,可以是基于LINUX或JAVA的操作系统。具有操作系统可以使软件应用的开发不依赖于硬件平台。可以开发新的应用软件,并用智能卡读写器或其他数据传送介质下载到卡的存储器内。卡可以包括与触击传感器相连的开关功能,这样可以通过例如手指触碰传感器启动处理器来启动传感器。传感器可以测量来自手指的热量或电导。手指第二次接触传感器,指纹传感测器将检测个人的指纹。这样可以保证当卡装在例如钱包中时,不启动。而且任何人都可以启动卡,但只有卡的合法拥有者的指纹才可得到确认并因此获得卡上的个人识别号码。在上次启动操作后的一定时间如30秒后,卡可以关闭。显示器除了可以显示数字以外,例如显示器具有显示黑白图像或彩色图象的功能,这样就能显示例如用户护照中的相片。显示器还可以是压敏材料,这样用户可以与例如菜单系统进行互动,从而对卡进行配置。在本发明的最优方案中,采用3.3V显示器,在上次操作后30秒关闭。在本发明的最优方案中,使用WorliyEnergyCells公司提供的两节电池,每节电池容量为45mAmpH因而提供总共容量90mAmpH。电池可充电,尺寸为43mm×40mm×1mm。研究表明,电池进行一次充电可以生成几百个个人识别号码。为了与3.3V电流相配合,提供最大电流负荷为500mAmp的调压器将电池电流从3.7V降至3.3V。卡可以包括开启或关闭卡的滑动开关。开关可由指纹传感器替代,通过感应与手指的接触来开启卡。中央服务器验证智能卡所提供并经用户或智能卡的拥有者输入的个人识别号码编码。服务器和智能卡都包含根据两个常数生成随机数序列的算法。当卡初始化时,两个常数和一个变量就装载或读入智能卡的存储器并也存储在服务器上。卡的发行者可以选择两个常数中的一个,是例如帐号或其他人员识别码,另一个常数和一个变量由服务器和智能卡分别地随机生成。显然,为了提供独特的动态二进制码转换算法,用于动态二进制码转换算法的常数和变量的数目可以改变。如可选用下列动态二进制码转换算法。一个常数由服务器形成,另一个常数由智能卡形成。其他设备分别读入两个常数,从而使每个系统都获得两个常量。分别交换智能卡和服务器生成的随机数的步骤,是服务器初始化智能卡和智能卡初始化服务器的方式。服务器可以仅接受有限数量的个人识别号码,例如10个,即智能卡生成的下10个编码可以作为用户登录系统验证身份的个人识别号码。当智能卡启动,用户身份已经通过生物测定传感器确定时,生成个人识别号码并在显示器14上显示。可用的个人识别号码数目减少一个,即剩余九个编码用来登录。当使用个人识别号码登录时,服务器重置并接受下10个序列中的个人识别号码。然而,如果生成的10个个人识别号码一个也没用来登录系统,智能卡和服务器将不能同步,第十一个生成的个人识别号码将被服务器拒绝。为了重建同步,智能卡拥有者可以联系系统管理员或其他管理机构,并提供接下来生成的个人识别号码,使服务器达到个人识别号码序列的点。这样在服务器和智能卡之间达至同步。因为只有智能卡的合法拥有者可以生成有效的个人识别号码,所以只有持卡人自己才能进行同步。由于智能卡包括处理器和内存储器,智能卡可以包括用于不同独立系统的几个常数和/或算法,例如卡可以由公司雇员使用,用来进入公司或进入公司内部IT系统,或者雇员私人的银行帐户。雇员或卡的拥有者可以通过显示器或者其他的选择设备例如智能卡表面上的按钮选择由哪个系统生成有效的个人识别号码。在另一个最优方案中,卡厚大约1mm,可以弯曲,要求生物测定传感器位于卡的边缘,尽可能避免破坏传感器。卡边缘附近的刚硬性为传感器提供稳定性。所有的生物测定传感器要求一定的灵敏度,信号要求与以前提供的信号相同。通过为卡提供图示指示手指应放在指纹传感器的位置,保证用户可以将手指移动到与每次使用卡时相同的位置上。上述本发明最优方案的设备实现的原型具有国际标准化组织标准信用卡的外形尺寸,但总厚度大约4mm-5mm。原型的厚度可以减为不大于1mm,如下面所述,同时信用卡配置成软的可弯的信用卡,其不会因信用卡或智能卡设备在个人携带的钱包或口袋中弯曲而损坏。由于卡被设计成放在钱包中,下一代个人识别号码代码生成卡将要满足两个主要的需求。●卡不能是硬的,必须能弯曲,这样当卡放在钱包中时,用户不会将卡折断。●第二,卡不能超过1mm厚。为了满足这些要求,不能使用用于模型机的技术。在模型机中,使用了个人识别号码卡标准零件,例如普通的玻璃显示器、标准电池及其他普通的标准电气零件。显示器卡上的显示器相当大,大致覆盖卡中部,也就是说,当卡弯曲时,显示器也要弯曲。显示器可以是任何尺寸,任何位数。已有几项弯曲和塑性显示器技术。这些显示器基本上像一块薄的塑料,非常薄,薄到0.3mm,并且很软,即可以弯曲而不断。电子器件卡上使用标准零件的问题是●零件不能弯曲。●由于在黑色塑料匣中,厚度很厚。●因为指纹控制器和微控制器是两个不同零件,安全性极低,卡有可能被拆卸窃取。●许多零件成本高排除这些问题的方法是采用ASIC(专用集成电路)。ASIC是用户特定零件,可以是数字的、模拟的或混合的。当用户触碰手指时,生物测定传感器(指纹传感器)产生模拟信号。ASIC最好包括前端和A/D连接器。此外ASIC包括控制器、微处理器、存储器及显示激励器。ASIC的优点在于安全性极高。其不可能分解电路。此外这样一个ASIC实际尺度大约4×4mm,对无遮盖的晶粒而言。因其由硅制成不能弯曲,ASIC将设置在卡的一边。ASIC使用功率代替四个标准零件也是一个重要因素。由于其制造工艺(例如HYNIX0.18u),ASIC使用的功率很低。供电电路可以制成模拟芯片或与ASIC一体制成。ASIC的厚度很小,低于1mm(对无遮盖的晶粒而言),但晶片决定ASIC的厚度,如果晶片太厚,可以进行背面磨削,因为ASIC的功能由光刻掩模制成,只有几微米厚。其他的电子零件卡上将有X-tall,可能有其他零件例如电容和/或电阻器。指纹传感器其由硅制成,不能弯曲,因此传感器也必须位于卡的一边,最好在卡的边缘。像ASIC一样,如果太厚,可以将传感器背面磨削。电池厚度可以是0.2mm,当然电池的容量取决于其尺寸和厚度。电线印刷为了将不同部分电气连接,推荐采用电线印刷技术。还可以选择引线接合法来将其他底垫(pad)与ASIC上的底垫连接。封装为使卡好看,并保护电子零件,需要进行封装。传感器类型合适的传感器类型是●触击传感器—用户必须将手指在传感器上触碰,从而扫描用户的指纹。●区域传感器—用户将手指放在传感器阵列区域,然后扫描指纹或全部手指。●虹膜传感器—用户向眼睛传感器里看,然后扫描用户的虹膜。●血液传感器—对用户的血液特征进行扫描。●DNA扫描器—对用户的DNA进行扫描。●扩音器—对用户的声音特征进行扫描。●气流—扫描用户的呼吸特征或检测某种气味。●键盘—用户输入卡上的密码。电源类型合适的电源为●电池●电容充电器类型充电使卡的工作时间更长。以下的充电器可以使用●充电器—将充电器与卡上的连接器(如智能卡连接器)连接;即用户的传感器卡必须还具有充电器。●太阳能电池—太阳能电池可以在卡上充电,或自己成为电源。●无线—如电容或感应耦合器。●动能—当用户带着卡行走时,利用其摆动为供电装置充电。存储装置的类型合适的存储装置为●闪存器—程序烧入闪速存储器。●EEPROM(电可擦可编程只读存储器)—另一种可以包含存储数据的技术。●OTP—一次可编程存储器。●ROM—只读存储器。将来其他类型的存储可能使用●生物存储器●化学存储器●光存储器应用类型●密钥产生器—为用户向例如数据库或禁区提供唯一的密码。输出的密钥举例说是列在显示器上。●保健—传感器卡测量用户的健康状况,如果有问题,将显示例如医生的电话号码。●私人数据—所有的私人数据例如出生日社会保险号等等可以在显示器上看到。输出类型●插线—插上电线接收输出数据。●使用无线电频率(如蓝牙)—卡可以与例如外部计算机无线通信。●扬声器(声音)—卡发出音频讯号(如人的语音),第三方用户可以接收(听到)。●光线(高低频率红外线)—如通过激光或红外线数据通讯。●全息技术—卡产生全息图。●智能卡连接器—智能卡阅读器接收输出数据。●显示器—数据在显示器上显示。传感器卡的厚度多传感器可以在卡上采用多个传感器,如3个传感器,两个手指传感器和一个声音传感器来查对人的身份。第二传感器也可以是检测日光、空气污染、雨、温度等的传感器。传感器卡也可以作为个人识别号码编码产生器和传感器卡的组合。附录1UTILITY.H/*Miscellaneouslibraryfunctions*/#ifndef_UTILITY_H#define_UTILITY_Hexternvoiddelay(int);externvoidmessage(char*s);externunsignedintbattery_check(void);#endifUART.H/************************************************************************Copyright(c)2000ARMLimited****Allrightsreserved************************************************************************//*********************************************************************ThefollowingarefortheIntegratorUARTsystem.Thesearebitstoenable**thefunctionsintheCommandRegistersandtheindividualmasksforthe**returnedStatusregisters**RegisterBits-theserequiretobesettoenablethedefinedfunctions*********************************************************************/<!--SIPO<DPn="25">--><dpn="d25"/>#ifndef_UARTDEF#define_UARTDEF/*****************************************************************************//*UARTStructuremapstoregisteroffsets*//*StructureisinstantiatedinUART.candplacedbyscatterfile*//*****************************************************************************/structuart{volatileunsigneddr;//@0×0volatileunsignedecr;//@0×4volatileunsignedlcrh;//@0×8volatileunsignedlcrm;//@0×0cvolatileunsignedlcrl;//@0×10volatileunsignedcr;//@0×14volatileunsignedfr;//@0×18volatileunsignediir;//@0×1C};/*****************************************************************************//*ReceivedStatusRegister-RSR*//*****************************************************************************/#defineRSR_Overrun_Error0×08#defineRSR_Break_Error0×04#defineRSR_Parity_Error0×02#defineRSR_Framing_Error0×01/****************************************************************************//*LineControlHighByteRegister-LCRH*//****************************************************************************/#defineLCRH_Word_Length_80×60#defineLCRHWord_Length_70×40#defineLCRH_Word_Length_60×20<!--SIPO<DPn="26">--><dpn="d26"/>#defineLCRH_Word_Length50×00#defineLCRH_Fifo_Enabled0×10#defineLCRH_2_Stop_Bits0×08#defineLCRH_Even_Parity0×04#defineLCRH_Parity_Enable0×02#defineLCRH_Send_Break0×01/*****************************************************************************//*LineControlMediumByteRegister-LCRM*//*ThisregisterspecifiesthehighbyteoftheBaudratedivisor*//*****************************************************************************/#defineLCRM_Baud_4608000×00#defineLCRM_Baud_2304000×00#defineLCRM_Baud_1152000×00#defineLCRM_Baud_768000×00#defineLCRM_Baud_576000×00#defineLCRM_Baud_384000×00#defineLCRM_Baud_192000×00#defineLCRM_Baud_144000×00#defineLCRM_Baud_96000×00#defineLCRM_Baud_24000×01#defineLCRM_Baud_12000×02/*****************************************************************************//*LineControlLowByteRegister-LCRL*//*ThisregisterspecifiesthelowbyteoftheBaudratedivisor*//*****************************************************************************/#defineLCRL_Baud_4608000×01#defineLCRL_Baud_2304000×03#defineLCRL_Baud_1152000×07#defineLCRL_Baud_768000×0B#defineLCRL_Baud_576000×0F#defineLCRL_Baud_384000×17<!--SIPO<DPn="27">--><dpn="d27"/>#defineLCRL_Baud_192000×2F#defineLCRL_Baud_144000×3F#defineLCRL_Baud_96000×5F#defineLCRL_Baud_24000×7F#defineLCRL_Baud_12000×FF/*****************************************************************************//*ControlRegister-CR*//*****************************************************************************/#defineCR_Loop_Back_En0×80#defineCR_Timeout_Int_En0×40#defineCR_TX_Int_Ernable0×20#defineCR_RX_Int_Enable0×10#defineCR_ModStat_Int_En0×08#defineCR_UART_Enable0×01/*****************************************************************************//*FlagRegister-FR*//*****************************************************************************/#defineFR_TX_Fifo_Empty0×80#defineFR_RX_Fifo_Full0×40#defineFR_TX_FifoFull0×20#defineFR_RX_Fifo_Empty0×10#defineFR_Busy0×08#defineFR_Carrier_Detect0×04#defineFR_Set_Ready0×02#defineFR_Clear_To_Send0×01/*************************************************************************//*InterruptIdentificationRegister-IIR*//*************************************************************************/#defineIIR_RX_Time_Out0×08#defineIIR_TX0×04<!--SIPO<DPn="28">--><dpn="d28"/>#defineIIR_RX0×02#DefineIIR_Modem0×01#endifTYPEDEFS.H#ifndef__DELTATYPEDEFS__H#define__DELTATYPEDEFS__H/***FPC2010typedefinitions*/typedefunsignedcharu_char;typedefunsignedcharbool;typedefunsignedchar*addr8;#endif/*__DELTATYPEDEFS__H*/TIMER.H/*Timerlibraryfunctions*/#ifndef__TIMER_H#define__TIMER_H#defineSTART_TIMERO*TSTARTR=*TSTARTR|TIMERO_MASK;//Starttimer0#defineSTOP_TIMERO*TSTARTR=*TSTARTR&~TIMERO_MASK;//Stoptimer0externvoidtimerO_init(void);#endif<!--SIPO<DPn="29">--><dpn="d29"/>RANDOM.H/*Randomlibraryfunctions*/#ifndef__RANDOM_H#define__RANDOM_H//token#definetempa9102//Offentlign_gle1#definetempc12345678//Offentlign_gle2externdoubletoken(doublex);/*linearcongruentialgenerator.Generatorx[n+1]=a*x[n]modm*/#defineRAND_INT(l,h)(((int)(random()*((double)(h)-(l)+1)))+(l))externdoublerandom(void);externvoidrand_seed(unsignedint);#endifPORT.H/*Displaylibraryfunctions*/#ifndef__PORT_H#define__PORT_Hexternvoidport_init(void);#endif<!--SIPO<DPn="30">--><dpn="d30"/>RANDOM.H/*Randomlibraryfunctions*/#ifndef__RANDOM_H#define__RANDOM_H//token#definetempa9102//Offentlign_gle1#definetempc12345678//Offentlign_gle2externdoubletoken(doublex);/*linearcongruentialgenerator.Generatorx[n+1]=a*x[n]modm*/#defineRAND_INT(l,h)(((int)(random()*((double)(h)-(l)+1)))+(l))externdoublerandom(void);externvoidrand_seed(unsignedint);#endifPORT.H/*Displaylibraryfunctions*/#ifndef__PORT_H#define__PORT_Hexternvoidport_init(void);#endif<!--SIPO<DPn="31">--><dpn="d31"/>FPC2010REGISTERS.H//-------------------------------------------------------//Copyright(C)2003FingerprintCardsAB.AllRightsReserved//-------------------------------------------------------////Theinformationcontainedhereinisconfidentialpropertyof//FingerprintCardsAB.Theuse,copying,transferordisclosureofsuch//informationisprohibitedexceptbyexpresswrittenagreementwith//FingerprintCardsAB.////-------------------------------------------------------//Filefpc2010registers.h////DescriptionTheseregistersarethesoftwareinterfacetotheFPC2010//hardware.////HardwareplatformFPC6430////-------------------------------------------------------#ifndef__FPC2010REGISTERS__H#define__FPC2010REGISTERS__H/***Interrupt/Resetinterfaceregisters*/#defineInterruptMask((volatileaddr8)FPC_BASE)#defineInterrupt((volatileaddr8)(FPC_BASE+1))#defineSwReset((volatileaddr8)(FPC_BASE+3))/***Sensorinterfaceregisters<!--SIPO<DPn="32">--><dpn="d32"/>*/#defineSensorCommand((volatileaddr8)(FPC_BASE+33))#defineSensorParameter_LSB((volatileaddr8)(FPC_BASE+34))#defineSensorParameter_MSB((volatileaddr8)(FPC_BASE+35))#defineWaitCycles((volatileaddr8)(FPC_BASE+36))#defineStartCycles((volatileaddr8)(FPC_BASE+37))#defineCloseCycles((volatileaddr8)(FPC_BASE+38))#defineSensorReset((volatileaddr8)(FPC_BASE+39))#defineFingerDetect((volatileaddr8)(FPC_BASE+41))#defineClockDevisor((volatileaddr8)(FPC_BASE+42))/***WorkRAMinterfaceregisters*/#defineWorkRAMAddrPointer((volatileaddr8)(FPC_BASE+64))#defineWorkRAMWriteData((volatileaddr8)(FPC_BASE+65))#defineWorkRAMReadData((volatileaddr8)(FPC_BASE+66))/***VerificationresultRAMinteraceregisters*/#defineVerResultAddrPointer((volatileaddr8)(FPC_BASE+67))#defineVerResultWriteData((volatileaddr8)(FPC_BASE+68))#defineVerResultReadData((volatileaddr8)(FPC_BASE+69))/***FPRAMcontrolregisters*/#defineFP_RAM_Cmd((volatileaddr8)(FPC_BASE+128))#defineFP_RAM_Range((volatileaddr8)(FPC_BASE+130))#defineFP_RAM_Read((volatileaddr8)(FPC_BASE+131))#defineFP_RAM_Write((volatileaddr8)(FPC_BASE+132))<!--SIPO<DPn="33">--><dpn="d33"/>/***Parameterfileregisters*/#defineParameterFilePointer((volatileaddr8)(FPC_BASE+192))#defineParameterFileWrite((volatileaddr8)(FPC_BASE+193))#defineParameterFileRead((volatileaddr8)(FPC_BASE+195))/***AlgorithmCalculatingHardware(ACH)registers*/#defineACHCmd((volatileaddr8)(FPC_BASE+196))#defineAccLineOffset((volatileaddr8)(FPC_BASE+199))#defineAccPointOffset((volatileaddr8)(FPC_BASE+200))#defineTopLineLSB((volatileaddr8)(FPC_BASE+201))#defineTopLineMSB((volatileaddr8)(FPC_BASE+202))/***Flagsfortheinterruptregister*/#defineIRQ_SENSOR_FINGER_DETECT(1<<0)#defineIRQ_FPRAM_DATA_AVAILABLE(1<<1)#defineIRQ_FPRAM_ERROR(1<<2)#defineIRQ_SENSOR_COMPLETE(1<<3)#defineIRQ_MANUAL_CAPTURE(1<<4)#defineIRQ_ACH_COMPLETE(1<<6)/***Sensorcommandregister(ACHCmd)*/#defineACHCmd_ENROL0×3B#defineACHCmd_VERIFY0×5B<!--SIPO<DPn="34">--><dpn="d34"/>#defineACHCmd_ENROL_TEST0×3F#defineACHCmd_VERIFY_TEST0×5F#defineACHCmd_DELTA_XY0×5B/***Commandsforthesensorcommandregister(SensorCommand)*/#defineREAD_ALL_COL_BY_COL(0×88)#defineWRITE_DETECT(0×2E)#defineWRITE_DRIVE_C(0×AE)#defineWRITE_ADC_REF(0×6E)#defineREAD_INT_REGS(0×0A)/***Parametersforsettingupthesensor.*/#defineWAIT_REG_VALUE172#defineSTART_CYCLE_VALUE80#defineCLOSE_CYCLE_VALUE2#defineCLOCK_DEVISOR0/***ValuesfortheFPRAMregister(FP_RAM_Cmd)*/#definePREPARE_MEM_LOW_HALF0×01#definePREPARE_MEM_HIGH_HALF0×02#defineWRITE_MEM_LOW_HALF0×04#defineWRITE_MEM_HIGH_HALF0×08#defineREAD_MEM_LOW_ALF0×10#defineREAD_MEM_HIGH_HALF0×20<!--SIPO<DPn="35">--><dpn="d35"/>/***UsedasparameterstofunctionsthatdealswiththeFP_RAMinfpc2010.LOW_HALFmeans*lowmemoryhalfandHIGH_HALFmeanshighmemoryhalf.*/#defineLOW_HALF0#defineHIGH_HALF1/***Startupvaluesforsensorsregisters.*/#defineDETECT_STARTUP_VAL0×e8//=0×17onsensor,0//4//Startupvalueforthedetectregister.#defineDRIVC_STARTUP_VAL255//Startupvalueforthedrivcregister.#defineADCREF_STARTUP_VAL192//Startupvaluefortheadcrefregister./***Definitionsformemoryareasizesandoffsets.*/#defineNO_OF_TOP_LINES_REMOVED30#defineFPC2010_WORK_RAM_SIZE2048#defineFPC2010_VER_RESULT_RAM_SIZE1024/***Thesizeofatemplate*/#defineTEMPLATE_SIZE676#endif/*__FPC2010REGISTERS__H*/<!--SIPO<DPn="36">--><dpn="d36"/>FPC2010INTERFACE.H//--------------------------------------------------//Copyright(C)2003FingerprintCardsAB.AllRightsReserved//--------------------------------------------------////Theinformationcontainedhereinisconfidentialpropertyof//FingerprintCardsAB.Theuse,copying,transferordisclosureofsuch//informationisprohibitedexceptbyexpresswrittenagreementwith//FingerprintCardsAB.////--------------------------------------------------//Filefpc2010interface.h////DeseriptionInterfacedriverfortheFPC2010ASIC.////HardwareplatformFPC6430////---------------------------------------------------#ifndef__FPC2010INTERFACE__H#define__FPC2010INTERFACE__H/***Functions*/voidUploadVerResultRAMContent(u_char*buffer);voidUploadEnrolResult(u_char*enrolResult);voidDownloadVerData(u_char*templateBuffer);<!--SIPO<DPn="37">--><dpn="d37"/>voidClearlRQReg(void);voidSetlRQMask(void);voidSWReset(void);voidSetUpLineSensorStartUp(intdetect,intdrivc,intadcref);voidSetUpLineSensor(void);voidResetLineSensor(void);voidSetUpLineSensorDETECT(intvalue);voidSetUpLineSensorDRIVC(intvalue);voidSetUpLineSensorADCREF(intvalue);voidPolIIRQReg(unsignedcharirq);#endifFPC2010BIOMAIN.H//--------------------------------------------------//Copyright(C)2003FingerprintCardsAB.AllRightsReserved//--------------------------------------------------////Theinformationcontainedhereinisconfidentialpropertyof//FingerprintCardsAB.Theuse,copying,transferordisclosureofsuch//informatiornisprohibitedexceptbyexpresswrittenagreementwith//FingerprintCardsAB.////---------------------------------------------------//Filefpc2010.h////DescriptionBiometricfunctionsfortheFPC2010ASIC////Hardwareplatform////---------------------------------------------------<!--SIPO<DPn="38">--><dpn="d38"/>#ifndef__FPC2010__H#define__FPC2010__H/***Functions*/voidfpc2010On(void);voidfpc2010Off(void);voidfpc2010Init(void);boolfpc2010Enrol(u_char*templateBuffer);boolfpc2010Verify(u_har*templateBuffer);voidfpc2010LoadParameterFile(unsignedchar*parameters);#endif/*FPC2010*/ENCAPSULATED_ALG.H//-------------------------------------------------//Copyright(C)2003FingerprintCardsAB.AllRightsReserved//-------------------------------------------------////Theinformationcontainedhereinisconfidentialpropertyof//FingerprintCardsAB.Theuse,copying,transferordisclosureofsuch//informationisprohibitedexceptbyexpresswrittenagreementwith//FingerprintCardsAB.////-------------------------------------------------//Fileencapsulated_alg.h////DescriptionEncapsulatedalgorithminterface.//<!--SIPO<DPn="39">--><dpn="d39"/>//HardwareSwipesensor.////--------------------------------------------------------#ifndef__FPC2010HOST_ALG__H#define__FPC2010HOST_ALG__H#definePARAMETER_FILE_LENGTH72//Lengthofthefpc2010parametersinbytes.//Thesedefinesareusedasargumentstothefunctionget_fpc2010parameters().#defineENROL_PARAMETERS0//Getenrolparameters.#defineVERIFY_PARAMETERS1//Getverifyparameters.//Typedefsusedforfpc2010host_algtypedefshortintXHost_Int16;typedefintXHost_Int32;typedefunsignedcharXHost_UChar8;typedefsignedcharXHost_Char8;typedefunsignedcharXHost_Bool;XHost_BoolCreate_Template(XHost_UChar8*InputArray,XHost_UChar8*TemplateBuffer,XHost_UChar8PointOffset,XHost_Int16SwipeLength);XHost_BoolMatch_Data(XHost_UChar8*VerResultArray,XHost_UChar8*TemplateBuffer,XHost_Int16PointOffset,XHost_Int16SwipeLength);XHost_BoolPreVerify(XHost_UChar8*template_buffer,XHost_UChar8*FPC2010_ver_data);<!--SIPO<DPn="40">--><dpn="d40"/>XHost_UChar8*get_fpc2010_parameters(XHost_UChar8parameters_to_get);#endifDISPLAY.H/*Displaylibraryfunctions*/#ifndef__DISPLAY_H#define__DISPLAY_Hexternvoiditoa(int,char□);externvoidwrite(char*);externvoiddisplay_init(void);externvoiddisplay_test(void);#defineWRITE_DELAY25000#endifBPG.H/**include/hardware.h**/#ifndef__BPG_H#define__BPG_H#include″7092.h″<!--SIPO<DPn="41">--><dpn="d41"/>/*Thesemustbedefinedthroughthecompiler*//*#define__EVALUALTION_BOARD1*//*#define__RUN_WITH_EMULATOR1*//*#define_PICARD_BOARD_TEST0*//**BusControllersetupforHynixHMS39C7092Microcontroller*/#defineBCR0_PATTERN0×102//8bitbuswidth,3waitstates#defineBCR1_PATTERN0×100//8bitbuswidth,1waitstate/**PortmapforHynixHMS39C7092Microcontroller*///PinMuxsettings#definePAMR_PATTERN0×3fff//PA0GPIO-Power_NBATTLO//PA1GPIO-Power_STAT//PA2GPIO-Power_NCHAG//PA3GPIO-notused//PA4GPIO-notused(DISP_DATASEG-eval)//PA5GPIO-notused(DISP_NWRSEG-eval)//PA6GPIO-notused(DISP_NRDSEG-eval)//PA7GPIO-notused(DISP_NCSSEG-eval)#definePBMR_PATTERN0×0ff//PB0GPIO-notused//PB1GPIO-notused//PB2GPIO-notused//PB3GPIO-notused//PB4TMS//PB5TDO//PB6TDI<!--SIPO<DPn="42">--><dpn="d42"/>//PB7TCK#defineP1MR_PATTERN0×00//P10addressbit0//P11addressbit1//P12addressbit2//P13addressbit3//P14addressbit4//P15addressbit5//P16addressbit6//P17addressbit7#defineP2MR_PATTERN0×00//P20addressbit8//P21addressbit9//P22addressbit10//P23addressbit11//P24addressbit12//P25addressbit13//P26addressbit14//P27addressbit15-notused#defineP3MR_PATTERN0×ff//P30GPIO-notused//P31GPIO-notused//P32GPIO-notused//P33GPIO-notused//P34GPIO-notused//P35GPIO-notused//P36GPIO-notused//P37GPIO-notused#defineP4MR_PATTERN0×00//databus[7:0]#ifdef__EVALUALTION_BOARD#defineP5MR_PATTERN0×00//P50addressbit16//P51addressbit17//P52addressbit18//P53addressbit19#else<!--SIPO<DPn="43">--><dpn="d43"/>#defineP5MR_PATTERN0×0f//P50GPIO-DISP_DATASEG//P51GPIO-DISP_NWRSEG//P52GPIO-DISP_NRDSEG//P53GPIO-DISP_NCSSEG#endif#defineP6MR_PATTERN0×01b//P60GPIO-notused//P61GPIO-notused//P62GPIO-notused//P63nAS-businterfaceaddressstrobe//P64nRD-businterfaceread//P65nHWR-notused//P66nLWR-businterfacewritelower//P67BCLK-businterfaceclock-defaultio-pin#defineFPC2010_CLOCK_MUX_MASK0×20#defineP7MR_PATTERN0×1ff//P70GPIO-notused//P71GPIO-notused//P72GPIO-notused//P73GPIO-notused//P74GPIO-notused//P75GPIO-notused//P76GPIO-notused//P77GPIO-notused#defineP8MR_PATTERN0×0b//P80IRQ0-SIRQ//P81IRQ1-NIRQ//P82IRQ2-NIRQSEG//P83nCS1-Exteranlramchipselect//P84nCS0-FPC2010chipselectviaOR-gate#defineP9MR_PATTERN0×154//P90T×D0,//P91R×D0//P92GPIO-FPC2010_IFSEL//P93GPIO-FPC2010_RESET<!--SIPO<DPn="44">--><dpn="d44"/>//P94GPIO-notused//P95GPIO-notused//P96Doesnotexist//P97nTRST-JTAGreset//PortA#ifdef__EVALUALTION_BOARD#definePADDR_PATTERN0×00//alloutputsifenabledbypinmux#definePADR_PATTERN0×0f//setPA0-PA3to0andPA4-PA7to1#else#definePADDR_PATTERN0×07//bit0,1and2areinputs,allothersareoutputsifenabledbypinmux#definePADR_PATTERN0×00//allsetto0#endif#definePOWER_NBATTLO_MASK0×01#definePOWER_STAT_MASK0×02#definePOWER_NCHAG_MASK0×04#ifdef__EVALUALTION_BOARD#defineDISP_NCSSEG_MASK0×10#defineDISP_NRDSEG_MASK0×20#defineDISP_NWRSEG_MASK0×40#defineDISP_DATASEG_MASK0×80#endif//PortB#definePBDDR_PATTERN0×00//alloutputsifenabledbypinmux#definePBDR_PATTERN0×00//allsetto0//Port1<!--SIPO<DPn="45">--><dpn="d45"/>#defineP1DDR_PATTERN0×00//allinputsifenabledbypinmux#defineP1DR_PATTERN0×00//allsetto0//Port2#defineP2DDR_PATTERN0×00//alloutputsifenabledbypinmux#defineP2DR_PATTERN0×00//allsetto0//Port3#defineP3DDR_PATTERN0×00//alloutputsifenabledbypinmux#defineP3DR_PATTERN0×00//allsetto0//Port4#defineP4DDR_PATTERN0×00//alloutputsifenabledbypinmux#defineP4DR_PATTERN0×00//allsetto0//Port5#defineP5DDR_PATTERN0×0//alloutputsifenabledbypinmux#defineP5DR_PATTERN0×f//allsetto1#ifndef__EVALUALTION_BOARD#defineDISP_DATASEG_MASK0×01#defineDISP_NWRSEG_MASK0×02#defineDISP_NRDSEG_MASK0×04#defineDISP_NCSSEG_MASK0×08#endif//Port6#defineP6DDR_PATTERN0×00//alloutputsifenabledbypinmux#defineP6DR_PATTERN0×00//allsetto0#defineFPC2010_CLOCK_MASK0×80////Port7#defineP7DDR_PATTERN0×00//alloutputs<!--SIPO<DPn="46">--><dpn="d46"/>#defineP7DR_PATTERN0×00//allsetto0#defineEVAL_LED_MASK0×20//evaluationboardP75controlsLEDD1//Port8#defineP8DDR_PATTERN0×07//bit3and4areoutputs,allotherareinputsifenabledbypinmux#defineP8DR_PATTERN0×00//allsetto0#defineFPC1030_SIRQ_MASK0×01#defineFPC2010_NIRQ_MASK0×02#defineDISP_NIRQSEG_MASK0×04//Port9#defineP9DDR_PATTERN0×00//alloutputs#defineP9DR_PATTERN0×00//alloutputssetto0#defineP90_MASK0×01#defineP91_MASK0×02#defineFPC2010_IFSEL_MASK0×04//0:EBI,1:Uart#defineFPC2010_RESET_MASK0×08//Display#defineDISP_RAM_SIZE8//Sizeofdisplayregisterbanktouse#ifdef__EVALUALTION_BOARD#defineDISP_DRPADR#else#defineDISP_DRP5DR#endif//DisplayCommands#defineDISP_SYS_DIS0×001//0b100000000000invertedto0b000000000001#defineDISP_SYS_EN0×401//0b100000000010invertedto0b010000000001#defineDISP_LCD_OFF0×201//0b100000000100invertedto0b001000000001#defineDISP_LCD_ON0×601//0b100000000110invertedto0b011000000001<!--SIPO<DPn="47">--><dpn="d47"/>#defineDISP_BIAS_COM0×4a1//0b100001010010invertedto0b010010100001//Timers#defineTIMER0_CONTROL0×98//defaultvalue#defineTIMER0_IO_CONTROL0×88//defaultvalue#defineTIMER0_INT_CONTROL0×f8//defaultvalue,allinterruptsdisabled#defineTIMER0_COUNTER0×0000//defaultvalue,initalcounterregistervalue#defineTIMER0_MASK0×01//Usedtostartandstoptimer0//Fingerprintbaseaddress#defineFPC_BASE(CS0_base+0×30000)//Theflashisremaptoaddress0-0×2ffff#endif7092.H#ifndef__7092_H#define__7092_H#defineSYSTEM_CLOCK33000000//------------------------------------------------------------//constants//------------------------------------------------------------#defineMode_Bits0×1F#defineMode_FIQ0×11#defineMode_IRQ0×12#defineMode_SVC0×13#defineMode_USR0×10<!--SIPO<DPn="48">--><dpn="d48"/>#defineI_Bit0×80#defineF_Bit0×40#defineSM0//-------------------------------------------------//MCUBaseAddressMap//-------------------------------------------------//0×09001000-0×09001FFFPeripherals(APBbridge)//0×09001800-0×09001FFFReserved//0×09001900-0×090019FFADCregister//0×09001800-0×090018FFADCregister//0×09001600-0×090017FFPIOregister//0×09001600-0×090016FFSSIregister//0×09001500-0×090015FFUART1register//0×09001400-0×090014FFUART0register//0×09001300-0×090013FFTIMERregister//0×09001200-0×090012FFINTCregister//0×09001100-0×090011FFWDTregister//0×09001000-0×090010FFPMUregister//0×09000000-0×09000FFFASBRegister//0×09000400-0×09000FFFReserved//0×09000300-0×090003FFARM7TDMITestregister//0×09000200-0×090002FFFMIregister//0×09000100-0×090001FFSMIregister//0×09000000-0×090000FFMCUCregister//0×08050000-0×08FFFFFFReserved//0×08040000-0×0804FFFFOn-ChipBootROM//0×08030000-0×0803FFFFOn-ChipSRAM(4KB)//0×08000000-0×0802FFFFFLASH(192KB)//0×00000000-0×07FFFFFFStaticMemoryArea////MODE0,1,2,3(SM=0)<!--SIPO<DPn="49">--><dpn="d49"/>//0×07000000-0×07FFFFFFnCS7//0×06000000-0×06FFFFFFnCS6//0×05000000-0×05FFFFFFnCS5//0×04000000-0×04FFFFFFnCS4//0×03000000-0×03FFFFFFnCS3//0×02000000-0×02FFFFFFnCS2//0×01000000-0×01FFFFFFnCS1//0×00000000-0×00FFFFFFnCS0(Remap=0)//0×00000000-0×00000FFFOn-ChipSRAM(4KB)(Remap=1)////MODE0,1,2,3(SM=1)//0×00700000-0×007FFFFFnCS7//0×00600000-0×006FFFFFnCS6//0×00500000-0×005FFFFFnCS5//0×00400000-0×004FFFFFnCS4//0×00300000-0×003FFFFFnCS3//0×00200000-0×002FFFFFnCS2//0×00100000-0×001FFFFFnCS1//0×00000000-0×000FFFFFnCS0(Remap=0)//0×00000000-0×00000FFFOnChipSRAM(4KB)(Remap=1)////MODE4,5(SM=0)//0×07000000-0×07FFFFFFnCS7//0×06000000-0×06FFFFFFnCS6//0×05000000-0×05FFFFFFnCS5//0×04000000-0×04FFFFFFnCS4//0×03000000-0×03FFFFFFnCS3//0×02000000-0×02FFFFFFnCS2//0×01000000-0×01FFFFFFnCS1//0×00000000-0×00FFFFFFnCS0(Remap=0)//0×00000000-0×0002FFFFFLASH(192KB)//0×00000000-0×00000FFFOnChipSRAM(4KB)(Remap=1)//<!--SIPO<DPn="50">--><dpn="d50"/>//MODE4,5(SM=1)//0×00700000-0×007FFFFFnCS7//0×00600000-0×006FFFFFnCS6//0×00500000-0×005FFFFFnCS5//0×00400000-0×004FFFFFnCS4//0×00300000-0×003FFFFFnCS3//0×00200000-0×002FFFFFnCS2//0×00100000-0×001FFFFFnCS1//0×00000000-0×000FFFFFnCS0(Remap=0)//0×00000000-0×0002FFFFFLAH(192KB)//0×00000000-0×00000FFFOn-ChipSRAM(4KB)(Remap=1)////MODE6,7(SM=0)//0×07000000-0×07FFFFFFnCS7//0×06000000-0×06FFFFFFnCS6//0×05000000-0×05FFFFFFnCS5//0×04000000-0×04FFFFFFnCS4//0×03000000-0×03FFFFFFnCS3//0×02000000-0×02FFFFFFnCS2//0×01000000-0×01FFFFFFnCS1//0×00000000-0×00FFFFFFnCS0(Remap=0)//0×00000000-0×000000FFOn-ChipBootROM(256Byte)(default)//0×00000000-0×0002FFFFFLASH(192KB)(FLASH=1)//0×00000000-0×00000FFFOn-ChipSRAM(4KB)(Remap=1)////MODE6,7(SM=1)//0×00700000-0×007FFFFFnCS7//0×00600000-0×006FFFFFnCS6//0×00500000-0×005FFFFFnCS5//0×00400000-0×004FFFFFnCS4//0×00300000-0×003FFFFFnCS3//0×00200000-0×002FFFFFnCS2//0×00100000-0×001FFFFFnCS1<!--SIPO<DPn="51">--><dpn="d51"/>//0×00000000-0×000FFFFFnCS0(Remap=0)//0×00000000-0×000000FFOn-ChipBootROM(256Byte)(default)//0×00001000-0×0002FFFFFLAH(192KB)(FLASH=1)//0×00000000-0×00000FFFOn-ChipSRAM(4KB)(Remap=1)//#defineADC_base0×09001700#defineGPIO_base0×09001600#defineUART1_base0×09001500#defineUART0_base0×09001400#defineTIMER_base0×09001300#defineINTC_base0×09001200#defineWDT_base0×09001100#definePMU_base0×09001000#definePERI_base0×09001000#defineARM_test0×09000300#defineFMI_ctrl0×09000200#defineBUS_ctrl0×09000100#defineMCU_ctrl0×09000000#defineBOOTROM_base0×08040000#defineISRAM_base0×08030000#defineFLASH_base0×08000000#defineEXCS_base0×00000000#ifSM==0//--------------------------------------------//StaticMemoryInterfaceMap(16M)(0×00000000-0×07FFFFFF)//SM=0//--------------------------------------------#defineCS7_base0×07000000#defineCS6_base0×06000000#defineCS5_base0×05000000#defineCS4_base0×04000000<!--SIPO<DPn="52">--><dpn="d52"/>#defineCS3_base0×03000000#defineCS2_base0×02000000#defineCS1_base0×01000000#defineCS0_base0×00000000#else//--------------------------------------//StaticMemoryInterfaceMap(1M)(0×00000000-0×007FFFFF)//SM=1//--------------------------------------#defineCS7_base0×00700000#defineCS6_base0×00600000#defineCS5_base0×00500000#defineCS4_base0×00400000#defineCS3_base0×00300000#defineCS2_base0×00200000#defineCS1_base0×00100000#defineCS0_base0×00000000#endif/---------------------------------------//ASBRegisterMemoryMap(0×09000000-0×09000FFF)//--------------------------------------//--------------------------------------//MCUcontrolMap(0×09000000-0×090000FF)//--------------------------------------#definePAMR((volatileunsignedint*)(MCU_ctrl+0×00))#definePBMR((volatileunsignedint*)(MCU_ctrl+0×04))#defineP1MR((volatileunsignedint*)(MCU_ctrl+0×08))#defineP2MR((volatileunsignedint*)(MCU_ctrl+0×0C))#defineP3MR((volatileunsignedint*)(MCU_ctrl+0×10))#defineP4MR((volatileunsignedint*)(MCU_ctrl+0×14))#defineP5MR((volatileunsignedint*)(MCU_ctrl+0×18))#defineP6MR((volatileunsignedint*)(MCU_ctrl+0×1C))<!--SIPO<DPn="53">--><dpn="d53"/>#defineP7MR((volatileunsignedint*)(MCU_ctrl+0×20))#defineP8MR((volatileunsignedint*)(MCU_ctrl+0×24))#defineP9MR((volatileunsignedint*)(MCU_ctrl+0×28))#defineDCR((volatileunsignedint*)(MCU_ctrl+0×2C))//--------------------------------------//SMIRegisterMap(0×09000100-0×090001FF)//--------------------------------------//313029282726242322-2019-16//151413121110876-43-0//RDONCSCNTLFalshExpCLKMemWidthBurstEnBurstWaitNorWait//lcdCSONLCDWait(21-16)//CSON#defineBCR0((volatileunsignedint*)(BUS_ctrl+0×00))#defineBCR1((volatileunsignedint*)(BUS_ctrl+0×04))#defineBCR2((volatileunsignedint*)(BUS_ctrl+0×08))#defineBCR3((volatileunsignedint*)(BUS_ctrl+0×0C))#defineBCR4((volatileunsignedint*)(BUS_ctrl+0×10))#defineBCR5((volatileunsignedint*)(BUS_ctrl+0×14))#defineBCR6((volatileunsignedint*)(BUS_ctrl+0×18))#defineBCR7((volatileunsignedint*)(BUS_ctrl+0×1C))//----------------------------------------//FMIRegisterMap(0×09000200-0×090002FF)//----------------------------------------//FSTATPWRR{HVEEI,LVEEI,LVCC_RST,VEEIOPT[1:0],VPPDOPT[1:0],VPPIOPT[1:0]}//SSSPPP//Sstatus(Readonly);PPoweroptionregister(ReadAWrite)#defineFMWR((volatileunsignedint*)(FMI_ctrl+0×00))//R/WBuswaitcontrolregister#deefineFMAR((volatileunsignedint*)(FMI_ctrl+0×04))//WRITEADDRR,DATARaddress,READADDRR<!--SIPO<DPn="54">--><dpn="d54"/>#defineFMDR((volatileunsignedint*)(FMI_ctrl+0×08))//READDATAR(readonlyregister)#defineFMCR((volatileunsignedint*)(FMI_ctrl+0×0C))//R/Wflashcontrolregister#defineFEBR((volatileunsignedint*)(FMI_ctrl+0×10))//R/Wflasheraseblockregister#defineFMPR((volatileunsignedint*)(FMI_ctrl+0×14))//statuspoweroptionregister.#defineFMTR((volatileunsignedint*)(FMI_ctrl+0×18))//R/Wflashtestregister//------------------------------------------//Peripherals(APBbridge)Map(0×09001000-0×09001FFF)//------------------------------------------//------------------------------------------//PMUMap(0×09001000-0×090010FF)//------------------------------------------#definePMUST((volatileunsignedint*)(PMU_base+0×00))//PMUoperationmodecontrolregister#definePMUCR((volatileunsignedint*)(PMU_base+0×00))//PMUoperationmodecontrolregister#defineMEMCR((volatileunsignedint*)(PMU_base+0×10))//RemapControlRegister#defineRSTCR((volatileunsignedint*)(PMU_base+0×30))//SoftResetControlRegister#definePCKCR((volatileunsignedint*)(PMU_base+0×08))//PCLKcontrolregister//----------------------------------------//Watch-DogTimer(WDT)Map(0×09001100-0×090011FF)//----------------------------------------#defineWTCR((volatileunsignedint*)(WDT_base+0×00))//Timer/ResetControlRegister(R/W)<!--SIPO<DPn="55">--><dpn="d55"/>#defineWTSR((volatileunsignedint*)(WDT_base+0×04))//ResetStatusRegister(R)#defineWTCNT((volatileunsignedint*)(WDT_base+0×08))//TimerCounterRegister(R/W)//------------------------------------------------//IntrruptController(INTC)Map(0×09001200-0×090012FF)/-------------------------------------------------#defineGMR((volatileunsignedint*)(INTC_base+0×00))//GlobalMaskRegister#defineTMR((volatileunsignedint*)(INTC_base+0×04))//TriggerModeRegister#defineTPR((volatileunsignedint*)(INTC_base+0×08))//TriggerPolarityRegister#defineIDR((volatileunsignedint*)INTC_base+0×0C))//InterruptDirectionRegister#defineFSR((volatileunsignedint*)(INTC_base+0×10))//FIQStatusRegister#defineISR((volatileunsignedint*)(INTC_base+0×14))//IRQStatusRegister#defineFMR((volatileunsignedint*)(INTC_base+0×18))//FIQMaskRegister#defineIMR((volatileunsignedint*)(INTC_base+0×1C))//IRQMaskRegister#defineISCR((volatileunsignedint*)(INTC_base+0×20))//StatusClearRegister#defineIB_IRQ00×00001#defineIB_IRQ10×00002#defineIB_IRQ20×00004#defineIB_IRQ30×00008#defineIB_IRQ40×00010#defineIB_IRQ50×00020<!--SIPO<DPn="56">--><dpn="d56"/>#defineIB_IRQ60×00040#defineIB_IRQ70×00080#defineIB_COMTX0×00100#defineIB_COMRX0×00200#defineIB_WDT0×00400#defineIB_UART00×00800#defineIB_UART10×01000#defineIB_ADC0×02000#defineIB_TIMER00×04000#defineIB_TIMER10×08000#defineIB_TIMER20×10000#defineIB_TIMER30×20000#defineIB_TIMER40×40000#defineIB_TIMER50×80000#defineIB_SWI0×100000#defineIB_EXIRQ0×0000ff#defineIB_TIMER_ALL0×0fc0#defineID_IRQ00×00#defineID_IRQ10×01#defineID_IRQ20×02#defineID_IRQ30×03#defineID_IRQ40×04#defineID_IRQ50×05#defineID_IRQ60×06#defineID_IRQ70×07#defineID_COMTX0×08#defineID_COMRX0×09#defineID_WDT0×0A#defineID_UART00×0B#defineID_UART10×0C#defineID_ADC0×0D<!--SIPO<DPn="57">--><dpn="d57"/>#defineID_TIMER00×0E#defineID_TIMER10×0F#defineID_TIMER20×10#defineID_TIMER30×11#defineID_TIMER40×12#defineID_TIMER50×13#defineID_SWI0×14//------------------------------------------//TIMERRegisterMap(0×FFFFF000-0×FFFFFFFF)//------------------------------------------//==================================================================//[Timerregisterdescription]//==================================================================//TSTARTRTimerstartregister//TSYNCRTimersyncregister//TPWMRTimerPWMregister//------------------------------------------//Timercontrolregister//TCRx[7],[4:3]reserved(initvauleall1)//[6:5]00->freerunning//01->clearbyGRAcommat,TPAinputcapture//10->clearbyGRBcommat,TPBinputcapture//11->clearedbyothersynctimer//[2:0]000->int_clk1(BCLK/2),001->int_clk2(/4)//010->int_clk3(/8),011->int_clk4(/16)//100->ext_clk1,101->ext_clk2//110->ext_clk3,111->ext_clk4//------------------------------------------//I/Ocontrolregister//TIOCRx[7],[3]reserved(initvauleall1)//[6:4]000->pinoutputdisableatcommat//001->0GRBmatch,010->1GRBmatch<!--SIPO<DPn="58">--><dpn="d58"/>//011->toggleGRBmatch//100->GRBcaptureatrising//101->GRBcaptureatfalling//110->GRBcaptureatbothegde//[2:0]Sameas[6:4],forGRA//----------------------------------------------//Timerinterruptenableregister//TIERx[7:3]reserved(initvauleall1)//[2]interruptfromOVFI(1enable,0disable)//[1]interruptfromMCIB(1enable,0disable),GRB//interruptfromMCIA(1enable,0disable),GRA//----------------------------------------------//Timerstatusregister//TSRx[7:3]reserved(initvauleall1)//[2]OVFIstatus//[1]MCIBstatus//MCIAstatus//----------------------------------------------//TCOUNTxTimercount(16bit)//GRAx,GRBxGeneralregister(16bit)//----------------------------------------------#defineTSTARTR((volatileunsignedint*)(TIMER_base+0×00))//TimerStartRegister#defineTSYNCR((volatileunsignedint*)(TIMER_base+0×04))//TimerSynchRegister#defineTPWMR((volatileunsignedint*)(TIMER_base+0×08))//TimerPWMmodeRegister#defineTCR0((volatileunsignedint*)(TIMER_base+0×20))//TimerControlRegister#defineTIOCR0((volatileunsignedint*)(TIMER_base+0×24))//TimerI/OControlRegister<!--SIPO<DPn="59">--><dpn="d59"/>#defineTIER0((volatileunsignedint*)(TIMER_base+0×28))//TimerInterruptEnableRegister#defineTSR0((volatileunsignedint*)(TIMER_base+0×2C))//TimerStatusRegister#defineTCNT0((volatileunsignedibt*)(TIMER_base+0×30))//TimerCounter#defineGRA0((volatileunsignedint*)(TIMER_base+0×34))//GeneralRegisterA#defineGRB0((volatileunsignedint*)(TIMER_base+0×38))//GeneralRegisterB#defineTCR1((volatileunsignedint*)(TIMER_base+0×40))//TimerControlRegister#defineTIOCR1((volatileunsignedint*)(TIMER_base+0×44))//TimerI/OControlRegister#defineTIER1((volatileunsignedint*)(TIMER_base+0×48))//TimerInterruptEnableRegister#defineTSR1((volatileunsignedint*)(TIMER_base+0×4C))//TimerStatusRegister#defineTCNT1((volatileunsignedint*)(TIMER_base+0×50))//TimerCounter#defineGRA1((volatileunsignedint*)(TIMER_base+0×54))//GeneralRegisterA#defineGRB1((volatileunsignedint*)(TIMER_base+0×58))//GeneralRegisterB#defineTCR2((volatileunsignedint*)(TIMER_base+0×60))//TimerControlRegister#defineTIOCR2((volatileunsignedint*)(TIMER_base+0×64))//TimerI/OControlRegister#defineTIER2((volatileunsignedint*)(TIMER_base+0×68))//TimerInterruptEnableRegister<!--SIPO<DPn="60">--><dpn="d60"/>#defineTSR2((volatileunsignedint*)(TIMER_base+0×6C))//TimerStatusRegister#defineTCNT2((volatileunsignedint*)(TIMER_base+0×70))//TimerCounter#defineGRA2((volatileunsignedint*)(TIMER_base+0×74))//GeneralRegisterA#defineGRB2((volatileunsignedint*)(TIMER_base+0×78))//GeneralRegisterB#defineTCR3((volatileunsignedint*)(TIMER_base+0×80))//TimerControlRegister#defineTIOCR3((volatileunsignedint*)(TIMER_base+0×84))//TimerI/OControlRegister#defineTIER3((volatileunsignedint*)(TIMER_base+0×88))//TimerInterruptEnableRegister#defineTSR3((volatileunsignedint*)(TIMER_base+0×8C))//TimerStatusRegister#defineTCNT3((volatileunsignedint*)(TIMER_base+0×90))//TimerCounter#defineGRA3((volatileunsignedint*)(TIMER_base+0×94))//GeneralRegisterA#defineGRB3((volatileunsignedint*)(TIMER_base+0×98))//GeneralRegisterB#defineTCR4((volatileunsignedint*)(TIMER_base+0×A0))//TimerControlRegister#defineTIOCR4((volatileunsignedint*)(TIMER_base+0×A4))//TimerI/OControlRegister#defineTIER4((volatileunsignedint*)(TIMER_base+0×A8))//TimerInterruptEnableRegister#defineTSR4((volatileunsignedint*)(TIMER_base+0×AC))//TimerStatusRegister<!--SIPO<DPn="61">--><dpn="d61"/>#defineTCNT4((volatileunsignedint*)(TIMER_base+0×B0))//TimerCounter#defineGRA4((volatileunsignedint*)(TIMER_base+0×B4))//GeneralRegisterA#defineGRB4((volatileunsignedint*)(TIMER_base+0×B8))//GeneralRegisterB#defineTCR5((volatileunsignedint*)(TIMER_base+0×D0))//TimerControlRegister#defineTIOCR5((volatileunsignedint*)(TIMER_base+0×D4))//TimerI/OControlRegister#defineTIER5((volatileunsignedint*)(TIMER_base+0×D8))//TimerInterruptEnableRegister#defineTSR5((volatileunsignedint*)(TIMER_base+0×DC))//TimerStatusRegister#defineTCNT5((volatileunsignedint*)(TIMER_base+0×E0))//TimerCounter#defineGRA5((volatileunsignedint*)(TIMER_base+0×E4))//GeneralRegisterA#defineGRB5((volatileunsignedint*)(TIMER_base+0×E8))//GeneralRegisterB//----------------------------------------------//UARTRegisterMap(0×09001400-0×090015FF)//----------------------------------------------#defineRBR0×00#defineTHR0×00#defineDLL0×00//ReceiverBufferReg.(RDLAB=0)//TransmitterHoldingReg.(WDLAB=0)//DivisorLatchLS(R/WDLAB=1)<!--SIPO<DPn="62">--><dpn="d62"/>#defineIER0×04#defineDLM0×04//InterruptEnableReg.(R/WDLAB=0)//DivisorLatchMS(R/WDLAB=1)#defineIIR0×08#defineFCR0×08//InterruptIdentReg.(R)//DivisorLatchMS(R/WDLAB=1)#defineLCR0×0c//LineControlReg.(R/W)#defineLSR0×14//LineStatusReg.(R/W)#defineSCR0×1C//ScratchReg.#defineCLKCR0×20//CLKgenerationControlReg.#defineCLKDR0×24//CLKdivisorReg.#defineLSR_DR0×01#defineLSR_THRE0×20#defineLSR_TEMPT0×40#defineIER_TIE0×02#efineIER_RIE0×01//--------------------------------------------------//UART0RegisterMap(0×09001400_0×090014FF)//--------------------------------------------------#defineU0RBR((volatileunsignedint*)(UART0_base+RBR))#defineU0THR((volatileunsignedint*)(UART0_base+THR))#defineU0DLL((volatileunsignedint*)(UART0_base+DLL))#defineU0IER((volatileunsignedint*)(UART0_base+IER))#defineU0DLM((volatileunsignedint*)(UART0_base+DLM))#defineU0IIR((volatileunsignedint*)(UART0_base+IIR))#defineU0FCR((volatileunsignedint*)(UART0_base+FCR))#defineU0LCR((volatileunsignedint*)(UART0_base+LCR))#defineU0MCR((volatileunsignedint*)(UART0_base+MCR))#defineU0LSR((volatileunsignedint*)(UART0_base+LSR))#defineU0MSR((volatileunsignedint*)(UART0_base+MSR))<!--SIPO<DPn="63">--><dpn="d63"/>#defineU0SCR((volatileunsignedint*)(UART0_base+SCR))#defineU0Enable((volatileunsignedint*)(UART0_base+CLKCR))#defineU0Prescale((volatileunsignedint*)(UART0_base+CLKDR))//----------------------------------------------//UART1RegisterMap(00×09001500-0×090015FF)//----------------------------------------------#defineU1RBR((volatileunsignedint*)(UART1_base+RBR))#defineU1THR((volatileunsignedint*)(UART1_base+THR))#defineU1DLL((volatileunsignedint*)(UART1_base+DLL))#defineU1IER((volatileunsignedint*)(UART1_base+IER))#defineU1DLM((volatileunsignedint*)(UART1_base+DLM))#defineU1IIR((volatileunsignedint*)(UART1_base+IIR))#defineU1FCR((volatileunsignedint*)(UART1_base+FCR))#defineU1LCR((volatileunsignedint*)(UART1_base+LCR))#defineU1MCR((volatileunsignedint*)(UART1_base+MCR))#defineU1LSR((volatileunsignedint*)(UART1_base+LSR))#defineU1MSR((volatileunsignedint*)(UART1_base+MSR))#defineU1SCR((volatileunsignedint*)(UART1_base+SCR))#defineU1Enable((volatileunsignedint*)(UART1_base+CLKCR))#defineU1Prescale((volatileunsignedint*)(UART1_base+CLKDR))//----------------------------------------------//PIORegisterMap(00×09001600-0×090016FF)//----------------------------------------------#definePADR((volatileunsignedint*)(GPIO_base+0×00))//PADataRegister#definePADDR((volatileunsignedint*)(GPIO_base+0×04))//PADataDirectionRegister#definePBDR((volatileunsignedint*)(GPIO_base+0×08))//PBDataRegister#definePBDDR((volatileunsignedint*)(GPIO_base+0×0C))//PBDataDirectionRegister<!--SIPO<DPn="64">--><dpn="d64"/>#defineP1DR((volatileunsignedint*)(GPIO_base+0×10))//P1DataRegister#defineP1DDR((volatileunsignedint*)(GPIO_base+0×14))//P1DataDirectionRegister#defineP2DR((volatileunsignedint*)(GPIO_base+0×18))//P2DataRegister#defineP2DDR((volatileunsignedint*)(GPIO_base+0×1C))//P2DataDirectionRegister#defineP3DR((volatileunsignedint*)(GPIO_base+0×20))//P3DataRegister#defineP3DDR((volatileunsignedint*)(GPIO_base+0×24))//P3DataDirectionRegister#defineP4DR((volatileunsignedint*)(GPIO_base+0×28))//P4DataRegister#defineP4DDR((volatileunsignedint*)(GPIO_base+0×2c))//P4DataDirectionRegister#defineP5DR((volatileunsignedint*)(GPIO_base+0×30))//P5DataRegister#defineP5DDR((volatileunsignedint*)(GPIO_base+0×34))//P5DataDirectionRegister#defineP6DR((volatileunsignedint*)(GPIO_base+0×38))//P6DataRegister#defineP6DDR((volatileunsignedint*)(GPIO_base+0×3C))//P6DataDirectionRegister#defineP7DR((volatileunsignedint*)(GPIO_base+0×40))//P7DataRegister#defineP7DDR((volatileunsignedint*)(GPIO_base+0×44))//P7DataDirectionRegister#defineP8DR((volatileunsignedint*)(GPIO_base+0×48))//P8DataRegister#defineP8DDR((volatileunsignedint*)(GPIO_base+0×4c))//P8DataDirectionRegister<!--SIPO<DPn="65">--><dpn="d65"/>#defineP9DR((volatileunsignedint*)(GPIO_base+0×50))//P9DataRegister#defineP9DDR((volatileunsignedint*)(GPIO_base+0×54))//P9DataDirectionRegister//-------------------------------------------------//ADCRegisterMap(00×09001700-0×090017FF)/--------------------------------------------------#defineADCSR((volatileunsignedint*)(ADC_base+0×00))//ADCControl&StatusRegister#defineADCCR((volatileunsignedint*)(ADC_base+0×04))//ADCControlRegister#defineADDR0((volatileunsignedint*)(ADC_base+0×08))//ADCDataRegister0#defineADDR1((volatileunsignedint*)(ADC_base+0×0c))//ADCDataRegister1#defineADDR2((volatileunsignedint*)(ADC_base+0×10))//ADCDataRegister2#defineADDR3((volatileunsignedint*)(ADC_base+0×14))//ADCDataRegister3#defineADDR4((volatileunsignedint*)(ADC_base+0×18))//ADCDataRegister4#endifUTILITY.C/*Miscellaneousutilities*/#include″bpg.h″#include″display.h″voiddelay(intcount)<!--SIPO<DPn="66">--><dpn="d66"/>{/*loop__asm{*//*subsr0,r0,#1*//bgtloop*//}*/while(count){count=count-1;/*count--;Thisconstructiondoesnotwork?*/}}voidmessage(char*s){write(s);delay(2*WRITE_DELAY);write(″″);delay(WRITE_DELAY);write(s);delay(2*WRITE_DELAY);write(″″);delay(WRITE_DELAY);write(″reAdy″);delay(2*WRITE_DELAY);}unsignedintbattery_check(void){unsignedintbattery_status;unsignedintpower_status;power_status=*PADR&POWER_NCHAG_MASK;battery_status=*PADR&POWER_NBATTLO_MASK;<!--SIPO<DPn="67">--><dpn="d67"/>if(power_status){if(battery_status){return0;}else{message(″BAttLo″);return1;}}return0;}TIMER.C/*Timerutilities*/#include″7092.h″#include″bpg.h″#include″timer.h″voidtimer0_init(void){*TCR0=TIMER0_CONTROL;//freerunningmode*TIOCR0=TIMER0_IO_CONTROL;//dontcareinfreerunningmode*TIER0=TIMER0_INT_CONTROL;//disableallinterrupts*TCNT0=TIMER0_COUNTER;//clearcounterregister}RETARGET.C/***Copyright(C)ARMLimited,2001.Allrightsreserved.<!--SIPO<DPn="68">--><dpn="d68"/>*//***Thisimplementsa′retarget′layerforlow-levelIO.Typically,this**wouldcontainyourowntarget-dependentimplementationsoffputc(),**ferror(),etc.****Thisexampleprovidesimplementationsof__user_initial_stackheap().***/#include<stdio.h>#include<rt_misc.h>externunsignedintbottom_of_heap;__value_in_regsstruct__initial_stackheap__user_initial_stackheap(unsignedR0,unsignedSP,unsignedR2,unsignedSL){struct__initial_stackheapconfig;config.heap_base=(unsignedint)&bottom_of_heap;//definedinheap.s//placedbyscatterfileconfig.stack_base=SP;//inheritSPfromtheexecutionenvironmentreturnconfig;}/*Belowisanequivalentexampleassemblerversionof__user_initial_stackheap.Itwillbeenteredwiththevalueofthestackpointerinr1(assetininit.s),thisdoesnotneedtobechangedandsocanbepassedunmodifiedoutofthe<!--SIPO<DPn="69">--><dpn="d69"/>function.IMPORTbottom_of_heapEXPORT__user_initial_stackheap__user_initial_stackheapLDRr0,=bottom_of_heapMOVpc,lr*/RANDOM.C/*linearcongruentialgenerator.Generatorx[n+1]=a*x[n]modm*/#include″random.h″#include″math.h″staticunsignedintSEED=93186752;doublerandom(void){/*Thefollowingparametersarerecommendedsettingsbasedonresearchuncommenttheoneyouwant.*/staticunsignedinta=1588635695,m=4294967291U,q=2,r=1117695901;/*staticunsignedinta=1223106847,m=4294967291U,q=3,r=625646750;*//*staticunsignedinta=279470273,m=42g4967291U,q=15,r=102913196;*//*staticunsignedinta=1583458089,m=2147483647,q=1,r=564025558;*//*staticunsignedinta=784588716,m=2147483647,q=2,r=578306215;*//*staticunsignedinta=16807,m=2147483647,q=127773,r=2836;*//*staticunsignedinta=950706376,m=2147483647,q=2,r=246070895;*/SEED=a*(SEED%q)-r*(SEED/q);<!--SIPO<DPn="70">--><dpn="d70"/>return((double)SEED/(double)m);}voidrand_Seed(unsignedintinit){if(init!=0)SEED=init;}//tokendoubletoken(doublex){doublev=100000000000LL;doubled=0;doubleg=0;x=(tempa*x)+tempc;while(x>=1000){d=x-(10*floor(x/10));if(x<v){g=(10*g)+d;v=v/10;}x=(x-d)/10;}returng;}PORT.C/*Displayutilities*/#include″7092.h″#include″bpg.h″<!--SIPO<DPn="71">--><dpn="d71"/>voidport_init(){//Portcontrol*PADR=PADR_PATTERN;*PADDR=PADDR_PATTERN;*PBDR=PBDR_PATTERN;*PBDDR=PBDDR_PATTERN;*P1DR=P1DR_PATTERN;*P1DDR=P1DDR_PATTERN;*P2DR=P2DR_PATTERN;*P2DDR=P2DDR_PATTERN;*P3DR=P3DR_PATTERN;*P3DDR=P3DDR_PATTERN;*P4DR=P4DR_PATTERN;*P4DDR=P4DDR_PATTERN;*P5DR=P5DR_PATTERN;*P5DDR=P5DDR_PATTERN;*P6DR=P6DR_PATTERN;*P6DDR=P6DDR_PATTERN;*P7DR=P7DR_PATTERN;*P7DDR=P7DDR_PATTERN;*P8DR=P8DR_PATTERN;*P8DDR=P8DDR_PATTERN;*P9DR=P9DR_PATTERN;*P9DDR=P9DDR_PATTERN;//Muxcontrol*PAMR=PAMR_PATTERN;*PBMR=PBMR_PATTERN;*P1MR=P1MR_PATTERN;*P2MR=P2MR_PATTERN;*P3MR=P3MR_PATTERN;*P4MR=P4MR_PATTERN;<!--SIPO<DPn="72">--><dpn="d72"/>*P5MR=P5MR_PATTERN;*P6MR=P6MR_PATTERN;*P7MR=P7MR_PATTERN;*P8MR=P8MR_PATTERN;*P9MR=P9MR_PATTERN;}MAIN.C/**SmartCardpincodegeneratorwithfingerprintaccesscontrol**Copyright(C)2001DELTAICDesign,AllRightsReserved.**$AuthorIbm$**$Idprint.asm,v1.122002/11/2114:29:14IbmExp$**/#include″typdefs.h″#include″bpg.h″#include″utility.h″#include″port.h″#include″display.h″#include″timer.h″#include″random.h″#include″fpc2010biomain.h″#include″fpc2010interface.h″#include″encapsulated_alg.h″#include″fpc2010registers.h″<!--SIPO<DPn="73">--><dpn="d73"/>unsignedchardisp_ram[DISP_RAM_SIZE];unsignedchartemplate[TEMPLATE_SIZE];voidwait_for_finger_detected(){while(!(*P8DR&FPC1030_SIRQ_MASK)){}}voidtest(){charstr[9];unsignedinttok=2674834;unsignedintrand;boolresult;port_init();timer0_init();START_TIMER0;display_init();write(″reAdy″);delay(2*WRITE_DELAY);#ifndefDEBUG#ifndef__EVALUALTION_BOARDbattery_check();#endifSTOP_TIMER0;<!--SIPO<DPn="74">--><dpn="d74"/>rand_seed(*TCNT0);rand=RAND_INT(10000000,99999999);tok=rand;fpc2010lnit();wait_for_finger_detected();result=fpc2010Enrol(template);if(!result){write(″Error″);}else{write(″Good″);}delay(2*WRITE_DELAY);write(″yyyyyyyy″);delay(2*WRITE_DELAY);while(1){tok=(unsignedint)token((double)tok);itoa(tok,str);write(str);delay(2*WRITE_DELAY);write(″12345678″);delay(WRITE_DELAY);write(″reAdy″);delay(2*WRITE_DELAY);write(″Good″);delay(2*WRITE_DELAY);write(″Good-1″);delay(2*WRITE_DELAY);<!--SIPO<DPn="75">--><dpn="d75"/>write(″Good-2″);delay(2*WRITE_DELAY);wite(″Error″);delay(2*WRITE_DELAY);write(″rejected″);delay(3*WRITE_DELAY);write(″BAttLo″);delay(3*WRITE_DELAY);wait_for_finger_detected();result=fpc2010Verify(template);if(!result){write(″rejected″);}display_test();#ifdef__EVALUALTION_BOARD*P7DR=*P7DR^EVAL_LED_MASK;//Toggleevaluationboardled#endif}#endif}voidpicard_application(){charstr[9];unsignedinttok=2674834;unsignedintrand;boolresult;port_init();<!--SIPO<DPn="76">--><dpn="d76"/>timer0_init();START_TIMER0;display_init();fpc2010Init();if(!battery_check()){write(″reAdy″);delay(2*WRITE_DELY);}error//1ststepcreatetemplatebattery_check();wait_for_finger_detected();result=fpc2010Enrol(template);if(!result){message(″Error″);gotoerror;}write(″Good″);delay(2*WRITE_DELAY);//2ndstepverirytemplatethe1sttimebattery_check();wait_for_finger_detected();result=fpc2010Verify(template);if(!result){message(″Error″);gotoerror;<!--SIPO<DPn="77">--><dpn="d77"/>}write(″Good-1″);delay(2*WRITE_DELAy);//3ndstepverifytemplatethe2ndtimebattery_check();wait_for_finger_detected();result=fpc2010Verify(template);if(!result){message(″Error″);gotoerror;}write(″Good-2″);delay(2*WRITE_DELAY);//Nowwehaveauseabletemplate//Thefirsttimeafingerprintcanbeverifiedsuccessfully//arandomnumberisgenerated.error_verifybattery_check();wait_for_finger_detected();result=fpc2010Verify(template);if(!result){message(″rejected″);gotoerror_verify;}//GeneraterandomnumberusingseedfromtimerSTOP_TIMER0;rand_seed(*TCNT0);rand=RAND_INT(10000000,99999999);<!--SIPO<DPn="78">--><dpn="d78"/>tok=rand;itoa(tok,str);write(str);//GeneraterandomnumbersusingSMIalgorithme//eachtimeafingerprintisrecognizedwhile(1){battery_check();wait_for_finger__detected();result=fpc2010Verify(template);if(!result){message(″rejected″);}else{tok=(unsignedint)token((double)tok);itoa(tok,str);write(str);}}}intmain(void){*BCR0=BCR0_PATTERN;//test();picard_application();}INT_HANDLER.C<!--SIPO<DPn="79">--><dpn="d79"/>/********************************************************//*Fileint_handler.c*//*PurposeIRQinterrupthandlercode*//**************************************************/#include″7092.h″/*tousewiththeHynixHMS39C7092*/externintIntCT1;externintIntCT2;/*******************************************************************IRQHandler****ThisfunctionhandlesIRQinterrupts.Inthisexample,thesemaycomefrom**Timer1orTimer2.****Thishandlersimplyclearstheinterruptandsetscorrespondingflags.**Theseflagsarethencheckedbythemainapplication.*************************************************************************/void__irqIRQ_Handler(void){unsignedstatus;status=*ISR;/*Dealwithsourceofinterrupt*/if(status&IB_TIMER1){*ISCR=IB_TIMER1;/*cleartheinterrupt*/}elseif(status&IB_TIMER2){<!--SIPO<DPn="80">--><dpn="d80"/>*ISCR=IB_TIMER2;/*cleartheinterrupt*/}}FPC2010INTERFACE.C/-----------------------------------------------//Copyright(C)2003FingerprintCardsAB.AllRightsReserved//----------------------------------------------////Theinformationcontainedhereinisconfidentialpropertyof//FingerprintCardsAB.Theusa,copying,transferordisclosureofsuch//informationisprohibitedexceptbyexpresswrittenagreementwith//FingerprintCardsAB.////----------------------------------------------//Filefpc2010interface.c////DescriptionInterfacedriverfortheFPC2010ASIC.////HardwareplafformFPC6430////----------------------------------------------#include″bpg.h″#include″typdefs.h″#include″utility.h″#include″fpc2010biomain.h″#include″fpc2010interface.h″#include″fpc2010registers.h″#include″encapsulated_alg.h″<!--SIPO<DPn="81">--><dpn="d81"/>/*********************************************************RetrievesthecontentoftheResultRAMinFPC2010.**@parambuffer-MemoryareatofillwiththeResultRAMcontent.*********************************************************/voidUploadVerResultRAMContent(u_char*buffer){intcurrent_byte;*VerResultAddrPointer=0;for(current_byte=0;current_byte<FPC2010_VER_RESULT_RAM_SIZE;current_byte++){buffer[current_byte]=*VerResultReadData;}}/*UploadVerResultRAMContent*//*********************************************************LoadsFPC2010withdatatoworkwithduringverification.**@param*templateBuffer-Memoryareaforthetemplatedata*******************************************************/voidDownloadVerData(u_char*templateBuffer){u_charFPC2010_ver_data[FPC2010_WORK_RAM_SIZE];intcurrent_byte;PreVerify(templateBuffer,FPC2010_ver_data);<!--SIPO<DPn="82">--><dpn="d82"/>*WorkRAMAddrPointer=0;for(current_byte=0;current_byte<FPC2010_WORK_RAM_SIZE;current_byte++){*WorkRAMWriteData=FPC2010_ver_data[current_byte];}}/*DownloadVerData*//*******************************************************UploadstheresultfromanenrolmentfromFPC2010.**@param*enrolResult-Memoryareatostoretheenrolmentdata.******************************************************/voidUploadEnrolResult(u_char*enrolResult){intcurrent_byte;*WorkRAMAddrPointer=0;for(current_byte=0;current_byte<FPC2010_WORK_RAM_SIZE;current_byte++){*enrolResult=*WorkRAMReadData;enrolResult++;}}/*UploadEnrolResult*/<!--SIPO<DPn="83">--><dpn="d83"/>/*******************************t***************************ClearsFPC2010interruptregister.*************************************************************/voidClearlRQReg(void){intirq_reg_tmp=0;irq_reg_tmp=*(volatileaddr8)Interrupt;//ReadIRQ_REGinordertoclearitirq_reg_tmp=*(volatileaddr8)Interrupt;}/*ClearlRQReg*//***********************************************************EnablesalltheinterruptsinFPC2010.*************************************************************/voidSetlRQMask(void){intirq_read;*InterruptMask=0×FE;//WriteIRQmaskFE=enableallirq_read=*InterruptMask;//ReadbackIRQmaskinordertoverify.}/*SetIRQMask*//************************************************************<!--SIPO<DPn="84">--><dpn="d84"/>*PerformasoftwareresetforFPC2010.******************************************************************/voidSWReset(void){intirqmask=0;irqmask=*(volatileaddr8)InterruptMask;*SwReset=1;irqmask=*(volatileaddr8)InterruptMask;}/*SWReset*//*****************************************************************Setsupparametersforthelinelinesensor.**@paramdetect-ValueforthelinesensorsDETECTregister.*@paramdrivc-ValueforthelinesensorsDRIVCregister.*@paramadcref-ValueforthelinesensorsADCREFregister.*****************************************************************/voidSetUpLineSensorStartUp(intdetect,intdrivc,intadcref){ResetLineSensor();SetUpLineSensor();SetUpLineSensorDETECT(detect);SetUpLineSensorDRIVC(drivc);SetUpLineSensorADCREF(adcref);}/*SetUpLineSensorStartUp*/<!--SIPO<DPn="85">--><dpn="d85"/>/***************************************************************Setsuptheparametersforthelinesensorinterface.****************************************************************/voidSetUpLineSensor(void){*WaitCycles=WAIT_REG_VALUE;*StartCycles=START_CYCLE_VALUE;*CloseCycles=CLOSE_CYCLE_VALUE;*ClockDevisor=CLOCK_DEVISOR;}/*SetUpLineSensor*//**************************************************************ResetthelinesensorbywritingtotheResetregister.***************************************************************/voidResetLineSensor(void){*SensorReset=1;//uncal_delay(50);//Waitforresettofinish.delay(50);//Waitforresettofinish.}/*ResetLineSensor*//*************************************************************<!--SIPO<DPn="86">--><dpn="d86"/>*Setsupthelinesensordetectvalue.**@paramvalue-Thevalueforthedetectregister.********************************************************/voidSetUpLineSensorDETECT(intvalue){*SensorParameter_LSB=(unsignedchar)value;*SensorCommand=WRITE_DETECT;PollIRQReg(IRQ_SENSOR_COMPLETE);}/*SetUpLineSensorDETECT*//******************************************************Setsupthelinesensordrive_cvalue.**@paramvalue-Thevalueforthedriv_cregister.*******************************************************/voidSetUpLineSensorDRIVC(intvalue){*SensorParameter_LSB=(unsignedchar)value;*SensorCommand=WRITE_DRIVE_C;PollIRQReg(IRQ_SENSOR_COMPLETE);}/*SetUpLineSensorDRIVC*//****************************************************<!--SIPO<DPn="87">--><dpn="d87"/>**Setsupthelinesensoradc_refvalue.**@paramvalue-Thevaluefortheadc_refregister.****************************************************************/voidSetUpLineSensorADCREF(intvalue){*SensorParameter_LSB=(unsignedchar)value;*SensorCommand=WRITE_ADC_REF;PollIRQReg(IRQ_SENSOR_COMPLETE);}/*SetUpLineSensorADCREF*//****************************************************************PollstheinterruptflagsfortheFPC2010andreturnsaftertheflag*hasbeenset.**@paramirq-Oneormoreinterruptflagstopoll(interruptmask).****************************************************************/voidPollIRQReg(unsignedcharirq){unsignedcharirq_reg_tmp;irq_reg_tmp=(unsignedchar)(irq&*(volatileaddr8)Interrupt);//WaitforIRQflagtobesetwhile(irq_reg_tmp==0){<!--SIPO<DPn="88">--><dpn="d88"/>irq_reg_tmp=(unsignedchar)(irq&*(volatileaddr8)Interrupt);}irq_reg_tmp=*(volatileaddr8)Interrupt;}/*PollIRQReg*/FPC2010BIOMAIN.C/**SmartCardpincodegeneratorwithfingerprintaccesscontrol*ControlfunctionforhardwareFPC2010withsensorFPC1030**Copyright(C)2001DELTAICDesign,AllRightsReserved.**$AuthorIbm$**$Idprint.asm,v1.122002/11/2114:29:14IbmExp$**/#include″bpg.h″#include″typdefs.h″#include″utility.h″#include″fpc2010biomain.h″#include″fpc2010interface.h″#include″encapsulated_alg.h″#include″fpc2010registers.h″/*****************************************************TurnontheMCKoutclock.StartstheFPC2010.*<!--SIPO<DPn="89">--><dpn="d89"/>*******************************************************/voidfpc2010On(void){*P9DR=*P9DR|FPC2010_RESET_MASK;//De-assertresetpin*P6MR=*P6MR&~FPC2010_CLOCK_MUX_MASK;//Setpinasclockoutput}/*fpc2010On*//********************************************************TurnofftheMCKoutclock.StopstheFPC2010.*******************************************************/voidfpc2010Off(void){*P6MR=*P6MR|FPC2010_CLOCK_MUX_MASK;//Setpinasiopin*P6DDR=*P6DDR&~FPC2010_CLOCK_MASK;//Setiopinasoutput*P6DR=*P6DR&~FPC2010_CLOCK_MASK;//Setdatalow*P9DR=*P9DR&~FPC2010_RESET_MASK;//Assertresetpin//ThisisdoneinordertosettheLVDSIOin//FPC2010inpowerdownmode.TheRESET_PIN//onlyresetsFPC2010iftheclockisactive.}/*fpc2010Off*//*********************************************************InitializestheFPC2010.Setsuptheswipesensorand*uploadsaregisterfilenecessaryforthedevice′sexecution.*<!--SIPO<DPn="90">--><dpn="d90"/>********************************************************/voidfpc2010Init(void){unsignedcharmem_cmd=0;fpc2010On();ClearlRQReg();SWReset();SetlRQMask();SetUpLineSensorStartUp(DETECT_STARTUP_VAL,DRIVC_STARTUP_VAL,ADCREF_STARTUP_VAL);ClearlRQReg();fpc2010LoadParameterFile(get_fpc2010_parameters(VERIFY_PARAMETERS));//dummywritetoFPC2010*FP_RAM_Cmd=mem_cmd;fpc2010Off();}/*fpc2010Init*//*************************************************************EnrolatemplateintoRAM.**@paramtemplateBuffer-Memoryareaforthedownloadedtempiatedata.**@retum-TRUEIfenrolmentsucceeded.*FALSEOtherwise.<!--SIPO<DPn="91">--><dpn="d91"/>*******************************************************/boolfpc2010Enrol(u_char*templateBuffer){unsignedintswipeLength;signedcharpointOffset;u_charenrolResult[FPC2010_WORK_RAM_SIZE];boolsuccess;fpc2010On();ClearlRQReg();fpc2010LoadParameterFile(get_fpc2010_parameters(ENROL_PARAMETERS));*ACHCmd=ACHCmd_ENROL;//enrolcommandtoFPC2010PollIRQReg(IRQ_ACH_COMPLETE);//waituntiluserhasfinishedswipingfingerUploadEnrolResult(enrolResult);//getenrolmentresultfromFPC2010pointOffset=*AccPointOffset;//getx-translationswipeLength=(*TopLineLSB)+(*TopLineMSB)*256;//getswipelength//createtemplatefromresultdatasuccess=Create_Template(enrolResult,templateBuffer,pointOffset,(shortint)swipeLength);fpc2010Off();returnsuccess;}/*fpc2010Enrol*/<!--SIPO<DPn="92">--><dpn="d92"/>/**********************************************************Verifyafingerprintagainstatemplate.**@paramtemplateBuffer-Pointertothetemplatememory.**@return-TRUEIfverificationsucceeded.*FALSEOtherwise.**********************************************************/boolfpc2010Verify(u_char*templateBuffer){unsignedintswipeLength;signedcharpointOffset;u_charverResult[FPC2010_VER_RESULT_RAM_SIZE];boolsuccess;fpc2010On();ClearIRQReg();fpc2010LoadParameterFile(get_fpc2010_parameters(VERIFY_PARAMETERS));DownloadVerData(templateBuffer);//downloadverificationdatatoFPC2010*ACHCmd=ACHCmd_VERIFY;//verifycommandtoFPC2010//enableFpcCounter();bysipPollIRQReg(IRQ_ACH_COMPLETE);//waituntiluserhasfinishedswipingfinger//disableFpcCounter();bysip<!--SIPO<DPn="93">--><dpn="d93"/>UploadVerResultRAMContent(verResult);//getresultdatafromFPC2010pointOffset=(signedchar)*AccPointOffset;//getx-translationswipeLength=(*TopLineLSB)+(*TopLineMSB)*256;//getswipelength//matchtemplateagainstresultdatasuccess=Match_Data(verResult,templateBuffer,pointOffset,(shortint)swipeLength);fpc2010Off();retumsuccess;}/*fpc2010Verify*//**************************************************Loadregister(parameter)filetoFPC2010.************************************************/voidfpc2010LoadParameterFile(unsignedchar*parameters){intcurrent_byte;*ParameterFilePointer=0;for(current_byte=0;current_byte<PARAMETER_FILE_LENGTH;current_byte++){*ParameterFileWrite=*(parameters+current_byte);}}/*fpc2010LoadParameterFile*/<!--SIPO<DPn="94">--><dpn="d94"/>DISPLAY.C/*Displayutilities*/#include″string.h″#include″7092.h″#include″bpg.h″#defineDISP_DELAY200//definemacroes#defineENABLE_DISP_COM*DISP_DR=*DISP_DR&~DISP_NCSSEG_MASK;//Enabledisplaycom.#defineDISABLE_DISP_COM*DISP_DR=*DISP_DR|DISP_NCSSEG_MASK;//Disabledisplaycom.externvoiddelay(intcount);externunsignedchardisp_ram[8];staticconstcharascii□={0×00,0×00,0×00,0×00,0×00,0×00,0×00,0×00,//0-70×00,0×00,0×00,0×00,0×00,0×00,0×00,0×00,//8-150×00,0×00,0×00,0×00,0×00,0×00,0×00,0×00,//16-230×00,0×00,0×00,0×00,0×00,0×00,0×00,0×00,//24-310×00,0×00,0×00,0×00,0×00,0×00,0×00,0×00,//32-390×00,0×00,0×00,0×00,0×00,0×02,0×00,0×00,//40-470×7d,0×60,0×3e,0×7a,0×63,0×5b,0×4f,0×70,//48-550×7f,0×73,0×00,0×00,0×00,0×00,0×00,0×00,//56-630×00,0×77,0×7f,0×1d,0×7d,0×1f,0×17,0×5f,//64-710×67,0×60,0×78,0×00,0×0d,0×00,0×00,0×7d,//72-790×37,0×00,0×00,0×00,0×00,0×00,0×00,0×00,//80-870×00,0×00,0×00,0×00,0×00,0×00,0×00,0×00,//88-95<!--SIPO<DPn="95">--><dpn="d95"/>0×00,0×00,0×00,0×0e,0×6e,0×3f,0×00,0×00,//96-1030×00,0×00,0×68,0×00,0×00,0×00,0×00,0×4e,//104-1110×00,0×00,0×06,0×00,0×0f,0×00,0×00,0×00,//112-1190×00,0×6b,0×00,0×00,0×00,0×00,0×00,0×00//120-127};/*reversereversestringsinplace*/voidreverse(chars□){charc;inti,j;for(i=0,j=strlen(s)-1;i<j;i++,j--){c=s[i];s[i]=s[j];s[j]=c;}}/*itoaconvertntocharactersins*/voiditoa(intn,chars□){inti,sign;if((sign=n)<0)//Recordthesignn=-n;i=0;do{//Generatedigitsinrecverseorders[i++]=(char)(n%10+′0′);//Getnextdigit}while((n/=10)>0);//Deleteit<!--SIPO<DPn="96">--><dpn="d96"/>if(sign<0)s[i++]=′-′;s[i]=′\0′;reverse(s);}voidatodisp(chars□,unsignedchar*data_ptr){unsignedinti,j;j=strlen(s);for(i=0;i<j;i++){data_ptr[i]=ascii[s[i]];}}voidSend_Disp(unsignedintdata;unsignedintlength){unsignedinti;unsignedintbit;for(i=0;i<length;i++){bit=data&0×01;//maskoutbit0if(bit){*DISP_DR=*DISP_DR|DISP_DATASEG_MASK;//Setupdata1}else{*DISP_DR=*DISP_DR&~DISP_DATASEG_MASK;//Setupdata0}delay(DISP_DELAY);<!--SIPO<DPn="97">--><dpn="d97"/>//writepulse*DISP_DR=*DISP_DR&~DISP_NWRSEG_MASK;//Neg.writeedgedelay(DISP_DELAY);*DISP_DR=*DISF_DR|DISP_NWRSEG_MASK;//Pos.wnteedgedata=data>>1;}}voidDisp_Write_Ram(unsignedchar*data_ptr){unsignedinti;unsignedchardata,temp;ENABLE_DISP_COM;//Enabledisplaycom.data=0×5Send_Disp(data,3);//send3bitcommanddata=0×0;Send_Disp(data,6);//send6bitaddressfor(i=0;i<5;i++){data=(unsignedchar)data_ptr[i];Send_Disp((unsignedint)data,8);//send8bitofdisplayramdata}for(i=0;i<3;i++){temp=(unsignedchar)data_ptr[7-i];data=(unsignedchar)(temp&0×f0);data=(unsignedchar)(data>>4);temp=(unsignedchar)(temp<<4);data=(unsignedchar)(data|(temp&0×f0));Send_Disp((unsignedint)data,8);//send8bitofdisplayramdata<!--SIPO<DPn="98">--><dpn="d98"/>}DISABLE_DISP_COM;//Disabledisplaycom.}voidDisp_Send_Command(unsignedintdata){ENABLE_DISP_COM;//EnabledisplaycomSend_Disp(data,12);//SendcommandoDISABLE_DISP_COM;//Disabledisplaycom}voidwrite(char*s){unsignedinti;for(i=0;i<DISP_RAM_SIZE;i++){//Clearshadowdisplayramdisp_ram[i]=0×00;}atodisp(s,disp_ram);//convertasciitodisplaysymbolsDisp_Write_Ram(disp_ram);//writesymbolstodisplayram}voiddisplay_init(){disp_ram=0×00;disp_ram[1]=0×00;disp_ram[2]=0×00;disp_ram[3]=0×00;disp_ram[4]=0×00;disp_ram[5]=0×00;<!--SIPO<DPn="99">--><dpn="d99"/>disp_ram[6]=0×00;disp_ram[7]=0×00;Disp_Send_Command(DISP_SYS_EN);Disp_Send_Command(DISp_BIAS_COM);Disp_Send_Command(DISP_LCD_ON);}voiddisplay_test(){unsignedintj;unsignedlonglong*disp_ram_ptr;disp_ram_ptr=(unsignedlonglong*)&disp_ram;disp_ram=0×01;disp_ram[1]=0×00;disp_ram[2]=0×00;disp_ram[3]=0×00;disp_ram[4]=0×00;disp_ram[5]=0×00;disp_ram[6]=0×00;disp_ram[7]=0×00;j=64;do{Disp_Write_Ram(disp_ram);*disp_ram_ptr=*disp_ram_ptr<<1;}while(j-);}<!--SIPO<DPn="100">--><dpn="d100"/>VECTORS.S;;;CopyrightARMLtd2001.Allrightsreserved.AREAVect,CODE,READONLY;Theseareexampleexceptionvectorsandexceptionhandlers;;WherethereisROMfixedat0×0(build_b),thesearehard-codedat0×0.;WhereROM/RAMremappingoccurs(build_c),thesearecopiedfromROMtoRAM.;ThecopyingisdoneautomaticaiiybytheClibrarycodeinside__main.;;ThisversionputsabranchtoanInterruptHandler(IRQ_Handlerinint_handler.c);initsexceptionvectortable.;*****************;ExceptionVectors;*****************;Note;LDRPCinstructionsareusedhere,thoughbranch(B)instructions;couldalsobeused,unlesstheROMisatanaddress>32MB.ENTRYLDRPC,Reset_AddrLDRPC,Undefined_AddrLDRPC,SWI_AddrLDRPC,Prefetch_AddrLDRPC,Abort_AddrNOP;ReservedvectorLDRPC,IRQ_AddrLDRPC,FIQ_Addr<!--SIPO<DPn="101">--><dpn="d101"/>;IMPORTIRQ_Handler;Inint_handler.cIMPORTReset_Handler;Ininit.sReset_AddrDCDReset_HandlerUndefined_AddrDCDUndefined_HandlerSWI_AddrDCDSWI_HandlerPrefetch_AddrDCDPrefetch_HandlerAbort_AddrDCDAbort_HandlerIRQ_AddrDCDIRQ_HandlerFIQ_AddrDCDFIQ_Handler;************************;ExceptionHandlers;************************;Thefollowingdummyhandlersdonotdoanythingusefulinthisexample.;Theyaresetuphereforcompleteness.Undefined_HandlerBUndefined_HandlerSWI_HandlerBSWI_HandlerPrefetch_HandlerBPrefetch_HandlerAbort_HandlerBAbort_HandlerIRQ_HandlerBIRQ_HandlerFIQ_HandlerBFIQ_Handler<!--SIPO<DPn="102">--><dpn="d102"/>ENDSTACK.S;;;CopyrightARMLtd2001.Allrightsreserved.AREAStacks,DATA,NOINITEXPORTtop_of_stacks;Createdummyvariableusedtolocatestacksinmemorytop_of_stacksSPACE1ENDINIT.S;;;CopyrightARMLtd2001.Allrightsreserved.;;ThismoduleperformsROM/RAMremapping(ifrequired),initializesstack;pointersandinterruptsforeachmode,andfinallybranchesto__mainin;theClibrary(whicheventuallycallsmain()).;;Onreset,theARMcorestartsupinSupervisor(SVC)mode,inARMstate,;withIRQandFIQdisabled.AREAInit,CODE,READONLY;---SetupifROM/RAMremappingrequired<!--SIPO<DPn="103">--><dpn="d103"/>;GBLLROM_RAM_REMAP;ROM_RAM_REMAPSETL{TRUE};changeto{FALSE}ifremappingnotrequired;---ensurenofunctionsthatusesemihostingSWIsarelinkedinfromtheClibrary;;IMPORT_use_no_semihosting_swi;---Standarddefinitionsofmodebitsandinterrupt(I&F)flagsinPSRsMode_USREQU0×10Mode_FIQEQU0×11Mode_IRQEQU0×12Mode_SVCEQU0×13Mode_ABTEQU0×17Mode_UNDEQU0×1BMode_SYSEQU0×1F;availableonARMArch4andlaterI_BitEQU0×80;whenIbitisset,IRQisdisabledF_BitEQU0×40;whenFbitisset,FIQisdisabled;---SystemmemorylocationsMEMCREQU0×09001010;AddressofCoreModuleControlRegister(writeonly)MEMSREQU0×0900100c;AddressofCoreModuleControlRegister(readonly)Remap_bitEQU0×01;Bit0isremapbitofCM_ctlBCR1EQU0×09000104;AddressofBusControllerregisterforCS1MEMWIDTH_bitEQU0×100;Bit8isextemalbuswidthWAITSTATES_bitEQU0×2;NumberofwaitstatesisWAITSTATES_bit+1<!--SIPO<DPn="104">--><dpn="d104"/>;---Amountofmemory(inbytes)allocatedforstacks;Len_FIQ_StackEQU8192;Len_IRQStackEQU8192;Len_ABT_StackEQU8192;Len_UND_StackEQU8192;Len_SVC_StackEQU8192;Len_USR_StackEQU8192Len_FIQ_StackEQU0Len_IRQ_StackEQU256Len_ABT_StackEQU0Len_UND_StackEQU0Len_SVC_StackEQU256Len_USR_StackEQU256;Addlengths>0forFIQ_Stack,ABT_Stack,UND_Stackifyouneedthem.;Offsetswillbeloadedasimmediatevalues.;Offsetsmustbe8bytealigned.Offset_FIQ_StackEQU0Offset_IRQ_StackEQUOffset_FIQ_Stack+Len_FIQ_StackOffset_ABT_StackEQUOffset_IRQ_Stack+Len_IRQ_StackOffset_UND_StackEQUOffset_ABT_Stack+Len_ABT_StackOffset_SVC_StackEQUOffset_UND_Stack+Len_UND_StackOffset_USR_StackEQUOffset_SVC_Stack+Len_SVC_StackENTRY<!--SIPO<DPn="105">--><dpn="d105"/>;---PerformROM/RAMremapping,ifrequiredIFDEFROM_RAM_REMAP;Onreset,analiasedcopyofROMisat0×0.;Continueexecutionfrom′real′ROMratherthanaliasedcopyLDRpc,=Instruct_2Instruct_2;RemapbysettingRemapbitoftheMEMCR/MEMSRregister;LDRr1,=MEMSR;LDRr0,[r1];ORRr0,r0,#Remap_bit;LDRr1,=MEMCR;STRr0,[r1];RAMisnowat0×0.;Theexceptionvectors(invectors.s)mustbecopiedfromROMtotheRAM;ThecopyingisdonelaterbytheClibrarycodeinside__main;SetexternalbuswidthforCS1to8-bitLDRr1,=BCR1LDRr0,[r1]ORRr0,r0,#MEMWIDTH_bitORRr0,r0,#WAITSTATES_bitSTRr0,[r1]ENDIFEXPORTReset_HandlerReset_Handler<!--SIPO<DPn="106">--><dpn="d106"/>;---Initializestackpointerregisters;EntereachmodeinturnandsetupthestackpointerIMPORTtop_of_stacks;definedinstack.sandlocatedbyscatterfileLDRr0,=top_of_stacks;MSRCPSR_c,#Mode_FIQORI_BitORF_Bit;Nointerrupts;SUBsp,r0,#Offset_FIQ_StackMSRCPSR_c,#Mode_IRQORI_BitORF_Bit;NointerruptsSUBsp,R0,#Offset_IRQ_Stack;MSRCPSR_c,#Mode_ABTORI_BitORF_Bit;Nointerrupts;SUBsp,r0,#Offset_ABT_Stack;MSRCPSR_c,#Mode_UNDORI_BitORF_Bit;Nointerrupts;SUBsp,r0,#Offset_UND_StackMSRCPSR_c,#Mode_SVCORI_BitORF_Bit;NointerruptsSUBsp,r0,#Offset_SVC_Stack---InitializecriticalIOdevices;...;---NowchangetoUsermodeandsetupUsermodestack,ifneededMSRCPSR_c,#Mode_USRORF_Bit;IRQsnowenabledSUBsp,r0,#Offset_USR_StackIMPORT_main;---NowentertheCcodeB__main;noteuseBnotBL,becauseanapplicationwillneverretumthisway<!--SIPO<DPn="107">--><dpn="d107"/>ENDHEAP.S;;;CopyrightARMLtd2001.Allrightsreserved.AREAHeap,DATA,NOINITEXPORTbottom_of_heap;Createdummyvariableusedtolocatebottomofheapbottom_of_heapSPACE1END权利要求1.用于识别特定的个人的计算机系统,该系统利用所述特定的个人的生物测定特征进行识别,包括i)至少一个设备包括-确定外表面的外壳,-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,所述生物测定传感器安装在所述外壳内并从所述外表面露出,-控制器设备,其安装在所述外壳内,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-第一通信设备,其装在所述外壳内,与所述控制器设备电气连接并受所述控制器设备控制,用于在所述设备和所述计算机系统之间建立通信联络,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述第一通信设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述第一通信设备供应电力,ii)所述计算机系统包括第一数据库以及第二通信设备,第一数据库包含所述动态二进制码转换算法,第二通信设备用于在所述计算机系统和所述设备之间建立通信联络,iii)当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并将第一二进制码从所述设备输出到计算机系统;当通过所述第二通信设备收到所述设备提供的第一二进制码时,计算机系统通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与第一二进制码匹配,则所述特定的个人的身份通过验证。2.如权利要求1所述的计算机系统,所述设备还包括装在所述外壳内并从所述外表面露出的显示器设备,所述显示器设备与所述电源设备和所述控制器设备电气连接,并由所述控制器设备控制,由所述电源设备提供电力;验证所述编码和所述第一编码一致性后,所述显示器设备显示变为字母数字的所述第一二进制码,最好是组成个人识别号码的十进制数。3.用于识别特定的个人的计算机系统,该系统利用所述特定的个人的生物测定特征进行识别,包括i)至少一个设备包括-确定外表面的外壳,-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,所述生物测定传感器安装在所述外壳内并从所述外表面露出,-控制器设备,其安装在所述外壳内,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-显示器设备,其装在所述外壳内并从所述外表面露出,所述显示设备与所述控制器设备电气连接并受所述控制器设备控制,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述显示器设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述显示器设备供应电力,所述计算机系统包括第一数据库和编码输入设备,第一数据库包含所述动态二进制码转换算法,当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并在所述显示器设备上显示变为字母数字的所述第一二进制码,最好是组成个人识别号码的十进制数,当收到通过所述编码输入设备输入的所述个人识别号码时,所述计算机系统通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与由所述个人识别号码变成的第一二进制码匹配,则所述特定的个人的身份通过验证。4.如权利要求3所述的计算机系统,所述设备还包括第一通信设备,其装在所述外壳内,与所述控制器设备电气连接并受所述控制器设备控制,用于在所述设备和所述计算机系统之间建立通信联络;所述计算机系统包括第二通信设备,其用于在计算机系统和所述设备之间建立通信联络。5.如权利要求1-4中任一权利要求所述的计算机系统,所述计算机系统还包括第二数据库,第二数据库包含通过所述动态二进制码转换算法顺序产生的二进制码序列,如果所述第一二进制码与所述第二二进制码不匹配,则所述计算机系统将所述第一二进制码与包含在所述第二数据库中的所述二进制码序列进行比较,以验证特定个人的身份。6.如权利要求1-5中任一权利要求所述的计算机系统,所述生物测定传感器设备是虹膜扫描器、血液扫描器、DNA扫描器、话音识别扫描器、面貌识别扫描器、扫描所述个人手掌的阵列扫描器、扫描一个完整手指的阵列扫描器或者最好是指纹扫描器。7.如权利要求1-6中任一权利要求所述的计算机系统,所述设备是信用卡形式的独立设备,具有符合国际标准化组织标准的信用卡尺寸,所述编码是个人识别号码。8.如权利要求1-7中任一权利要求所述的计算机系统,还包括由所述控制器设备控制的加密与解密设备,用于执行所述控制器设备与所述外部计算机系统之间在加密状态下进行的所述通讯,可采用如DES加密或其他的公知或不公知的加密钥。9.如权利要求1-8中任一权利要求所述的计算机系统,所述第一和第二通信设备是并行通信接口、串行通信接口、SPI、I2C、USB、如蓝牙、红外线或射频通讯的无线通信接口。10.在用于识别特定的个人的计算机系统中使用的设备,该系统利用所述特定的个人的生物测定特征进行识别,包括-确定外表面的外壳,-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,所述生物测定传感器安装在所述外壳内并从所述外表面露出,-控制器设备,其安装在所述外壳内,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-第一通信设备,其装在所述外壳内,与所述控制器设备电气连接并受所述控制器设备控制,用于在所述设备和所述计算机系统之间建立通信联络,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述第一通信设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述第一通信设备供应电力,-当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则所述动态二进制码转换算法使所述第一编码产生成第一二进制码,并通过所述第一通信设备将所述第一二进制码从所述设备输出到所述计算机系统。11.如权利要求10所述的设备用于如权利要求1-9中任一权利要求所述的计算机系统,并具有权利要求1-9中任一权利要求所限定的任一特征。12.在用于识别特定的个人的计算机系统中使用的设备,该系统利用所述特定的个人的生物测定特征进行识别,包括-确定外表面的外壳,-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,所述生物测定传感器安装在所述外壳内并从所述外表面露出,-控制器设备,其安装在所述外壳内,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-显示器设备,其装在所述外壳内并从所述外表面露出,所述显示设备与所述控制器设备电气连接并受所述控制器设备控制,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述显示器设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述显示器设备供应电力,-当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并在所述显示器设备上显示变为字母数字的所述第一二进制码,最好是组成个人识别号码的十进制数。13.如权利要求12所述的设备用于如权利要求1-9中任一权利要求所述的计算机系统,并具有权利要求1-9中任一权利要求所限定的任一特征。14.用于识别特定的个人的方法,该方法涉及的系统利用所述特定的个人的生物测定特征进行识别,包括i)提供至少一个设备包括-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,-控制器设备,包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-第一通信设备,其与所述控制器设备电气连接并受所述控制器设备控制,用于在所述设备和所述计算机系统之间建立通信联络,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述第一通信设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述第一通信设备供应电力,ii)所述计算机系统包括第一数据库以及第二通信设备,第一数据库包含所述动态二进制码转换算法,第二通信设备用于在所述计算机系统和所述设备之间建立通信联络,iii)方法包括-当收到所述生物测定传感器设备提供的编码时,将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则所述动态二进制码转换算法产生所述第一二进制码,并通过所述第一通信设备将所述第一二进制码从所述设备输出到所述计算机系统,-当收到通过所述第二通信设备提供的来自所述设备的所述第一二进制码时,所述计算机系统通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与所述第一二进制码匹配,则所述特定的个人的身份通过验证。15.用于识别特定的个人的方法,该方法涉及的所述系统利用所述特定的个人的生物测定特征进行识别,包括i)提供至少一个设备包括-生物测定传感器设备,根据所述特定个人的所述生物测定特征的检测产生第一编码,-控制器设备,其包括存储所述第一编码和动态二进制码转换算法的存储器,所述控制器设备与所述生物测定传感器设备电气连接,-显示设备,其与所述控制器设备电气连接,并受所述控制器设备控制,-电源设备,其与所述生物测定传感器设备、所述控制器设备以及所述第一通信设备电气连接,用于向所述生物测定传感器设备、所述控制器设备以及所述第一通信设备供应电力,ii)所述计算机系统包括第一数据库和编码输入设备,第一数据库包含所述动态二进制码转换算法,iii)方法包括-当收到所述生物测定传感器设备提供的编码时,将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并在所述显示器设备上显示变为字母数字的所述第一二进制码,最好是组成个人识别号码的十进制数,-当收到通过所述编码输入设备输入的所述个人识别号码时,通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与由所述个人识别号码变成的第一二进制码匹配,则所述特定的个人的身份通过验证。16.如权利要求14或15中任一权利要求所述的方法,所述生物测定特征由虹膜扫描器、血液扫描器、DNA扫描器、话音识别扫描器、面貌识别扫描器、扫描所述个人手掌的阵列扫描器、扫描一个完整手指的阵列扫描器或者最好是指纹扫描器分析得出。17.如权利要求14-16中任一权利要求所述的方法,还包括所述控制器设备与所述外部计算机系统之间的所述通讯的加密,可采用如DES加密或其他的公知或不公知的加密钥。全文摘要用于识别特定的个人的计算机系统,该系统利用所述特定的个人的生物测定特征进行识别,包括至少一个设备。设备包括外壳、装在所述外壳内用于产生第一编码的生物测定传感器设备以及包括存储第一编码和动态二进制码转换算法的存储器的控制器设备。计算机系统包括包含动态二进制码转换算法的第一数据库。当收到所述生物测定传感器设备提供的编码时,所述控制器设备将所述编码与保存在所述存储器的第一编码进行比较,如果比较验证了编码与第一编码之间的一致性,则由动态二进制码转换算法产生第一二进制码,并将第一二进制码从所述设备输出到计算机系统;当收到第一二进制码时,计算机系统通过所述动态二进制码转换算法产生第二二进制码,如果所述第二二进制码与第一二进制码匹配,则所述特定的个人的身份通过验证。文档编号G06F21/32GK1777854SQ200480010770公开日2006年5月24日申请日期2004年3月15日优先权日2003年3月13日发明者乌费·克里门逊,索隆·霍尔德·简森,列夫·斯拉普申请人:科沃德科技公司