我正在尝试为我通过I2C连接到Raspberry PI 3的时钟编写一个通用时钟框架驱动程序.注意:我对Linux和内核编程都很陌生.
下面的代码适用于Hello World驱动程序,我必须对设备树进行的唯一更改才能让我的驱动程序加载是添加i2c1节点的子节点(在arch/arm/boot/dts/bcm2708_common.dts中) ):
i2c1: i2c@7e804000 {
compatible = "brcm,bcm2708-i2c";
reg = <0x7e804000 0x1000>;
interrupts = <2 21>;
clocks = <&clk_core>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
myclock: clock-generator@6a {
#clock-cells = <0>;
compatible = "dbc,myclock";
reg = <0x6a>;
clock-frequency = <75000000>;
};
};
Run Code Online (Sandbox Code Playgroud)
有了这个,我现在看到我希望在dmesg中看到的printk消息.
我现在正在尝试将我的Hello World ccf驱动程序添加到Raspberry Pi上的设备树中.我不太了解设备树,无法知道添加它的位置(甚至PI是否实际支持ccf).
我尝试过的两件主要事情是:
将设备作为子项添加到bcm2708_common.dtsi中的i2c0和i2c1下.
在bcm2708_common.dtsi的clocks {}部分添加设备,然后从i2c0和i2c1的clocks属性引用我的新时钟.
据我所知,我的驱动程序永远不会被加载或使用.这是因为我没有看到我的调试消息(来自我的*_probe函数顶部的printk调用),并且在启动后我没有看到我的模块在lsmod中加载.
看看arch/arm/boot/dts/zynq-zc702.dts文件,看来电路板有一个i2cswitch(compatible ="nxp,pca9548")作为i2c0设备的子节点,以及一个i2c0子节点,并且然后是一个常见的时钟框架驱动程序("silabs,si570").我不知道Raspberry PI上相应的hw架构可能是什么(或者在哪里可以看出来)以支持I2C链中的任意新I2C设备.
PI上是否支持通用时钟框架?
如何将任意新的I2C设备添加到Raspberry PI设备树? …
我试图RelayCommand在一个方法中创建一个MVVM Light :
protected RelayCommand NavigateToViewCommand(string viewName) {
#if false
return new RelayCommand(() => {
Debug.WriteLine("It fired.");
Navigation.Navigate(ServiceLocator.Current.GetInstance<IViewLocator>().GetViewForNavigation("StudentPage2"));
});
#else
return new RelayCommand(() => {
Debug.WriteLine("It fired.");
Navigation.Navigate(ServiceLocator.Current.GetInstance<IViewLocator>().GetViewForNavigation(viewName));
});
#endif
}
Run Code Online (Sandbox Code Playgroud)
如果我将viewName参数用于执行委托中的方法RelayCommand,则不会触发.我将此命令绑定到一个按钮.当我单击按钮时,甚至Debug.WriteLine命令都不会触发(并且放置在它上面的断点不会中断).
但是,如果我viewName用一个与值中的相同的硬编码字符串替换参数viewName,则RelayCommand工作正常.
请注意,此代码(其中未在按钮中使用该命令)执行时没有问题:
void Test() {
Command1.Execute(null);
Command2("David").Execute(null);
}
RelayCommand Command1 { get { return new RelayCommand(() => Debug.WriteLine("cmd1 executed.")); } }
RelayCommand Command2(string msg) { return new RelayCommand(() => Debug.WriteLine("cmd2 executed: " + msg)); …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Windows Store应用程序,我想使用MVVM,Unity和IoC.我正在努力创建包装Model对象的ViewModel.其他各种帖子都提出了类似的问题,但我认为这是一个略有不同的看法.
我正在尝试创建一个ViewModel工厂服务,我可以将其注入到我的ViewModel中.该工厂的界面可能如下所示:
public interface IViewModelFactoryService {
TViewModel Create<TViewModel, TModel>(TModel domainObject)
where TViewModel : ViewModelBase
where TModel : DomainObject;
}
Run Code Online (Sandbox Code Playgroud)
问题是我试图将模型对象传递给ViewModel构造函数并将服务作为附加参数注入.我也试图遵循工厂不应该引用IoC容器的原则,因此在工厂内使用container.Resolve不是一种选择.
使问题复杂化的是,不同的ViewModel当然可以要求不同的服务.我相信解决方案可能涉及使用InjectionFactory(一个Unity对象,它允许您为注册类型配置工厂),但我似乎无法让所有部分都适合.
以下是此工厂需要创建的一些ViewModel构造函数的外观:
FooViewModel(Foo model)
BarViewModel(Bar model, IViewModelFactoryService factory)
BazViewModel(Baz model, IViewModelFactoryService factory, IRepository repository)
Run Code Online (Sandbox Code Playgroud)
下面是使用Unity的InjectionFactory为其中两个ViewModel类创建工厂的示例:
container.RegisterType<Func<Bar, BarViewModel>>(new InjectionFactory(
c => new Func<Bar, BarViewModel>(
bar => new BarViewModel(bar,
c.Resolve<IViewModelFactoryService>()))))
container.RegisterType<Func<Baz, BazViewModel>>(new InjectionFactory(
c => new Func<Baz, BazViewModel>(
baz => new BazViewModel(baz,
c.Resolve<IViewModelFactoryService>(),
c.Resolve<IRepository>()))))
Run Code Online (Sandbox Code Playgroud)
一旦这些工厂注册了容器,就可以使用以下代码:
barFactory = container.Resolve<Func<Bar, BarViewModel>>();
barViewModel = barFactory(myBar);
bazFactory = container.Resolve<Func<Baz, BazViewModel>>();
bazViewModel = bazFactory(myBaz);
Run Code Online (Sandbox Code Playgroud)
当然,我的最终目标是做到以下几点:
viewModelFactory …Run Code Online (Sandbox Code Playgroud) dependency-injection inversion-of-control unity-container mvvm