代码拉取完成,页面将自动刷新
(*
说明:全志A20的地址映射封装类。
单例,请勿在程序中使用。
作者:tjCFeng
邮箱:tjCFeng@163.com
更新日期:2014.12.06
*)
unit A20;
{$mode objfpc}{$H+}
interface
uses Unix, BaseUnix, SysUtils;
type
TGROUP1_REG = ^LongWord;
TGROUP2_REG = array [0..1] of ^LongWord;
TGROUP4_REG = array [0..3] of ^LongWord;
TGROUP5_REG = array [0..4] of ^LongWord;
TGROUP6_REG = array [0..5] of ^LongWord;
TGROUP16_REG = array [0..15] of ^LongWord;
type
TA20 = class
private
class var FInstance: TA20;
class function GetInstance: TA20; static;
public
class procedure Release;
class property Instance: TA20 read GetInstance;
private
FhMEM: Integer;
constructor Create;
destructor Destroy; override;
public
function GetMMap(BaseAddr: LongWord): PLongWord;
function BaseOffset(BaseAddr: LongWord): LongWord;
procedure FreeMMap(MMapAddr: PLongWord);
end;
implementation
const
PAGE_SIZE = 4096;
BLOCK_SIZE = 4096;
class function TA20.GetInstance: TA20;
begin
if FInstance = nil then FInstance:= TA20.Create;
Result:= FInstance;
end;
class procedure TA20.Release;
begin
FreeAndNil(FInstance);
end;
constructor TA20.Create;
begin
inherited Create;
FhMEM:= fpopen('/dev/mem', O_RdWr);
if (FhMEM < 0) then Exit;
end;
destructor TA20.Destroy;
begin
fpclose(FhMEM);
inherited Destroy;
end;
function TA20.GetMMap(BaseAddr: LongWord): PLongWord;
var MEM: LongWord;
begin
MEM:= (BaseAddr and $FFFFF000) div PAGE_SIZE;
Result:= fpMmap(nil, PAGE_SIZE, PROT_READ or PROT_WRITE, MAP_SHARED, FhMem, MEM);
end;
function TA20.BaseOffset(BaseAddr: LongWord): LongWord;
begin
Result:= (BaseAddr and $00000FFF);
end;
procedure TA20.FreeMMap(MMapAddr: PLongWord);
begin
if (MMapAddr <> nil) then fpMUnmap(MMapAddr, PAGE_SIZE);
end;
finalization
TA20.Instance.Release;
end.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。